串口通信基础知识
串口通信基础知识
串口对象
SerialPort
serialPort:串口通信的编程接口,.NET 提供了内置的 System.IO.Ports.SerialPort 类,用于 Windows 平台的串口通信。
重要参数:
- 波特率(BaudRate):决定数据的传输速度,常见 9600,115200。
- 数据位(DataBits):表示每个字符的数据位数,通常位 8 位。
- 校验位(Parity):用于数据的错误检测,无校验(None)、奇校验(Odd)、偶校验(Even)等。
- 停止位(StopBits):表示数据帧的结束标志,通常位为 1 位。
串口通信的双方参数配置要保持一致。
创建方式
// 获取当前计算机所有有效的端口名称数组
string[] portNames = SerialPort.GetPortNames();
foreach (string portName in portNames)
{cboPortNames.Items.Add(portName);
}// 对象实例化
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.ReadTimeout = 1000; // 读取超时(毫秒)
serialPort.WriteTimeout = 1000; // 写入超时// 或者 使用带参数构造函数创建
SerialPort serialPort = new SerialPort("COM1",9600,Parity.None,8,StopBits.One)
{ReadTimeout = 1000; // 读取超时(毫秒)WriteTimeout = 1000; // 写入超时
};
核心属性与方法
属性/方法 | 说明 | 示例 |
---|---|---|
PortName | 串口号(如 COM3) | serialPort,PortName =“COM3” |
BaudRate | 波特率(如9600) | serialPort.BaudRate=9600 |
DataBits | 数据位(5-9,常用8) | serialPort.DataBits=8 |
Parity | 校验位(None、Even、Odd) | serialPort.Parity=Parity.None |
StopBits | 停止位(One、Two) | serialPort.StopBits =StopBits.one |
ReadBufferSize | 输入缓冲区的大小 | serialPort.ReadBuffersize=4800 |
ReadTimeout | 读取操作未完成时发生超时之前的毫秒数 | serialPort.ReadTimeout= 2000 |
WriteBufferSize | 串行端口输出缓冲区的大小 | serialPort.WriteBuffersize= 4800 |
WriteTimeout | 写入操作未完成时发生超时之前的毫秒数 | serialPort.WriteTimeout= 2000 |
Open() | 打开串口 | serialPort.Open() |
Close() | 关闭串口 | serialPort.Close() |
Write() | 发送字节数组 | serialPort.Write(data,0,data.Length) |
ReadExisting() | 读取接收缓冲区所有字符 | string received=serialPort.ReadExisting() |
打开串口
serialPort.Open();
if(serialPort.IsOpen)
{lblConnection.Text = "已连接";
}
关闭串口
serialPort.Close();
if(!serialPort.IsOpen)
{lblConnection.Text = "已断开";
}
发送信息
serialPort.Write("Hello,Welcome");
seria1Port.write("Hi,你好”); // 能发送,但commix无法解析,只支持英文、数字、符号string str ="你好,Leah!";
byte[] bytes = Encoding.UTF8.GetBytes(str); // UTF8下,一个汉字3个字节
serialPort2.Write(bytes,0,bytes,Length); // 发送字节数组
接收信息
// 返回缓冲区内的所有字符,一个字符串,有数据就读取,没数据就为空字符串,不会卡线程
string receivestr = serialPort2.ReadExisting();// 定义缓冲区
byte[] recBytes = new byte[10];
// 等一会儿,接收需要时间
Thread.sleep(1000);
// 读取输入缓冲区的字节数组,写入指定缓冲区,返回实际读到的数量
int count = serialPort2.Read(recBytes,0,recBytes.Length);
// 将缓冲区中的字节数组转换为字符串
string str = Encoding,UTF8,Getstring(recBytes,0,count).Trim();// 从缓冲区读一个字节(每次调用)
byte one = serialPort2.ReadByte();
// 读取一个字符
serialPort2.Readchar();
// 读到换行符为止
serialPort2,ReadLine();
// 读到特定字符为止,返回读到的字符串。如果没有特定字符,会一直卡着
string str= serialPort2.ReadTo(".");// 接收缓冲区里可读取的字节数---有风险----信息已发送后才行
int len = serialPort2.BytesToRead;
// 读取可读取的字节数组
serialPort2.Read(recBytes,0,1en);
数据接收事件
- 关键事件:
DataReceived
(数据到达时触发) - 实现异步接收:
// 当前输入缓冲区中有数据时触发,在创建串口后订阅
serialPort.DataReceived += dataReceived;private void dataReceived(object sender, SerialDataReceiveEventArgs e)
{SerialPort port = (SerialPort)sender;int len = port.BytesToRead;byte[] recbytes = new byte[len];port.Read(recbytes,0,len);
}
串口通信主要情况:
- 数据安全:
DataReceived
事件发送在非 UI 线程中,如果在改事件中需要处理界面逻辑,需通过窗体对象的Invoke
方法同步执行委托更新界面。 - 资源释放:使用
using
或try/finally
确保串口关闭。 - 缓冲区管理:注意及时读取数据,避免缓冲区出现溢出情况。