为什么我的串口接收数据使有时候会分两次触发接收

叫我啊达 2017-05-22 02:54:30

本人想用C#写一个实时监测温度的上位机,我用一个串口助手来调试
我发送10.5时候我写的上位机有时候是分开收到1和0.5或者是10和.5
不懂为什么啊 想了很久

以下是串口接收到数据时触发的函数的代码
byte[] readBuffer = new byte[sp.ReadBufferSize];
sp.Read(readBuffer, 0, readBuffer.Length);
sp.DiscardInBuffer();
//赋值
rs = readBuffer;//
string str;
str= Encoding.GetEncoding("ASCII").GetString(rs);

string str2 = "12";
if (str!=str2) { MessageBox.Show(str); }
data.Add(str);
MyValue = 0;
...全文
2265 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
寄阳盼蕊 2021-04-26
  • 打赏
  • 举报
回复
因为你是被动接受数据,串口传输数据太慢他可能分两次传,你把接到的数据处理一下就行了
exception92 2017-05-22
  • 打赏
  • 举报
回复
应为忽略了最重要的“数据完整性校验”步骤。
星空蔚蓝 2017-05-22
  • 打赏
  • 举报
回复
你发送的串中有没有开始和结束符,然后读取的时候要获得一个完整的串,包含一个开始 一个结束,中间的有效位才是你要读取的值,不知道这么说有没有帮到你
by_封爱 版主 2017-05-22
  • 打赏
  • 举报
回复
没有为什么 本来就是这样. 所以才需要"协议"啊...比如枕头枕尾校验和 根据协议才能组装成一个完整的"包" 否则这些东西存在是干嘛的? 当然了.如果你采用"主动读取模式" 那种sleep后read 就不会有这样的问题了..
原先的程序数据缓冲区采用String类型,因此无法发送H00,现将数据缓冲区修改为BLOB类型,可以发送任意数据。 在原先程序的基础上,增加了两个对象:pfc_n_cst_numerical,uo_bit_operator Email: leio88@126.com 以下是原作者的话---------------------------------- 本程序通过调用WINDOWS API函数,实现了类似MSCOMM控件的功能。使PB可以很方便地访问串口。由于所有功能都是PB代码实现的,因此比使用OCX控件访问串口的方式更稳定。 为了方便使用已将所有功能都封装在uo_comm._control用户对象中。使用时只需在窗口中像放置普通对象(如:按钮)一样放置一个uo_comm_control对象即可对串口进行访问。 访问串口时先调用of_setcommport(string commport)和of_setcommsettings(string commsettings)来设置要访问的端口及端口初始化参数,然后调用of_open()初始化端口。或直接使用of_open(string comport,string commsettings)带参数初始化端口。端口初始化成功后即可使用of_send(string sendstring)向串口发送数据,或使用of_read()读取串口数据。当串口有数据到达时,触发ue_received事件,该事件提供给用户用来存放读取串口数据的代码(值得注意的是,当数据到达接收端时,由于发送的数据很长或通讯速率较低,会多次触发ue_receieved事件,并且在ue_received事件中使用of_read()得到的数据仅只是整个发送数据的一部分,需要将多次接收到的数据连接起来才是完整的接收数据)。若对串口所有操作结束不再需要对串口进行操作,则调用of_close()将端口关闭。 Email: blazingstar@sina.com

110,533

社区成员

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

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

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