C#串口接收不同步问题

hjx595 2013-03-22 01:38:29
第一次接触串口通信
我在上位机发送一个指令,然后下位机会返回一个信息。然后上位机根据信息判断。
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事件,发送同时后台也在接收,所以后面的判断都是旧的数据,再点一次才是上一次的数据。
要怎么改才能让信息及时判断呢。不要写在接收事件里,因为有几个按钮,发送不同的数据。
请教各位大牛们。
...全文
217 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjx595 2013-03-30
  • 打赏
  • 举报
回复
引用 2 楼 c823443337 的回复:
我也是新手,也正在做类似的东西,有个想法。你可以是每次发送的时候打开串口,收到数据后或者是超时没收到数据就引发错误,关闭串口,不要用一直打开串口的方法。在button事件里打开串口,Receive事件里收完后关闭串口,同时也清除缓冲区内容,这些方法在serialPort的类里面都有,这样你就能正确的收到了对应发送的数据。
这个思路不错。 我想你可能理解错我的问题。你试试发送数据后立刻判断返回值是否符合,这时候就像2条线程各干各的事。 我的问题早解决了。加了个定时器,当发送完数据,就打开定时器去读取那个公共变量,读取完就关闭定时器。这样好像跟上面的方法一样,不过却可以读到数据。我也不知道为什么。。。
Giahim 2013-03-29
  • 打赏
  • 举报
回复
ComPort.DiscardOutBuffer(); ComPort.DiscardInBuffer(); ComPort.sendData(Order.ic_instruction.ic_connect_order); .....
CY中草药 2013-03-29
  • 打赏
  • 举报
回复
我也是新手,也正在做类似的东西,有个想法。你可以是每次发送的时候打开串口,收到数据后或者是超时没收到数据就引发错误,关闭串口,不要用一直打开串口的方法。在button事件里打开串口,Receive事件里收完后关闭串口,同时也清除缓冲区内容,这些方法在serialPort的类里面都有,这样你就能正确的收到了对应发送的数据。
hjx595 2013-03-22
  • 打赏
  • 举报
回复
没人么?自己顶个

110,536

社区成员

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

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

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