程序发送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} "); 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); } }
工程源码下载地址:https://github.com/lizhiqiang0204/UartSendTimeOutRetryNum