485通讯缓冲区如何创建?

cnwolfs 2012-06-15 10:48:23
485通过232接电脑主机,从站最多允许到254台,每个从站均有可能发送数据到电脑主机,然后电脑主机进行应答。从站发过来的数据有源地址,电脑主机程序可以根据源地址识别具体是哪个从站过来的数据。对这方面不熟的,建议先看看485通讯的机制。
现在问题来了,在电脑主机中的接收程序收到第一字节的数据后,System.IO.Ports.SerialPort就产生了一个事件,由于无法判定从站具体数据包长度,因此主机只能做一个固定的延时,然后就读取缓冲区数据,因而,有可能一次性没有把从站的数据包读完,也就是从站的一个数据包,在主机中可能会被识别为2个数据包,而第二个数据包是没有源地址的。请问如何建立缓冲机制?要求能够不把不同从站的数据混在一起的。

感觉好像无所适从,因为过程中数据是有可能丢失的,例如硬件故障,在485的发送机制来说,只要从站能够进入发送状态,发送数据是没问题的,从站会把数据通道的占用一直到一个完整的数据包发送结束才会释放控制权。


...全文
2566 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnwolfs 2012-07-16
  • 打赏
  • 举报
回复
楼上的,我是说2楼给的那个程序代码不行。至少来说,没考虑到超时的问题。

我设定的架构是这样的,
1、接收程序,在没满一个数据包的前提下,建立缓存机制,在后面的数据包到来的时候,判断前面的数据是否已经超出了超时时间,如果是,则抛弃前面的数据。如果不是,则判断后面的数据包是否有报文头,如果有报文头,则抛弃前面的数据。组成一个完整的数据包的时候,放入队列,由队列处理。之所以这么做,原因是在485的情况下,一个串口最多有可能是255个终端。
2、队列程序根据队列情况处理,处理结果反馈给485通讯的发送程序,给予终端应答报文。

babydog01 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
SerialPort.DataReceived之“管收不管埋”---这个正是你需要的解决方案
[/Quote]
我同意这个观点。

我们一般情况都用控件,不必考虑具体的如何打包、排队,只需考虑如果接收和发送数据,不必考虑数据传送环节。

通常上位机有两种通讯方式,主动式,被动式。主动式就是上位机没有接收到确认信息会不停地循环发送数据,直到接收到确认信息,才会删除该信息。被动式,就是主机给上位机发送一条命令,上位机才会向主机发送数据。
cnwolfs 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
SerialPort.DataReceived之“管收不管埋”---这个正是你需要的解决方案
[/Quote]


这个写的也是不行的。

其实,在串口通讯中,都有一个超时概念,一般会把超时放在2秒,必须把超时的数据包毫不吝啬地丢掉。
因此必须创建一个类似堆栈的数据缓冲区,同时记录接收时间,把超时的数据包直接丢掉。

结贴吧

顺便说下。485和232都是通过串口通讯。232就是串口。
fsstolw 2012-06-16
  • 打赏
  • 举报
回复
我遇到的情况通常是这样的,看能不能供你参考:
子站的通讯协议中定义一个截止位和通讯长度,比如子站发送的数据中,有一个字节表示后面的数据串长度有多少字节,另外在最后跟着一个截止位,表示发送结束。这样的话,主站在接收时,不管接收几次,都预先知道子站要发送的数据长度了。
showlie 2012-06-16
  • 打赏
  • 举报
回复
SerialPort.DataReceived之“管收不管埋”---这个正是你需要的解决方案
rayyu1989 2012-06-16
  • 打赏
  • 举报
回复
弱弱的问下 485 和232 都代表什么 求普及

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧