C# serialPort控件无法触发DataReceived事件

我要实现的功能:上位机C#软件通过串口向单片机发送命令,单片机收到命令后通过串口向上位机发送数据,上位机收到数据再解析。我的代码如下:
有些框架代码我省略了
using System.IO.Ports;

private void Form1_Load(object sender, EventArgs e)
{

Control.CheckForIllegalCrossThreadCalls = false;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); //定义事件

}
private void button1_Click(object sender, EventArgs e) //串口初始化按钮
{
try
{

serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = 38400;
serialPort1.Open();

}
catch
{
MessageBox.Show("串口打开错误!", "错误");

}
}

private void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{

serialPort1.Read(receivebuf, 0, receivebuf.Length); //此处设置断点后,无法执行到这一步,就是该事件未触发
//下面是数据处理的代码,略
}

private void button2_Click(object sender, EventArgs e) //通过定时器触发向下位机发送采集数据命令
{
button3.Enabled = true;
timer1.Interval = 3 * 1000;
timer1.Start();

}

private void timer1_Tick(object sender, EventArgs e)
{

byte[] sendbuf = new byte[6] { 0xef, 0xc0, 0x00, 0x00, 0xc0, 0xfe };
serialPort1.Write(sendbuf, 0, 6);

}
}
}
我是用同一个串口COM1进行通信,经检测,上位机能发送数据给下位机,但是下位机发送数据给上位机的时候未触发DataReceived事件,我用串口调试助手试了下,完全正常通信

个人不是特别推荐使用DataReceived事件. 因为这种方法很被动, 出现问题很难确认到底哪里有问题
你可以尝试下述调试方法:
1: 你试试把时间发送命令,修改成按钮发送一次, 调试一下,看看是否能触发. 因为DataReceived事件在定时触发里面,如果间隔段设置不好,容易出问题,因为串口助手是软件,你实际发送接收命令面对的是物理机器, 同步是大问题.

2:不要使用DataReceived事件和定时器配合使用, 自己手动读取判定. 时间间隔设置要看你对设备本身的熟悉程度.
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-11
把 serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); //定义事件代码放到form_load外面试试
第2个回答  2016-02-26
你解决这个问题了吗?我也是这个情况啊
http://zhidao.baidu.com/question/747540858614013892.html

...serialport 接收数据,每次都不能触发DataReceived。我知道DataReveive...
由于串口在不断的接收数据,DataReceived事件在不断的触发,所以数据处理放到委托里面,DataReceived只做数据接收,假如你把数据处理放在DataReceived事件中,可能会影响到数据的接收。如果你对委托不太了解,可以查阅MSDN文档:http:\/\/msdn.microsoft.com\/zh-cn\/library\/ms173171.aspx 另外,调试的话最好不...

...但数据接收不到,DataReceived事件总是不触发?
用串口调试工具确保代码无误.设置好串口和比特率点击open,然后编辑内容发送.用下面的方法接收.private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { if (serialPort1.IsOpen) { StringBuilder strb = new StringBuilder(); ...

serialPort的DataReceived事件无法触发
1、看一下你的SerialPort的Dts属性和Rts属性,都应该设为True才行 2、数据以后 更新textbox 用个委托 3、多线程来完成

c# 串口 不触发DataReceived 事件
程序1打开了串口1,程序2再打开串口1时,会报错。必须程序1将串口1关闭。

C#串口不能触发datareceived事件
使用SpCom发送的数据是不能再使用SpCom接收的。发的数据是通过串口给别的设备的,接收是需要别的设备发的数据。

C# 串口通信 使用SerialPort类的DataReceived事件接收的数据不完整...
1.你可以在接收事件函数的开始位置延迟一段时间,根据数据长度的不同可以适当改变延迟的时间。2.根据你接收的数据格式可以使用不同的Read方法。ReadTo()方法是直到读到相应的字符为止,ReadLine()方法是读到一个新行,Read()读取缓冲区的字节数。希望对你有帮助。不懂的话可以继续问。

C# serialport内datareceived事件接收串口数据,详细步骤。
byte[] data = new byte[serialPort1.BytesToRead]; \/\/定义缓冲区,因为串口事件触发时有可能收到不止一个字节 serialPort1.Read(data, 0, data.Length);\/\/读取指定长度 foreach (byte Member in data) \/\/遍历用法 { string str = Convert.ToString(Member, 16).ToUpper();textBox1.AppendText...

...不进入DataReceived 事件 这个是怎么回事呢
void __fastcall TChart1Form::Chart1Click(TObject *Sender){ if (CheckBox1->Checked){ CheckBox1->Checked = false;EditX1->Text = FloatToStr(tmpX);EditY1->Text = FloatToStr(tmpY);

c#中serialPort,发送一个命令过去,马上就有一个回应,怎样接收这个回应信 ...
serialPort控件的 DataReceived事件接收返回,它是在线程中完成的,串口必须是232的才有主动上传的,485的只有你发查询命令的时候才会有返回。

c#,采用SerialPort类的DataReceived事件来接收数据,性能达不到要求,有...
1.如果是从设备数据发出,到程序SerialPort类的DataReceived收到时间觉得过长,那你这个系统需要的性能就太牛叉了,还是换其他方式吧,例如socket。2.如果是设备数据发出,程序也收到。但是如果是因为你在DataReceived事件里写了大量的处理逻辑导致在两次接收数据的时间间隔之内跟不上处理,那这个,我建议你...

相似回答