求救,SERIALPORT 只有在DEBUG模式下才触发DataReceived事件,

freeboy827 2009-05-26 02:45:18
RT,谢谢回复
...全文
119 8 打赏 收藏 转发到动态 举报
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模式下,正常情况下你设置的断点不起作用(而不表示没有触发)。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧