描述:
我用MSCOMM写了一个读单片机串口的小程序并要对其得到的实时数据进行处理,但得到的实时数据的长度不一样,有时是25位,有时是32位,但每次得到的数据只有前20位是有用的,我
如果把它出始为m_ctrlMSComm.SetRThreshold(25),程序一遇到32位长度的数据就出问题,因为它会把缓冲区中剩下的7位转到下一条数据,这样一来,我如果再取数据的前20位,它就包括了刚才的那7位没有效的数据,不知各位高人有何高见?请指教 !
解决方案1:
我也遇到过这个问题 仪表不断发送数据过来(重量)每次38个 两次间隔时间 0.7ms
打开串口时数据可能已经正在发送 所以收到的不一定是从开始字符开始的。即使
先打开串口 后仪表再打开 也有可能受到干扰导致数据丢失 。如果数据可以舍弃的话
可以设置 76个字符触发一次中断 在这76个字符中肯定有一个完整的一楨数据。缺点是
实时性不好
设置一个缓冲区吧。
一个线程就只管读,读多少不要紧,只要把读到的数据放缓冲区就可以,另外再起一个线程检查缓冲区中的数据是否有完整的一个数据帧,有的话就处理掉它,并且空出空间。
如果你的数据没有任何格式,那就是协议设计的问题了,跟头商量一下,看看是否可以改改。
采用每个字节都接受的办法,程序中判断结束,如果一次数据处理完毕,就再接收一次COM BUFFER,来清空缓冲区,为下一次处理做准备。
解决方案4: 首先你的意思是不是说要接收25个字节或32个字节,而不是你说的25位,处理只处理前20个字节。
对于你这个问题,有很多细节未解释清楚,分两种情况:
一是计算机主动去读数据:你读单片机的数据,肯定会发送一个命令请求数据,然后单片机返回数据(主从式),对于这种情况你每次发送读取命令前,首先将接收缓冲区清空,每次读数据只读20个字节,余下的5个或12个字节等到下次发送读取命令前将他从接收缓冲区清除。
二是计算机是被动接收,而单片机以固定的间隔主动发送数据,这种情况下根据间隔时间采取相应办法处理,你可采用串口超时(应该小于发送间隔)控制,而将最大接收数据设置为32字节,这样每次读出来要么是32字节,要么是25字节(此时要超时),不是这两种情况就表示通讯出错了,这样一般就可以解决了,但这样不是很可靠,实际上最好在数据包中加上同步识别字节。
一次全部从缓冲区读出来,只处理前20个就是了。只要确保每次有新数据来之前缓冲区是空的就行了。
解决方案6:设置COM事件,没来一次数据,读一次,数据缓冲区开为40,每读一次,处理前面的20字节。就好了
解决方案7:SetRThreshold(1);//设置为1,已有接受的数据就可以触发事件,不要认为这里设置为1,到时候接收的时候就一定为1个.