using System.IO.Ports;  // 引入串口命名空间

public static string Handshake(SerialPort serialPort)
{
    string handshake = '?';  // 握手信号
    string received = '';  // 接收到的数据
    int count = 0;  // 发送次数计数器
    int tCount = 0;  // 接收到T的计数器

    // 发送握手信号
    serialPort.Write(handshake);

    // 循环等待接收数据
    while (count < 50 && tCount < 24)
    {
        // 暂停20毫秒
        System.Threading.Thread.Sleep(20);

        // 判断是否有数据可读
        if (serialPort.BytesToRead > 0)
        {
            // 读取数据
            char c = (char)serialPort.ReadChar();
            received += c;

            // 判断是否握手成功
            if (received.Contains('.'))
            {
                // 发送T信号
                for (int i = 0; i < 24; i++)
                {
                    serialPort.Write('T');
                    System.Threading.Thread.Sleep(3);
                }
                return '.';
            }
            else
            {
                // 继续发送握手信号
                serialPort.Write(handshake);
                count++;
            }

            // 判断是否接收到T
            if (c == 'T')
            {
                tCount++;
            }
        }
    }

    // 未握手成功,返回空字符串
    return '';
}

方法说明:

该方法实现以下功能:

  1. 发送握手信号 '?',并等待设备返回 '.' 表示握手成功。
  2. 如果在 50 次发送后没有收到 '.',则退出握手并返回空字符串。
  3. 握手成功后,发送 24 个 'T' 信号,并等待设备返回数据。
  4. 如果接收到的数据字符数大于等于 24,则返回 '.',表示数据发送成功。

代码说明:

  • handshake:存储握手信号。
  • received:存储接收到的数据。
  • count:记录握手信号发送次数。
  • tCount:记录接收到的 'T' 字符数量。
  • serialPort.Write(handshake):发送握手信号。
  • System.Threading.Thread.Sleep(20):暂停 20 毫秒。
  • serialPort.BytesToRead:判断是否有数据可读。
  • serialPort.ReadChar():读取一个字符。
  • received.Contains('.'):判断接收到的数据中是否包含 '.'。
  • serialPort.Write('T'):发送 'T' 信号。
  • System.Threading.Thread.Sleep(3):暂停 3 毫秒。

使用示例:

// 创建串口对象
SerialPort serialPort = new SerialPort("COM1", 9600);

// 打开串口
serialPort.Open();

// 调用握手方法
string result = Handshake(serialPort);

// 判断握手结果
if (result == '.')
{
    // 握手成功
    Console.WriteLine("握手成功!");
}
else
{
    // 握手失败
    Console.WriteLine("握手失败!");
}

// 关闭串口
serialPort.Close();
C# 串口握手与数据发送方法 - 实现可靠通信

原文地址: https://www.cveoy.top/t/topic/jGpK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录