主题:485 共有44963人关注过本帖 |
---|
swy |
1楼 |
485 Post By:2004-8-11 13:08:00 [只看该作者]
我正在试验RS485驱动,给我的DEMO发送接收用的都是CHAR,我对BC不熟,我的应用发送接受全部是十六进制BYTE,能否给一个PutOutputData和GetInputData前后转换成十六进制BYTE的DEMO,(LCD显示时仍然用CHAR,我的是ETR186)。谢谢!
|
|
单帖管理 | 引用 | 回复 |
swy |
2楼 |
Post By:2004-8-11 13:10:00 [只看该作者]
或者更过分一点,您帮我做一个发送6个BYTE,下面的设备自动回送22个BYTE的DEMO?
|
|
单帖管理 | 引用 | 回复 |
zhl |
3楼 |
Post By:2004-8-11 13:33:00 [只看该作者]
char和16进制并没有冲突啊,只是显示的方式不同而已,其实质是一样的。char定义的各个字符也可直接按16进制定义,如:
char str[10]; str[0] = 0x10; |
|
单帖管理 | 引用 | 回复 |
swy |
4楼 |
Post By:2004-8-11 14:22:00 [只看该作者]
RS485应用中,发送前有PutOutputData,然后StartSend,可以保证一帧数据一次性发送下去,但接收时只有一个GetInputData吗?这样每次只接收一个字节,如何保证把所有的数据都接收完整呢?有没有一个接收控制函数?
|
|
单帖管理 | 引用 | 回复 |
zhl |
5楼 |
Post By:2004-8-11 14:38:00 [只看该作者]
用GetInputData()检查,如果该函数返回-1,表示接受BUF中已没有数据。作为RS485 通讯,一个完整数据包是由用户自己定义。你可根据具体使用情况利用GetInputData()自己再封装一个接收函数。
|
|
单帖管理 | 引用 | 回复 |
swy |
6楼 |
Post By:2004-8-11 15:35:00 [只看该作者]
实际上这种方法不可靠,我需要接受的完整数据包为22个BYTE,接收时有时20B,有时24B,也出现过22B。有什么好法子?
|
|
单帖管理 | 引用 | 回复 |
zhl |
7楼 |
Post By:2004-8-11 15:45:00 [只看该作者]
可选择长度作为整包数据的判断条件。
|
|
单帖管理 | 引用 | 回复 |
swy |
8楼 |
Post By:2004-8-11 16:27:00 [只看该作者]
哎,你好象没有时间仔细考虑我的问题。我固然可以用长度判断一个好的完整数据包,但如果一次接收到22B,下一次又接收到24B或其他长度,全部丢弃,这样对通讯的影响也太大了。你这个GetInputData有速度的保证吗?能保证把串口数据全部接收完,或者会不会串口数据还没完,函数就返回了-1,使数据不完整?
|
|
单帖管理 | 引用 | 回复 |
zhl |
9楼 |
Post By:2004-8-11 17:01:00 [只看该作者]
作为485通讯,应用数据一般都是整包发送的,如果在一定的时间范围内,只收到22个,当然不能算是整包数据了。数据传输的速度只和波特率有关,数据的收发由中断完成的,由中断服务程序执行将接收到数据放入缓冲区,应用程序用GetInputData( )检查接收缓冲区是否有数。
|
|
单帖管理 | 引用 | 回复 |
x10 |
10楼 |
Post By:2004-8-11 17:11:00 [只看该作者]
在RS485的应用中,用户需要定义数据帧格式,格式中应包括让接收程序能够判断的数据特征,如第一字节为地址码,第二个字节代表本帧的长度;采用CRC校验(PPP方式)等等。在帧格式的定义方面,最好参考modbus协议的方式。由于485是基于字节的,作为我们提供的驱动程序API函数GetInputData()只是从中断buffer中取出可能的一个字节,如何组成数据帧是用户需要编写的链路层(link)程序。相比串口收发一个字节的时间来说,GetInputData()的执行时间是很快的,因此循环执行GetInputData()函数,一般不会连续读到数据,而会返回-1,这是正常的。
|
|
单帖管理 | 引用 | 回复 |