c++builder中,使用MSComm做的串口通信,如何动态的确定Sleep的时间
c++builder中,使用MSComm做的串口通信,怎么动态的确定Sleep的时间我从下位机接收数据,但是并不能确定数据
c++builder中,使用MSComm做的串口通信,怎么动态的确定Sleep的时间 我从下位机接收数据,但是并不能确定数据量的多少, 我实现的方法是在一个按钮事件里面对下位机发送数据,然后Sleep(),一段时间 然后就开始接收数据, 可能问题是应该Sleep多久呢? VB.NET里面可以用这个方法接收到长度的字节,然后判断Sleep的时间,c++builder有什么方法呢?
MSComm1.ReadTimeout = 300 Try tml = MSComm1.ReadByte() '读的第一个字节是5A Catch ex As Exception ToolStripStatusLabel1.Text = "数据同步失败" MessageBox.Show("数据同步失败!", "全自动SF6密度继电器校验仪配套工具软件") Exit Sub End Try jls = MSComm1.ReadByte() '读的第二个字节是总的记录数 If jls = 0 Then '表示记录数为0 ToolStripStatusLabel1.Text = "无数据" MessageBox.Show("无数据!", "全自动SF6密度继电器校验仪配套工具软件") Exit Sub End If[解决办法] 这个好像不能用一个硬性的时间来处理吧?没有人能保证这个段时间数据就一定能接收完整
以前我们和硬件厂商通信的时候 会有一个报文格式的
比如从什么字符开始 到什么字符结束 才算一次完整的接收 当然可能还有很多校验什么的
用sleep来等待数据的方法 我觉得不保险
[解决办法] 引用: 这个好像不能用一个硬性的时间来处理吧?没有人能保证这个段时间数据就一定能接收完整 以前我们和硬件厂商通信的时候 会有一个报文格式的 比如从什么字符开始 到什么字符结束 才算一次完整的接收 当然可能还有很多校验什么的 用sleep来等待数据的方法 我觉得不保险 我那通信协议上有数据总的长度,前提是我在接收数据之前是获取不到这个长度的,如果开始接收了,那么缓冲区就又被清空了。下位机传送过来的一组数据的第二位就是这租数据的组数。
ovRecvBuf=MSComm1->Input;
如果像你说的,我怎么才能获取停止位?
怎么在接收缓冲区数据前,把这些内容获取到。这样就可以根据长度,设定线程等待时间
[解决办法] 引用: 我那通信协议上有数据总的长度,前提是我在接收数据之前是获取不到这个长度的,如果开始接收了,那么缓冲区就又被清空了。 缓冲区并不是一接收到数据就清空的,这个要分情况。
我个人觉得只有接收到的数据中包含的起始位才代表这是一次新的数据传送,这个时候才需要清空缓冲区,否则的话就一直将接收到的内容写入缓冲区直到出现结束标记,然后再分析数据看数据是否是正确的
[解决办法] 引用: 引用: 我那通信协议上有数据总的长度,前提是我在接收数据之前是获取不到这个长度的,如果开始接收了,那么缓冲区就又被清空了。 缓冲区并不是一接收到数据就清空的,这个要分情况。 我个人觉得只有接收到的数据中包含的起始位才代表这是一次新的数据传送,这个时候才需要清空缓冲区,否则的话就一直将接收到的内容写入缓冲区直到出现结束标记,然后再分析数据看数据是否是正确的 那个时间怎么设置?
[解决办法] 根据我的经验:
1.大厂的设备,通常会列出其发送数据的字间隔时间和字符串超时时间。比如其发送字符串指令时,单个字符间隔不超过5ms,响应时间不超过50ms。
2.对于三类厂家的产品没有明确说明,但是我见过最差的字符间隔也没有超过50ms,超时响应时间也没有超过200ms的
3.对于混合多种设备的,只要将超时设置200ms基本都能应付,但是直接设置mscomm组件不会有什么明显的变换,你需要将接收到的字符串组合起来。
我的建议:
1.使用mscomm组件的话,只需要将串口设置好,不要修改其接收机制和超时机制数据
2.简单的处理的话,可采用这种结构:1发送指令-》2开始等待并计时-》3MSComm接收数据,计算时间,不超过超时时间表示数据没有发送完成,重新计时并等待,直到等待超时后读取MSCOMM数据,该数据基本完整-》4按照设备协议分析数据
3.如果通信的设备都有比较完整的封包协议,那更简单,直接判断结束符即可,在超时时间内么有出现结束符即失败