C# COM通信为什么会触发两次接收事件,麻烦大神帮我看看,代码如下,接收的字符不多,但mm每次会增加2,我理解为触发了是会触发两次接收事件

下东西我可以适当帮 2017-01-12 11:11:55
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
mm++;
label1.Text =Convert.ToString(mm);
if (rbnGetASII.Checked)//如果接收模式为字符模式
{
string str = serialPort1.ReadExisting();//字符串方式读
txtGetData.AppendText(str);//添加内容textBox文本框中依次向后显示
}
else //如果接收模式为数值接收
{
//易出现异常:由于线程退出或应用程序请求,已中止 I/O 操作
//加入异常处理
try
{
string s = "";
int count = serialPort1.BytesToRead;

byte[] data = new byte[count];
serialPort1.Read(data, 0, count);

foreach (byte item in data)
{
s += Convert.ToChar(item);
}

if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate { this.txtGetData.Text = s; }));
}
else
{
this.txtGetData.Text = s;
}

//int data;
//data = serialPort1.ReadByte();
//string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
//txtGetData.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”
}
catch
{
this.Close();//关闭当前窗体
}
}
serialPort1.DiscardInBuffer();
}
...全文
356 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
佳佳顿 2017-01-13
  • 打赏
  • 举报
回复
楼主在mm++前面加个延时应该就行了
marcus2006 2017-01-13
  • 打赏
  • 举报
回复
给点分吧,没分提问了
wanghui0380 2017-01-13
  • 打赏
  • 举报
回复
假设发送buffer是1024字节,你发送2000字节,你认为他会怎么发,当然是发两次 所以标准协议并不是说发一串字节就好了,通常会自己设定数据包,就算不是设定数据包也会定义好开始位和结束位
zcw9911 2017-01-13
  • 打赏
  • 举报
回复
我个人推测主要是延时造成的,串口接收一般是靠数据间隔时间确定是否接收造成,所以会有多一次现象
  • 打赏
  • 举报
回复
在 DataReceived 中想当然地就以为数据结束了,这就是逻辑问题,说明没有学过这方面编程。 比如说对方发送了一句话,结果你接收端接受了一半、甚至一个中文字符(多个字节)的一半的字节才接收到,你就像当然地以为接收完整的一句话了,这肯定就错了。
  • 打赏
  • 举报
回复
触发几次有什么关系呢? 假设客户端发送了100次数据,那么接收端触发了110次、120次、158次DataReceived,这又有什么关系?谁跟你说过一定是触发100次DataReceived呢?
llsus 2017-01-13
  • 打赏
  • 举报
回复
如果你不熟悉,建议你别用事件方式,用查询方式,判断recbuffcount字符数量达到你报文需求的值,再去读取,注意写个超时,别一直收不到搞死机了。

110,536

社区成员

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

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

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