主题:485

  共有31201人关注过本帖    
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,这是正常的。

  单帖管理 | 引用 | 回复 回到顶部

返回首页

485

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: