问题描述
现通过串口接收压力传感器的压力数据,该传感器发送的数据格式为“数据+回车(/r/n)”如95684/r/n,发送方式为字符串。数据的范围从0到150000。请问对于这样的无帧头、帧尾、校验且数据位长度不一定的情况该如何解析?
解决方案
解决方案二:
以rn作为判断标志。遇到rn就把缓冲区中前面的值取出来。
解决方案三:
这个先看一下发送方的协议,是否会"粘包"串口通信,比如设置波特率为9600,那么每秒1200字节,每字节大约1ms如果超过2ms(或设置大一点,比如100ms)仍然没有接到下一个字节,则认为是一条新的数据而如果发送方没有任何间隔的就是不断发送那么你只能先将收到的字节放到队列里,然后自己解析到哪里算一条,然后把数据从队列里移除.
解决方案四:
直接套个StreamReader上去,试试,然后ReadLine
解决方案五:
引用2楼Z65443344的回复:
这个先看一下发送方的协议,是否会"粘包"串口通信,比如设置波特率为9600,那么每秒1200字节,每字节大约1ms如果超过2ms(或设置大一点,比如100ms)仍然没有接到下一个字节,则认为是一条新的数据而如果发送方没有任何间隔的就是不断发送那么你只能先将收到的字节放到队列里,然后自己解析到哪里算一条,然后把数据从队列里移除.
现在发送方每隔0.25秒发送一次数据,波特率确实为9600.现在我定义了一个全局变量Stringbuffer,在串口接收函数中进行这样的操作:buffer+=serialPort.ReadExiting();通过委托调用另外一个函数,函数主要步骤如下,目的是取出P值。请帮我看看这样写有没有问题?doublep=0;intindex=text.IndexOf("rn");stringnewBuffer="";p=Convert.ToDouble(text.Remove(index));newBuffer=text.Remove(0,index+1);buffer=newBuffer;
解决方案六:
引用1楼caozhy的回复:
以rn作为判断标志。遇到rn就把缓冲区中前面的值取出来。
现在我定义了一个全局变量Stringbuffer,在串口接收函数中进行这样的操作:buffer+=serialPort.ReadExiting();通过委托调用另外一个函数,函数主要步骤如下,目的是取出P值。请帮我看看这样写有没有问题?doublep=0;intindex=text.IndexOf("rn");stringnewBuffer="";p=Convert.ToDouble(text.Remove(index));newBuffer=text.Remove(0,index+1);buffer=newBuffer;
解决方案七:
引用3楼WM_JAWIN的回复:
直接套个StreamReader上去,试试,然后ReadLine
能不能说得清楚一点?我不是很明白,谢谢!
解决方案八:
如果你不能保证一次只读到一条数据最好是先split('r','n')将数据拆分然后循环数组处理每条数据否则仅仅remove掉rn,数据可能是错误的
解决方案九:
还有,CPU处理这种东西很快,没必要另用委托,直接处理就好,否则可能还会出现线程间访问同一变量造成的问题.
解决方案十:
引用7楼Z65443344的回复:
如果你不能保证一次只读到一条数据最好是先split('r','n')将数据拆分然后循环数组处理每条数据否则仅仅remove掉rn,数据可能是错误的
您说的这种发放不是很理解,能不能给个简单的代码。关于为什么用委托,是因为这里涉及到UI的更新
解决方案十一:
求大神指点指点,感激不尽
解决方案十二:
直接通过rn来判断就可以了,从串口中读取到数据后,放到数据区中,根据rn判断是否是符合规则的一包数据。原理其实跟你用CRC校验是一样的。只是这样做会有误判。
解决方案十三:
引用11楼slmyucan的回复:
直接通过rn来判断就可以了,从串口中读取到数据后,放到数据区中,根据rn判断是否是符合规则的一包数据。原理其实跟你用CRC校验是一样的。只是这样做会有误判。
那你帮我看看我上面这样写的代码有没有问题?
解决方案十四:
varreader=newStreamReader(SerialPort.BaseStream);reader.ReadLine()自动给你按行断开