C# serialPort.read() 对同一条数据会接收多次

小么呀小儿郎 2016-04-14 12:18:29
各位大神,我用serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);接收数据,但是当我用serialPort.read() 时同一条数据会接收多次,请问这是什么原因?谢谢!


贴上代码:
 private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(50);
int len1 = sp.BytesToRead;
if (len1 == 16)
{
len1 = 0;
this.Invoke((EventHandler)(delegate
{
textBox2.Text += "get len16" + "\r\n\r\n";
}));

}
else if (len1 == 30)
{
sp.Write(data_reply, 0, 25);//发送协助转发应答包
byte[] data_temp = new byte[len1];
sp.Read(data_temp, 0, len1);//接收协助转发包
sp.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
this.Invoke((EventHandler)(delegate
{
textBox2.Text += " 接收数据" + "\r\n\r\n";

}));
}
else if (len1 == 46)
{
byte[] hello_temp = new byte[len1];
sp.Read(hello_temp, 0, len1);//接收hello包
sp.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
this.Invoke((EventHandler)(delegate
{
textBox2.Text += "OK" + "\r\n\r\n";

}));
}
else
{
sp.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
this.Invoke((EventHandler)(delegate
{
textBox2.Text += "数据包格式错误错误!" + "\r\n\r\n";
}));


}

}
catch (Exception ee)
{
sp.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
MessageBox.Show(ee.Message);
return;
}
}
...全文
1028 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
成田日上 2017-01-13
  • 打赏
  • 举报
回复 1
今天也遇到同样的问题了,发现了lz的帖子可惜没看到解决办法,后来调试发现每次关闭端口后再打开,时间函数就会增加执行一次,也就是每次执行serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);这句代码时,时间函数的执行次数就会累加,照这个思路,做一点点修改就解决了,虽然莫名其妙,但还是解决了表面问题,写来给有需要的人。 修改方法:在serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);这句前面增加一句serialPort1.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);即可
本拉灯 2016-04-14
  • 打赏
  • 举报
回复
看这逻辑代码,看得我流泪了,我特么的看不懂啥意思。
tcmakebest 2016-04-14
  • 打赏
  • 举报
回复
DataReceived 事件可不是这么一会加一会减这么用的, 看着都感觉乱, 特别是事件内部还控制事件,醉了
小么呀小儿郎 2016-04-14
  • 打赏
  • 举报
回复
引用 2 楼 PiggyZhu1024 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 各种参数 ,波特率什么的 都设置对了么
我用串口助手,设置成同样的参数,可以收到正确的数据,然而换成我自己的程序就会出现同一条数据收到两三次的情况。 还有部分代码是这样的:
 private void ZJ()
        {           
 
            try
            {
                if (!serialPort1.IsOpen)//若端口没有打开,需打开端口           
                {
                    serialPort1.Open();                    
                }
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
               
                serialPort1.Write(cmd, 0, cmd.Length);

              
            }
            catch (Exception ee)
            {
                serialPort1.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
                MessageBox.Show(ee.Message );
                return;
            }           
        }
[/quote] 代码贴错了,应该是sp,不是serialPort1,我自己的程序里写的是正确的
小么呀小儿郎 2016-04-14
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
各种参数 ,波特率什么的 都设置对了么
我用串口助手,设置成同样的参数,可以收到正确的数据,然而换成我自己的程序就会出现同一条数据收到两三次的情况。 还有部分代码是这样的:
 private void ZJ()
        {           
 
            try
            {
                if (!serialPort1.IsOpen)//若端口没有打开,需打开端口           
                {
                    serialPort1.Open();                    
                }
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
               
                serialPort1.Write(cmd, 0, cmd.Length);

              
            }
            catch (Exception ee)
            {
                serialPort1.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
                MessageBox.Show(ee.Message );
                return;
            }           
        }
  • 打赏
  • 举报
回复
各种参数 ,波特率什么的 都设置对了么

111,129

社区成员

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

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

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