C#serialport。datareceived事件无法正常触发
private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//声明串口 public void listen() { SpCom.DataReceived += SpCom_DataReceived;// //SpCom.DataReceived += new SerialDataReceivedEventHandler(received); } public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] rebuffer = new byte[8]; SpCom.Read(rebuffer, 0, rebuffer.Length); //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { MessageBox.Show(rebuffer[0].ToString() + "\n" + rebuffer[1].ToString() + "\n" + rebuffer[2].ToString() + "\n" + rebuffer[3].ToString() + "\n" + rebuffer[4].ToString() + "\n" + rebuffer[5].ToString() + "\n" + rebuffer[6].ToString() + "\n" + rebuffer[7].ToString()); })); }以上程序目的是想在进入.Invoke((EventHandler)以后,通过messagebox。show();看到rebuffer里的数值,但是始终没有能弹出messagebox。如下是我的界面;点开始测试进去之后有串口打开的指令;
private void button2_Click(object sender, EventArgs e)
{
byte[] buffer =new byte[8];
if (SpCom.IsOpen)
{
}
else
{
SpCom.Open();
}
SpCom.Write(buffer, 0, 8);
}
--------------------编程问答-------------------- 你先看看是否执行到了 Invoke,而且对于都是主进程的同步操作,不需要 Invoke --------------------编程问答-------------------- 不管要不要Invoke,都没有任何反应。,
--------------------编程问答-------------------- 没有响应是因为没有读完!
试一下!
int iLEN=serialPort1.BytesToRead;
byte[] b_read = new byte[iLEN];
serialPort1.Read(b_read, 0, iLEN); --------------------编程问答-------------------- private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//声明串口
public void listen()
{
SpCom.DataReceived += SpCom_DataReceived;
}
public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] rebuffer = new byte[8];
SpCom.Read(rebuffer, 0, rebuffer.Length);//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
MessageBox.Show(rebuffer[0].ToString() + "\n" );
}));
}
以上程序目的是想在进入.Invoke((EventHandler)以后,通过messagebox。show();看到rebuffer里的数值,但是始终没有能弹出messagebox。
如下是我的界面;点开始测试进去之后有串口打开的指令;
private void button2_Click(object sender, EventArgs e)
{
byte[] buffer =new byte[8];
if (SpCom.IsOpen)
{
}
else
{
SpCom.Open();
}
SpCom.Write(buffer, 0, 8);
}
--------------------编程问答-------------------- 你先改一下试试! --------------------编程问答-------------------- private SerialPort SpCom = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
public void listen()
{
SpCom.DataReceived += SpCom_DataReceived;
//SpCom.DataReceived += new SerialDataReceivedEventHandler(received);
}
public void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int iLEN = SpCom.BytesToRead;
byte[] b_read = new byte[iLEN];
SpCom.Read(b_read, 0, iLEN);
this.Invoke((EventHandler)(delegate
{
MessageBox.Show(b_read[0].ToString() + "\n" + b_read[1].ToString() + "\n" + b_read[2].ToString() + "\n" + b_read[3].ToString() + "\n" + b_read[4].ToString() + "\n" + b_read[5].ToString() + "\n");
//依次的拼接出16进制字符串
}));
按照您说的我把代码加了进去没有反应
--------------------编程问答-------------------- 1、把电脑的串口2,3针短接,用串口调试助手能收到正确的数据。
2、用示波器查看2针波形,能看串口发送的数据。数据用查询的方法能读到,但是无法触发datareceived事件 --------------------编程问答-------------------- this.Invoke(new EventHandler( MessageBox.Show(b_read[0].ToString() + "\n" + b_read[1].ToString() + "\n" + b_read[2].ToString() + "\n" + b_read[3].ToString() + "\n" + b_read[4].ToString() + "\n" + b_read[5].ToString() + "\n");
)); --------------------编程问答-------------------- 不知道楼主解决了没有,我今天碰到了这个问题,我在串口初始化时设置SerialPort.DtrEnable = true;就ok了。原因是大部分下位机的串口同上位机通信时,上位机不需要这样设置,我们很难注意 到这个问题。
补充:.NET技术 , C#