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

问题描述

现通过串口接收压力传感器的压力数据,该传感器发送的数据格式为“数据+回车(/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()自动给你按行断开

时间: 2024-08-01 05:39:10

【通过串口接收字符串信息并解析处理】的相关文章

qt-QT第三串口接收数据后对数据进行解析

问题描述 QT第三串口接收数据后对数据进行解析 运用第三方串口类进行接收数据后 将数据存在temp中 ,然后再对temp进行解析判断进行不同的操作,但在编译时候会报错,如何解决? 解决方案 temp=='A'改成temp==""A""

mfc串口数据解析-如何从串口接收一段16进制数据中 读取需要的数据

问题描述 如何从串口接收一段16进制数据中 读取需要的数据 串口接收到的16进制数据: 53 d4 ac 4e d4 ac 2d 30 30 30 b4 2e 36 b2 8d 0a 53 d4 ac 4e d4 ac 2d 30 30 30 b4 2e 36 b2 8d 0a 53 d4 ac 4e d4 ac 2d 30 30 30 b4 2e 36 b2 8d 0a . . . 串口接收到的ASCII数据: ? k ? ? ? ? s ? ? k u ? ? ? k ? ? ? ? s ?

如何清空上一个串口接收的数据

问题描述 如何清空上一个串口接收的数据 源码测试OK了,但连续读取串口数据时是叠加的数据,我想单独数据,请版主给个建议哦,新手提问,谢谢! 解决方案 根据你的代码,接收数据的部分,直接释放内存重新写入即可 解决方案二: 串口缓冲区的内容不是应用程序可以管理到的.只有每次读的时候才会清空.你要不发生/少发生两个包叠加的情况,一个是及时收数据,另一个是改变你的数据解析策略. 解决方案三: 你的串口信息肯定是用数组或者什么来存储的吧,每读一次,操作完之后或者读之前清空,然后再读再操作就OK

数据显示-如何将串口接收到的数据返回给主线程并显示在编辑框中?

问题描述 如何将串口接收到的数据返回给主线程并显示在编辑框中? 小弟用的是serialPort,MFC,怎么才能把串口接收到的数据返回给主线程显示在编辑框中?求大侠帮助! void CRBAS_ODBCView::OnButtonSurveyStart() { /**************发数据*********************************/ SerialPort^ _serialPort = gcnew SerialPort("COM3", 38400, Par

C#如何用一个串口接收两个以上变量的数据

问题描述 ]刚开始学C#没多久,想用串口接收两个变量的数据分别显示在两个textBox里.比如温度和湿度的数据.单独传输一个我会写,但不知道两个的该怎么写,请赐教,谢谢. 解决方案 解决方案二:用serialport这个组件,然后在DataReceived事件里面接收数据,事件里面bytestoread读取长度,然后read事件读数据,接收到一帧完整数据后解析出来,放到你的控件里面就行了解决方案三:1.串口通讯,需要先设置串口的基本配置参数如com口,波特率.奇偶校验位等.2.和数据发送方,核对

vc-VC++ 串口接收到大量数据 EDIT控件刷新速度跟不上

问题描述 VC++ 串口接收到大量数据 EDIT控件刷新速度跟不上 当串口接收到大量的数据的时候,EDIT控件做为显示数据,但是EDIT的刷新速度跟不上,在串口停止发送后好长时间,,EDIT的数据才能显示完成 波特率是115200的,有什么办法把刷新速度提上去吗? 解决方案 你要用异步,接收到后,不要处理,先放到内存保留,后台开一个线程,逐条处理,处理完一条就通知界面显示 解决方案二: 可以放在字符串变量中,然后每收到多少数据再更新一次界面. 解决方案三: 收发数据用一个单独的线程,主线程只处理

缓存-将串口接收的数据实时刷新在Edit控件上,问题在于如何将BYTE数组转成CString

问题描述 将串口接收的数据实时刷新在Edit控件上,问题在于如何将BYTE数组转成CString 想请问串口接收数据到一个缓存中(BYTE或PBYTE)吧,但是因为输出到Edit控件中就必须先转成CString(看到EDit的成员函数都是操作CString的),即问题在于如何将BYTE数组转成CString,网上查了一下有限个数的数组可以依次Format到CString,但因为现在是大量的数据,所以这个问题如何解决?还有Edit控件显示接收到的数据,肯定不能是"00010203".而最

如何关闭Form2,保留Form1, 以及串口接收数据的判断

问题描述 本人菜鸟.自学C#.现在遇到两个问题,第一个问题.在form1中,有个按钮,点击之后弹出已经做好的固定的界面form2.比如说当form2打开5秒之后,需要关掉Form2.不知道该如何关闭,因为总是提示使用了未引用的对象.privatevoidbtnStartSend_Click(objectsender,EventArgse)//按下按钮{FormForm2=newForm2();//新窗口Form2.ShowDialog();//显示新窗口,可以正常显示}private5s时间到{

30路串口接收数据,开始每一个串口已经绑定串口事件,那接收端怎么用一个Datarecived事件区分哪个串口的啊

问题描述 30路串口接收数据,开始每一个串口已经绑定串口事件,另外定义了一个类用来处理接收到的串口数据.程序启动时new了30个串口数据处理类的对象.问题:1)那接收端怎么用一个Datarecived事件区分哪个串口的啊?2)每个串口都绑定接收事件,这种情况下是不是相当于在程序开始就已经给每一个串口开辟了自己的内存数据处理空间,在开始阶段就实现了每一个串口的分流形式.因此接收时,每个口只是处理自己的,跟其他口的处理过程间无任何关系,完全独立? 解决方案 解决方案二:在线等,希望哥哥姐姐们指点迷津