C# 串口接收数据如何提取?

林先森168 2016-07-26 03:41:49
C# 串口接收数据
首先,设置好其串口的串口号、波特率等,给串口发了16进制的指令的,采用C# SerialPort类下的DataReceived属性接收串口返回的数据,具体使用如何:
sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);

这里,能够实现实时接收其传回的数据,能够在textbox.text上进行实时显示

那么,我的问题就是如何提取textbox中的数据,因为我发送的指令,在传回的数据前4位是相同,我这里采用的对字符串分割提取方法,只是提取的数据缓慢,收的数据老是覆盖掉(可以这样理解,收的太快,我的提的太慢,达不到我想要的实时需要提取)

可能我描述的不是特别清晰,所以希望大神给我指引一下,谢谢
...全文
835 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2016-07-29
  • 打赏
  • 举报
回复
不要放在文本框,直接用委托回调你需要获取数据的代码
秋的红果实 2016-07-28
  • 打赏
  • 举报
回复
这样处理,尽管接收、取出速度有差异,没能及时处理的,就暂存到队列里了 注意:出队q.Dequeue(); 是从对头取出一个元素,然后删除之,这个Queue自身会处理,不用你管
秋的红果实 2016-07-28
  • 打赏
  • 举报
回复
这中场合,要用队列,就是数据结构里队列,先进先出,C#专门有这个类Queue

Queue<string> q = new Queue<string>();
q.Enqueue(从串口接收的字符串); //从尾部入队
if(q.Count>0)
{
    string output= q.Dequeue(); //从头部取出
    //其他操作
}

wangyongchao880622 2016-07-28
  • 打赏
  • 举报
回复
先处理后显示。
花开花折 2016-07-27
  • 打赏
  • 举报
回复
1:你可以将每次收到的数据添加到List中,就不会覆盖掉了啊 2:串口其实不快的,每次事件触发时,将缓冲区中数据全部读完,估计你每次只是读取了部分数据,才导致上面那种情况发生。
  • 打赏
  • 举报
回复
处理消息流程方面最坑爹的做法,就是盲目瞎猜“Sleep”时间。这个时间设置多长都不合适,长了就等于你故意去“卡”程序,短了则等于你没有故意延迟。 实际上甚至多长时间都不合适,因为根本不是这种编程方式。一个准确的、高性能的通讯就收操作,根本不写 Sleep 语句。 你说的“只是提取的速度缓慢”,这说明你起码还不是故意去坑爹地用 Sleep 语句来故意卡程序。只是需要在处理流程上再精细地考虑一下。
  • 打赏
  • 举报
回复
引用 楼主 tzyzgb05914 的回复:
那么,我的问题就是如何提取textbox中的数据,因为我发送的指令,在传回的数据前4位是相同,我这里采用的对字符串分割提取方法,只是提取的数据缓慢,收的数据老是覆盖掉(可以这样理解,收的太快,我的提的太慢,达不到我想要的实时需要提取)
纠结“快、慢、延时”都是不太懂应用层通讯处理流程的结果。 首先,unicode字符串必须有完整的 bytes 集合。而当你收到数据时,你并不知道是否恰好收到完整的一个unicode字符的最后一个字节,所以如果你随便就 encoding.GetString(datas) 这就不能保证在你的 TextBox 中显示正常的字符。除非你的字符都是 ASCII 编码(或者字节更短的编码方式)的。 收取消息内容,你可以累计到 List<byte> 或者 MemoryStream 中。当你收到消息结束标志,再从累计的内容中解析内容,这才可能正确处理内容。(从头部移除一条完整的消息,而剩下的 bytes 不应该移除)。 另外,在 DataReceived 事件处理过程中只是把收到的 byte 进行累计,然后判断有没有收到一个完整的消息。一旦判断包含完整的消息需要处理,应该注册给系统线程池去处理,例如
ThreadPool.QueueUserWorkItem(h => Process(messag));
而不应该占用当前线程。当前线程应该尽快释放,让后续到来的数据立刻被处理,后续 DataReceived 事件立刻触发(而不用等 Process 任务结束)。
黑娃 2016-07-27
  • 打赏
  • 举报
回复
今天脑壳痛,没看懂你得意思。 目的是要在textbox实时显示收到的数据?收多少显示多少,永远不清空?还是提取了的就不显示,只显示没提取的
wangyu0517 2016-07-27
  • 打赏
  • 举报
回复

"/r/n"
wangyu0517 2016-07-27
  • 打赏
  • 举报
回复
要么显示一次加延时(让你肉眼能看到变化),要么连续显示

textbox1 .text += "";
textbox1 .text += NeedToShow;     //NeedToShow要显示的字符串
mjp1234airen4385 2016-07-27
  • 打赏
  • 举报
回复
你在这个sp1_DataReceived事件里处理字符串,textbox1只是显示结果的。 先处理,再显示。

111,129

社区成员

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

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

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