C# 串口握手与数据发送方法 - 实现可靠通信
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 '';
}
方法说明:
该方法实现以下功能:
- 发送握手信号 '?',并等待设备返回 '.' 表示握手成功。
- 如果在 50 次发送后没有收到 '.',则退出握手并返回空字符串。
- 握手成功后,发送 24 个 'T' 信号,并等待设备返回数据。
- 如果接收到的数据字符数大于等于 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();
原文地址: https://www.cveoy.top/t/topic/jGpK 著作权归作者所有。请勿转载和采集!