在C#中使用串口接收数据时发现,在完整的接收完一次数据后,还会再次进入串口接收事件。

在网上搜索资料发现其他开发者也有遇到该问题:

[1]  c#串口事件接受一次数据莫名其妙会触发两次   原文链接:https://www.52pojie.cn/thread-1009851-1-1.html

[2]Serial Port object's DataReceived Event firing twice   原文链接:https://stackoverflow.com/questions/30296199/serial-port-objects-datareceived-event-firing-twice

其中[2]提到:串口接收事件触发2次是正常的,第1次是有数据接收,第2次收到的是EOF标志,直接忽略掉第2次就好了。

在串口接收事件开头加入该部分判断后如下:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{//接收到EOF则直接退出if (e.EventType == System.IO.Ports.SerialData.Eof){return;  }...
}

在串口接收事件的if语句处设置断点进行调试,第一次进入时:e.EventType 为System.IO.Ports.SerialData.Chars,串口缓冲区有3个字节需读取。

第2次进入时:e.EventType 仍为System.IO.Ports.SerialData.Chars,串口缓冲区有0个字节需读取。

通过程序调试可知:程序第2次进入串口接收事件并不是因为接收到EOF标志即System.IO.Ports.SerialData.Eof,而是接收到System.IO.Ports.SerialData.Chars,但接收到的字节长度为0。

因此,通过加入if (e.EventType == System.IO.Ports.SerialData.Eof) return;的方式并不可行。既然可以保证在第1次进串口接收事件就将数据接收完毕,且第2次进入串口接收事件的数据长度为0。则可通过判断接收字节长度为0就直接退出的方式忽略掉第2次进入的串口接收事件。

添加判断后的代码如下所示:经验证该方法可行,可以忽略掉第2次进入串口接收事件。具体导致进入第2次串口接收事件的原因还不明确,需继续探究!

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{//if (e.EventType == System.IO.Ports.SerialData.Eof)//添加此判断在接收完一帧数据后,第2次意外进入时会直接退出if (serialPort1.BytesToRead == 0){return; //串口数据长度为0则直接退出}//串口接收并不是接收的每个字节都会进入该事件,因此需在该事件中接收完数据Int32 readByteNum = 0;/* 等待数据接收完成,即3mS内串口接收到的数据长度不再变化则认为数据已经接收完成 */do{readByteNum = serialPort1.BytesToRead;System.Threading.Thread.Sleep(10);} while (readByteNum < serialPort1.BytesToRead && serialPort1.BytesToRead < 4096);serialPort1.Read(usartRecvBuffer, 0, readByteNum);  //将串口缓冲区的数据保存至接收缓冲区serialPort1.DiscardInBuffer();                      //清空串口缓冲区的内容//显示串口接收到的数据string str = string.Empty;for (int i = 0; i < readByteNum; i++){str += (usartRecvBuffer[i].ToString("X02") + ' ');}
#if USE_DELEGATEthis.UpdataControl(tboxRecv, str);
#elsetboxRecv.Text = str;
#endif
}

微软官方对 SerialPort.DataReceived 事件 的使用说明:

原文链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport.datareceived?redirectedfrom=MSDN&view=dotnet-plat-ext-5.0

C# 串口接收1次数据会进入2次串口接收事件serialPort1_DataReceived,第2次进入时串口缓冲区为空相关推荐

  1. bufferedreader接收不到数据_FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

    1 基础知识点 1.1 串口中断种类 串口中断属于STM32本身的资源,不涉及到FreeRTOS,但可与FreeRTOS配合使用. 串口接收中断 中断标志为:USART_IT_RXNE,即rx non ...

  2. 51 32单片机使用蓝牙测RSSI值定位(包含字符串发送,接收字符串,数据解析发送,中断超时接收等)

    首先这是一篇血泪文章,当你看到这篇文章的时候,笔者已经失败了,首先笔者选用了51单片机进行编写,51单片机的一个串口难以进行相应的验证,这是其一:其二,使用AT+CWLAP调回WIFI信息的时候,你会 ...

  3. php接收rs485的数据如何处理,记录STM32F7 RS485通讯接收数据卡死接收中断的解决方法...

    问题描述:用原子哥的RS485通讯示例对伺服进行控制时,发现当通讯速度过快时,经常会卡死在接收中断里.楼主使用的波特率为1Mbps,一帧发送数据包为10-20字节,一帧接收数据包20-30字节,接收速 ...

  4. php接收rs485的数据如何处理,为什么485不能连续接收?

    谢谢各位的回复! 我的STC11F04XE单片机程序如下,中断接收数据,主程序中判断收到4个字节数据就转发. PC串口转485通过MAX485与单片机UART连接.调试助手发送单个字节,发送4次,能正 ...

  5. java udp 接收不定长_JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?...

    // 与UDP数据接收线程通信更新UI线程中EditText控件中的内容 receiveHandler = new Handler() { public void handleMessage(Mess ...

  6. STM32单片机串口空闲中断+DMA接收不定长数据

    在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...

  7. STM32串口接收不定长数据原理与源程序

    **STM32串口接收不定长数据原理与源程序**CSDN上有很多关于STM32串口接收不定长数据的文章,但实际使用后发现照搬他们的代码,程序根本就不能正确接收数据,其中最关键的一句有问题.其余内容完全 ...

  8. STM32单片机串口空闲中断接收不定长数据

    在使用单片机的串口通信功能时,常用的接收数据方法是通过固定的字节数来判断一帧数是否发送完成,或者是通过固定的结束标志位来表示一帧数据发送完成.但是有时候会遇到发送的数据长度不固定,也没有固定的结束标志 ...

  9. 第三课--EFM32GG11系列--串口接收不定长度数据的几种方式

    一.硬件串口引脚定义 PE10-->USART0-TX PE11-->USART0-RX 上面表格中,红色方框画出的内容用程序实现如下,在串口初始化时需要实现,不过经本人测试过,把这段代码 ...

  10. 串口IDLE空闲中断+DMA实现接收不定长数据基于stm32cubemx

    引言:对于串口接收一些不定长的数据,必须面对一个问题:怎么判断一帧数据接收是否完成?通常使用RXNE非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,因 ...

最新文章

  1. php ids,PHP / MYSQL查询id“duplicate ids”
  2. 汇总|基于激光雷达的3D目标检测开源项目数据集
  3. ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun
  4. 一张图看懂新一代人工智能知识体系
  5. angular artDialog未及时更新
  6. [react] 使用react写一个todo应用,说说你的思路
  7. linux rm 命令删除文件恢复_linux文件处理命令之rm常用方法介绍
  8. python做线性回归统计推断提取参数_概率分析方法与推断统计(来自我写的python书)...
  9. 职场精英修炼必学工具:75页自我管理的29个工具,系统方法论
  10. vue.config.js代理配置失效 如何解决
  11. 基于C++实现校园卡管理系统
  12. 转载 :Labview和G语言
  13. 数字双极点低通滤波器-二阶巴特沃斯滤波器
  14. 将QLV 格式的视频转换为 mp4 格式
  15. php启动后no input file specified.,php网站出现no input file specified 三种解决方法
  16. Qt 使用QMovie加载gif图片实现动态等待窗口
  17. 自建比赛服务器,王者荣耀自建比赛创建功能是什么 王者荣耀如何创建自建比赛...
  18. 苹果真伪查询_汇课堂:再见盗版MT4!独家揭秘5种方法辨别真伪MT4
  19. iOS获取当前设备型号等信息总结 包含iPhone7和iPhone7P
  20. linux常见桌面系统以及安装gnome远程桌面

热门文章

  1. 1、vue 笔记之 组件
  2. Didn‘t find class “android.view.View$OnUnhandledKeyEventListener“,Didn‘t find class “androidx
  3. android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符
  4. Oracle集合查询
  5. vue 怎么清空依赖_vuejs如何在把对象所有属性清空?
  6. TCP/IP协议模型
  7. 1400协议是什么和28181区别_1400张拆解案例,够你PPT拆解学习好几遍了!
  8. c语言头文件和源文件_C语言头文件防卫式声明
  9. 【C语言进阶深度学习记录】十八 条件编译的使用与分析
  10. 【C++深度剖析教程15】经典问题解析之关于string的疑问