回 帖 发 新 帖 刷新版面

主题:还是串口,有格式不定长字符串的收发?

引用:

不定长格式数据的接收
对于不定长数据接收最好的方法是制定通讯协议,比如定义开始字符和结束字符。由于单片机系统通讯一般不太复杂,没必要去制定一套象通用计算机间通讯的协议,而根据单片机系统的大小和性能要求制定通讯协议。实际上为便于交流、维护以及一致性,可制定一套可伸缩的通讯协议。定义了开始字符和结束字符就容易实现不定长格式数据通讯,但在实际通讯编程还是容易出现一些比较隐蔽的通讯错误。下面就常用方法分别进行分析。
A、定时器轮循法。
假定每个轮循期数据接收完毕,并在每个轮循期处理数据,由于有开始字符和结束字符很容易确定接收数据的完整性。好象合理设定轮循时间值就万无一失了,但被动接收数据时无论如何也找不合适的轮循时间值,因为启动定时器和数据到来基本不同步,这就会出现一次发送的数据被分在两个轮循期接收,所以被动接收数据时不能假定每个轮循期数据接收完毕。在接收到结束字符后才确定一次数据接收完毕就可解决此问题。
B、OnComm事件法。
方法和定时器轮循法基本相同,因为每次OnCommg事件也只能接收到一部分数据。在VB的在线帮助中这样注解“设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。”。但实际上OnComm事件并不是每收到一个字符便触发一次 OnComm 事件。OnComm事件是在缓冲区收到几个甚至几十个字节数据后才被触发的。版主认为这是WINDOWS多任务使操作系统不能实时响应造成的。如果要在每次OnComm事件接收一个字符似乎可设INPUTLEN属性为1,但实际行不通。VB在线帮助中“有该属性在从输出格式为定长数据的机器读取数据时非常有用”的注解,好象在说对定长字符有效,但版主发现INPUTLEN设为16,接收16个字符定长数据时却被当作两次接收了,一次12个,一次4个。建议在OnComm事件中接收数据要定义通讯协议并检测数据的完整性。 对于不定长格式数据的接收程序员更喜欢定时器轮循法,也许OnComm事件不好控制吧。
对于不定长数据的接收,最佳方法可能是在OnComm事件中启动定时器轮循接收,并同时停止OnComm事件的触发,接收完毕后或超时开启OnComm事件。


我用OnComm事件遇到了同样的问题,但是不明白论询法怎么实现,有哪位帮忙给讲一下好吗?谢谢。

回复列表 (共5个回复)

沙发

我想这样,但是还没有试过:
发送每组数据的时候加上2秒的时间间隔,然后在OnComm事件中检测这个间隔,检测的时候读出缓冲区中所有的字符,清空缓冲区,不知道行不行。

板凳

但版主发现INPUTLEN设为16,接收16个字符定长数据时却被当作两次接收了,一次12个,一次4个

3 楼

还是定长好啊!我把不定长的变成定长处理了。

4 楼

格式不定长的话  总有规律可循吧  
一般通过 第一个字节的值来判定  
如果是完全没有规律的  我就不知道了 
串口都是通信上用的  肯定是有通信协议的 完全没有规律不太可能吧

5 楼

我有个办法(且是采用事件驱动法),但正在试,试好再与大家交流吧,但正如楼上所说,通讯(字符)必须要有规律

我来回复

您尚未登录,请登录后再回复。点此登录或注册