一、串口参数设置

串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。
在C#中使用System.IO.Ports中的SerialPort类实现对串口的操作,包括设置端口号、波特率、数据位、校验位及停止位等参数,和进行数据接收与发送。

属性名称 释义
PortName 串口名 串口对于操作系统来说是一个文件,如果设置PortName为本机不存在的串口名(即文件名),如“COM7”或“COMK”,Open()打开串口将失败,提示“端口COM7不存在”。
BaudRate 波特率 衡量符号传输速率的参数,单位 bit/s, 默认值9600,即每秒传输1200Byte数据,大约1KB数据。
DataBits 数据位 每个字节的标准数据位长度, 默认值8。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。
StopBits 停止位数 每个字节的标准停止位数,默认值One。用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
Parity 校验位 获取或设置奇偶校验检查协议 默认值None。在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
ReceivedBytesThreshold DataReceived 事件发生前内部输入缓冲区中的字节数 默认值1。
BytesToRead 获取接收缓冲区中数据的字节数。
BytesToWrite 获取发送缓冲区中数据的字节数。

串口参数设置实例代码如下:

using System.IO.Ports;
......
public SerialPort serialPort = new SerialPort();//定义连接端口
serialPort.PortName = "COM1";//设置端口号为COM1
serialPort.BaudRate = 9600;//设置波特率为9600
serialPort.DataBits = 8;//设置数据位为8
serialPort.StopBits = System.IO.Ports.StopBits.One;//设置停止位为1
serialPort.Parity = System.IO.Ports.Parity.None;//设置校验位为无

二、串口数据发送

在System.IO.Ports中共有两种方法发送数据,分别为Write和WriteLine,Write有三种重载,分别为Write(string text)、Write(byte[] buffer, int offset, int count)、Write(char[] buffer, int offset, int count),WriteLine(string text)在写入字符串的后面加了一个NewLine值,示例代码如下:

String[] portnames = SerialPort.GetPortNames();//获取计算机中可用的所有串口号
serialPort.Open();//打开串口
if (!serialPort.IsOpen)
{
   MessageBox.Show("端口打开失败");
   return;
}
byte[] SendData = new byte[5];
Encoding chs = Encoding.GetEncoding("gb2312");
SendData[4] = chs.GetBytes("o")[0];
SendData[3] = chs.GetBytes("l")[0];
SendData[2] = chs.GetBytes("l")[0];
SendData[1] = chs.GetBytes("e")[0];
SendData[0] = chs.GetBytes("h")[0];
serialPort.Write(SendData, 0, 5);//通过字节数组发送“hello”字符串
serialPort.Write("hello");//直接发送“hello”字符串

三、串口数据接收

串口数据接收有两种方式,方式一注册数据接收事件,当串口接收到数据时就会触发该事件,可在事件进行数据处理。实例代码如下:

serialPort.DataReceived += serialPort_DataReceived;//注册数据接收处理事件serialPort_DataReceived
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(50);  //(毫秒)等待一定时间,确保数据的完整性     
    int len = serialPort.BytesToRead;//接收的字节长度
    string receivedata = string.Empty;
    if (len != 0)
    {
        byte[] buff = new byte[len];
        serialPort.Read(buff, 0, len);//接收len长度的字节到buff数组
        receivedata = Encoding.Default.GetString(buff);
    }
    MessageBox.Show("接收数据为:"receivedata);
}

缓冲区数据读取之后,读取的字节会从缓冲区中自动删除。如缓冲区数据未全部取出,那么数据接收事件会第二次被触发。
方式二为在主线程外单独开启一个数据接收线程,接收线程中使用循环不断查询缓冲区是否有接收数据,这里不再提供演示代码。

四、USB转串口驱动下载

在进行程序编写时,有时需要使用笔记本进行串口调试,但大多数笔记本一般没有配备串口,通常会使用USB转串口转接线来连接串口,这时需要安装对应驱动笔记本才能识别串口,这里分享一个驱动下载地址,需要注意的是对于不同串口需要安装不同驱动,而通常的USB转串口驱动一般为下载地址中的CH343SER.ZIP。

参考文档

C#串口SerialPort常用属性方法
ASCII码与16进制转换对照表
C#中COM串口连接、发送、接收数据
驱动&工具

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐