C#串口接收不同步问题
第一次接触串口通信我在上位机发送一个指令,然后下位机会返回一个信息。然后上位机根据信息判断。
public void FICCard_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (ComPort.Closing)//如果正在关闭,则退出监听
{
return;
}
try
{
this.Invoke((EventHandler)(delegate
{
ComPort.Listening = true;
string buf = ComPort.getInstance().ReadExisting();
result = buf.Replace("\r", "\r\n");
}));
}
finally
{
ComPort.Listening = false;
}
}
private void myButton1_Click(object sender, EventArgs e)
{
ComPort.sendData(Order.ic_instruction.ic_connect_order);
if (result == "OK")
{
textBox2.Text = "读卡器连接成功";
}
else
{
textBox2.Text = "读卡器连接失败,请检查串口。";
}
result = "";
}
网上找的资料,监听是开了另一个线程,当我点击button事件,发送同时后台也在接收,所以后面的判断都是旧的数据,再点一次才是上一次的数据。
要怎么改才能让信息及时判断呢。不要写在接收事件里,因为有几个按钮,发送不同的数据。
请教各位大牛们。 c# 串口 同步 --------------------编程问答-------------------- 没人么?自己顶个 --------------------编程问答-------------------- 我也是新手,也正在做类似的东西,有个想法。你可以是每次发送的时候打开串口,收到数据后或者是超时没收到数据就引发错误,关闭串口,不要用一直打开串口的方法。在button事件里打开串口,Receive事件里收完后关闭串口,同时也清除缓冲区内容,这些方法在serialPort的类里面都有,这样你就能正确的收到了对应发送的数据。 --------------------编程问答-------------------- ComPort.DiscardOutBuffer();
ComPort.DiscardInBuffer();
ComPort.sendData(Order.ic_instruction.ic_connect_order);
.....
--------------------编程问答--------------------
这个思路不错。
我想你可能理解错我的问题。你试试发送数据后立刻判断返回值是否符合,这时候就像2条线程各干各的事。
我的问题早解决了。加了个定时器,当发送完数据,就打开定时器去读取那个公共变量,读取完就关闭定时器。这样好像跟上面的方法一样,不过却可以读到数据。我也不知道为什么。。。
补充:.NET技术 , C#