社区
C#
帖子详情
求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,
freeboy827
2009-05-26 02:45:18
RT,谢谢回复
...全文
166
8
打赏
收藏
求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,
RT,谢谢回复
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
灯火斑斓
2009-05-26
打赏
举报
回复
也就是说,既然SerialPort有一个DataReceived的事件,不应该再刻意1秒钟再去读取一下端口的数据。
灯火斑斓
2009-05-26
打赏
举报
回复
抱歉,我不用QQ,老外的公司都用Skype.请看下面的方法,希望对你有帮助。
技术要点:
(1).首先,SerialPort的ReceivedBytesThreshold先设置成1,表示只要有1个字符送达端口时便触发DataReceived事件
(2).当DataReceived触发时,先把ReceivedBytesThreshold设置成一个比较大的值,达到读取本次端口数据时,不再触发DataReceived.
(3).循环读取端口中的数据,直至读完。
(4).移除读取数据中的非法字符。
(5).触发一个后台线程处理收到的数据。
(6).在finally中把ReceivedBytesThreshold重置回1
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (sender.GetType() != typeof(System.IO.Ports.SerialPort))
{
return;
}
string strReceive = string.Empty;
string strCollect = string.Empty;
System.IO.Ports.SerialPort comPort = (System.IO.Ports.SerialPort)sender;
try
{
comPort.ReceivedBytesThreshold = comPort.ReadBufferSize;
while (true)
{
strReceive = comPort.ReadExisting();
if (string.Equals(strReceive, string.Empty))
{
break;
}
else
{
strCollect += strReceive;
Application.DoEvents();
Thread.Sleep(100);
}
}
strCollect = strCollect.Replace("\0", string.Empty);
strCollect = strCollect.Replace("\r\n", string.Empty);
strCollect = strCollect.Replace("\r", string.Empty);
strCollect = strCollect.Replace("\n", string.Empty);
if (!this.bIsHandleCom)
{
this.bIsHandleCom = true;
mReceiveData = strCollect;
if (ReceiveDataParserEvent != null)
ReceiveDataParserEvent(mReceiveData);
if (ThreadReceiveParser != null && !ThreadReceiveParser.IsAlive)
{
ThreadReceiveParser.Start();
}
}
}
catch (Exception ex)
{
MessageBox.Show(this, ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
comPort.ReceivedBytesThreshold = 1;
}
}
freeboy827
2009-05-26
打赏
举报
回复
我说错了,是按F5和CTRL+F5
现在我读取数据时睡50MS就行了
freeboy827
2009-05-26
打赏
举报
回复
我的程序是每一秒读取数据
就是在DataReceived事件里 把读取的数据保存到一个文本文件里
在DEBUG模式里可以看到文本文档的创建
用RELEASE模式就不会有文本文档的创建,也就是说不会执行事件
402514969 加QQ谈吧,谢谢你了
灯火斑斓
2009-05-26
打赏
举报
回复
不知道你是如何断定在Release模式下就不触发DataReceived事件的?SerialPort很稳定,没有问题。
freeboy827
2009-05-26
打赏
举报
回复
我的程序在DEBUG下会执行DataReceived事件
在RELEASE下不会执行,
哪位遇到这样奇怪的问题啊
很郁闷
灯火斑斓
2009-05-26
打赏
举报
回复
若你需要在Release模式下也可以断点调试,请在Relase的输出目录下创建一个 <应用程序可执行文件的主文件名>.ini文件,内容如下:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0
这样,就可以在Release模式下调试断点了。
灯火斑斓
2009-05-26
打赏
举报
回复
不是的,在Debug和Release下都会有触发,只是在Release模式下,正常情况下你设置的断点不起作用(而不表示没有触发)。
从MSComm到
Se
ria
l
Port
:.NET串口编程实战与迁移指南
本文详解.NET平台下System.IO.
Port
s.
Se
ria
l
Port
类的使用方法,涵盖端口配置、数据收发、
事件
驱动模型、跨线程UI更新、错误处理与资源释放。重点对比MSComm控件与
Se
ria
l
Port
的设计差异,解析粘包断包处理、协议解析、性能优化及典型问题排查,适用于WinForms、服务程序及类库等多场景串口通信开发。
Se
ria
l
Port
做winform程序的问题汇总与解决
本文总结了在使用
Se
ria
l
Port
过程中遇到的多个问题及解决办法,包括
Data
Re
ceived
事件
机制、ReadExisting方法乱码问题、线程同步、串口自动关闭及资源释放不当等问题,为开发者提供宝贵经验。
unity2017仍不支持
Se
ria
l
Port
.
Data
Re
ceived
这个委托
本文介绍了一种在Unity环境中使用C#实现串口通信的方法。通过创建自定义类
Port
Class,利用多线程分别处理数据接收和发送,确保了通信的稳定性和效率。文章详细展示了如何设置串口参数,并提供了完整的代码示例。
关于
se
ria
l
Port
控件的使用跟INI文件的创建,读取,写入方法
本文介绍了一个关于氦检项目的用户界面开发经验,重点讲解了如何使用
se
ria
l
Port
控件进行串口通信,并实现了条码枪的数据读取。此外,还详细介绍了INI文件的创建、读取和写入方法。
C# WinForm串口调试工具:一键扫描端口、十六进制/ASCII双模收发、带粘包处理的可运行工程
基于C#和Windows Forms开发的即用型串口通信调试工具,内置完整VS解决方案,无需额外安装依赖,打开即可运行。支持自动扫描可用COM端口,灵活设置波特率、数据位、停止位、校验位等参数;发送区支持文本输入与十六进制格式发送;接收区提供ASCII与HEX双
模式
显示,并具备基础粘包识别与多字节连续接收能力。界面包含参数配置面板、发送输入框、实时接收显示窗及清屏功能按钮。底层使用.NET原生
Se
ria
l
Port
类,通过
Data
Re
ceived
事件
实现非阻塞异步接收,确保响应及时。工程结构规范,含Form1
C#
111,132
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章