各位大牛们,我在做一个嵌入式项目的上位机部分,涉及到操控下位机并返回信息。
因为是初学者,不知道从何下手。
比如现在一个读卡器的读写问题。UI有3个按钮,分别发送不同指令,下位机根据指令返回信息。我用SerialPort的DataReceive接收时,会发生第一次连接失败,第二次按才成功。后来知道是后台线程不同步了。
1 public void FICCard_DataReceived(object sender, SerialDataReceivedEventArgs e) 2 { 3 if (ComPort.Closing)//如果正在关闭,则退出监听 4 { 5 return; 6 } 7 try 8 { 9 this.Invoke((EventHandler)(delegate 10 { 11 ComPort.Listening = true; 12 string buf = ComPort.getInstance().ReadExisting(); 13 result = buf.Replace("\r", "\r\n"); 14 })); 15 } 16 finally 17 { 18 ComPort.Listening = false; 19 } 20 }
1 /// <summary> 2 /// 连接读卡器 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void myButton1_Click(object sender, EventArgs e) 7 { 8 ComPort.sendData(Order.ic_instruction.ic_connect_order); 9 if (result == "OK") 10 { 11 textBox2.Text = "读卡器连接成功"; 12 isConnected = true; 13 } 14 else 15 { 16 textBox2.Text = "读卡器连接失败,请检查串口。"; 17 } 18 result = ""; 19 }
后来我改成不用串口的监听事件,发送后sleep(100)然后直接读取,这种情况下成功了。
不过好像这种方法不是很好吧。
还有个问题:如果用户连续点击多个按钮,发送很多指令时,这时候怎么处理。
可以发个大点的案例给我看看吗?
以我经验是你最好联系硬件生产厂商,记他们提供一个demo.你根据demo修改成你需要的东西 ;另外,你发送完成后,一直监听就行了;
那接收的结果在事件里面判断么?
@hjx595:
事件里的函数尽可能写的短小,以防止因为处理耗时太长导致的阻塞,建议将接受的结果交给一个缓冲区,从而让另一个线程去处理
你的dataReceive函数是不是没有注册,所以你不会接收到数据?
假定你的串口对象即SerialPort叫做 sp,添加如下代码,则会在接收数据时自动调用sp_DataReceived函数
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
这样就自动开启多线程了啊
下位机返回给你的数据显示到UI 上了吗