【通过串口接收字符串信息并解析处理】

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

111,098

社区成员

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

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

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