社区
C#
帖子详情
求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,
freeboy827
2009-05-26 02:45:18
RT,谢谢回复
...全文
122
8
打赏
收藏
求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,
RT,谢谢回复
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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模式下,正常情况下你设置的断点不起作用(而不表示没有触发)。
VB .net
Se
ria
l
Port
控件使用详解
首先,
Se
ria
l
Port
控件的
Data
Re
ceived
事件
是串口接收到数据时
触发
的
事件
,但是这个
事件
的
触发
机制是串口接收到不大于
Se
ria
l
Port
1.Re
ceived
BytesThreshold个字节的时候
触发
的。这个阈值可以根据实际情况进行设置,...
Se
ria
l
Port
串口通信实例
通过`
Se
ria
l
Port
.
Data
Re
ceived
`
事件
,我们可以实现异步接收数据,同时,利用`
Se
ria
l
Port
.Write`方法发送数据。这个实例不仅可以用于本机之间的通信,还可以与其他具有串口的设备进行交互,如Arduino、嵌入式系统等。...
c#
se
ria
l
port
sample(2)
- 接收数据:可以监听`
Data
Re
ceived
`
事件
,该
事件
会在串口接收到数据时
触发
。在
事件
处理程序中,通过`ReadLine()`或`ReadExisting()`读取数据。 5. **
事件
处理**: `
Data
Re
ceived
`
事件
的处理程序是串口通信的核心...
vb2008串口编程应用实例,
Se
ria
l
Port
控件应用
如果连续两个字节发送间隔很短,
Data
Re
ceived
事件
可能在接收到Re
ceived
BytesThreshold个字节时
触发
;但若间隔较长,
触发
条件则不那么确定,但总是在该阈值以下。 在
Data
Re
ceived
事件
的处理程序中,有一个关键的注意...
c#
se
ria
l
port
sample(1)
Se
ria
l
Port
类提供了多个
事件
,如
Data
Re
ceived
事件
,当串口接收到数据时
触发
。可以注册此
事件
处理程序来实时处理接收到的数据。 ```csharp my
Se
ria
l
Port
.
Data
Re
ceived
+= new
Se
ria
l
Data
Re
ceived
EventHandler...
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章