社区
C#
帖子详情
求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,
freeboy827
2009-05-26 02:45:18
RT,谢谢回复
...全文
121
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
控件使用详解
VB2008中使用
Se
ria
l
Port
控件详解,从接收到发送。估计你看了就会用这个了,其实VB2008很简单哦~
Se
ria
l
Port
串口通信实例
使用
Se
ria
l
Port
在WPF中进行串口通信的实例,实现了本机发送,本机接收,既可以同步接收又可以异步接收
c#
se
ria
l
port
sample(2)
http://blog.csdn.net/wuyazhe/archive/2010/05/19/5606276.aspx 博客文章的配套代码。希望能帮助到你。
vb2008串口编程应用实例,
Se
ria
l
Port
控件应用
vb2008串口编程应用实例,
Se
ria
l
Port
控件应用,详解
Se
ria
l
Port
的应用方法,简单的接口以及消息收发程序,接收程序。
c#
se
ria
l
port
sample(1)
http://blog.csdn.net/wuyazhe/archive/2010/05/17/5598945.aspx 博客文章的配套代码。希望能帮助到你。
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章