#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
```c
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);
}
}
设置一个定时器,发送的时候,打开定时器,同时计算时间,定时3秒内,在定时器中断中改变状态。类似长按短按的功能。