zoukankan      html  css  js  c++  java
  • 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} 
    ");
    
                        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

  • 相关阅读:
    两数之和
    数组,链表,跳表
    第二讲:增长全景图
    三数之和
    第一讲:增长的本质
    移动零
    八十忆双亲+师友杂记
    java:从命令行接收多个数字,求和之后输出结果
    编程的精义读后感
    java语言基础第三讲作业
  • 原文地址:https://www.cnblogs.com/lizhiqiang0204/p/13631541.html
Copyright © 2011-2022 走看看