WPF 串列埠帶有應答機制,重發次數和超時時間的簡單示例
阿新 • • 發佈:2020-09-08
程式傳送456,如果收到123則認為傳送成功,重發次數3次,每次檢測時間間隔1秒,效果如下
#region 串列埠傳送 //str 是傳送的字元,retry_num 是重發次數timeout 是超時時間 public bool UartSend(string str,UInt32 retry_num, UInt32 timeout) { try { myUart.IsReceive = false;//傳送資料前重置接收標誌 for傳送方法(int i = 0; i < retry_num; i++) { myUart.UartSerialPort.Write(str);//串列埠傳送資料 while (myUart.IsReceive == false) { Thread.Sleep(10); count++; if (count >= timeout / 10) break; } if (count < timeout / 10) //如果在規定的時間內收到了應答,則直接返回,如果沒有應答則繼續重發 return true; WriteLog(Brushes.Red, $"傳送次數 + {i} \r\n"); count = 0; }return false;//如果傳送次數超過3次,依然沒有收到應答,則認為傳送指令失敗 } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } } #endregion
private void ModbusPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { Thread.Sleep(100);//延緩一會,用於防止硬體傳送速率跟不上快取資料導致的快取資料雜亂 int len = UartSerialPort.BytesToRead; Byte[] readBuffer = new Byte[len]; UartSerialPort.Read(readBuffer, 0, len); //將資料讀入快取 if(readBuffer[0] == 49 && readBuffer[1] == 50 && readBuffer[2] == 51)//如果收到了"123"字元,則認為收到應答 IsReceive = true; } catch (Exception exception) { //MessageBox.Show(exception.Message); } }接收方法