1. 程式人生 > 實用技巧 >WPF 串列埠帶有應答機制,重發次數和超時時間的簡單示例

WPF 串列埠帶有應答機制,重發次數和超時時間的簡單示例

程式傳送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);
            }
        }
接收方法