C#串口SerialPort使用事件触发和线程查询数据接收都不完整?

ly8008csko ly8008csko 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
C#上位机给下位机发送查询命令,下位机收到后返回数据,上位机每1s查询一次,上下位机通讯数据格式都是:若干字节\r\n
我用2个线程来处理,一个专门收串口数据,送到缓冲区中,一个从缓冲区读数据然后处理数据,应该不是因为数据处理太慢导致数据丢失的吧。
波特率为2400,ReadBufferSize为4096

1、使用DataReceived事件
ReceivedBytesThreshold为1
com.ReadTo("\r\n");
com.DiscardInBuffer();
理论上应该收到:3C030729211412121412,但几乎每次收到的都是:3C0307。按照网上的办法,修改如下:
private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
com.ReceivedBytesThreshold = 10000;
com.ReadTo("\r\n");
com.DiscardInBuffer();
将数据写入缓冲区;
com.ReceivedBytesThreshold = 1;
}
以及
private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(20);
com.ReadTo("\r\n");
将数据写入缓冲区;
com.DiscardInBuffer();
}
收到的数据还是不完整,最后我改成
private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
com.DataReceived -= new SerialDataReceivedEventHandler(com_DataReceived);
while (com.BytesToRead > 0)
{
com.ReadByte();
将数据写入缓冲区;
}
com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
}
这样才能完整的收到数据。
2、使用线程查询串口数据
private void ComMonitorThread()
{
while (true)
{
if (com.BytesToRead > 0)
{
byte[] buffer = new byte[com.BytesToRead];
com.Read(buffer, 0, com.BytesToRead);
将数据写入缓冲区;
}
}
}
理论上应该收到:3C030729211412121412,但几乎每次收到的都是:3C03072121412,前后部分数据都对,但中间的2921141却丢失了。最后改成如下方式才没有丢数据。
private void ComMonitorThread()
{
while (true)
{
if (com.BytesToRead > 0)
{
com.ReadByte();
将数据写入缓冲区;
}
}
}
3、无论用com.Read(buffer, 0, com.BytesToRead),还是com.ReadTo("\r\n"),还是com.ReadLine(),还是com.ReadExisting(),读出来的数据都不完整。只用com.ReadByte()才能读出完整的数据。但是这样CPU占用率都高达99%,不知大家有没有什么更好的解决方案。
...全文

相关推荐

c# serialport sample(1)

http://blog.csdn.net/wuyazhe/archive/2010/05/17/5598945.aspx 博客文章的配套代码。希望能帮助到你。

兔子-顾问

C# SerialPort 串口通信完整实战:收发数据、分包、校验、重连机制

本文介绍了一个工业级.NET串口通信组件的封装方法,主要解决原生SerialPort类在实际应用中遇到的稳定性问题。文章分为四个部分: 基础API与常见误区:指出DataReceived事件不是帧触发、跨线程操作和Close()死锁等关键问题。 整体架构设计:提出分层设计思想,包括业务应用层、组件封装层和底层驱动层,强调接收/发送分离、协议解析独立等原则。 基础封装实现:展示串口启停、数据收发的基础封装,重点解决线程安全和资源释放问题,特别是避免Close()死锁的方案。 粘包分包处理:说明流式传输导致的粘

威哥说编程

C#串口调试助手完整源码解析与实战开发

采用标准五级日志模型:Info = 20,每个级别代表不同严重程度:Debug: 用于开发期跟踪变量状态,生产环境关闭。Info: 正常操作记录,如“串口COM3已打开”。Warning: 可恢复的异常,如“接收到无效校验包”。Error: 功能性失败,如“发送指令超时”。Critical: 系统级崩溃,需立即关注。

溪水边小屋

C# serialport 串口发送与接收数据操作类

对C#的serialport类功能进行了总结,给出了发送,接收数据的完整操作类代码,可直接运用该类进行c#的串口数据操作

zhangcaixia1986526

C#使用SerialPort和API串口的例子

一个集成了SerialPort和API方式实现串口通信的例子.注意线程操作UI的部分图方便使用了不安全的代码,建议改为委托

於黾
评论 2
收藏 已收藏
分享
返回顶部
ly8008csko
C# 111,128 成员 642,537 内容