C#串口编程(1)
-
概念
串口
可以接受CPU并行数据字符转换,为连续的串行数据流发送出去,同时可接受的串行数据流转换为并行的数据字符供给CPU的器件
串口通讯
串口按位(bit)发送和接收字节,尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另外一根线接收数据。
串口最重要的参数是波特率、数据位、停止位和奇偶校验。
波特率
衡量符号传输速率的参数,指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数。
如:每秒钟传送960个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为960Bd,比特率为10位*960个/秒=9600bps
数据位
衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位 ,标准的值是6、7和8位。
标准的ASCII码是0-127(7位),扩展的ASCII码是0-255(8位)。
如果数据使用简单的文本(标准的ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始位、停止位、数据位和奇偶校验位。
停止位
用于表示单个包的最后几位,典型的值为1,1.5和2.由于数据是在传输线上定时的,并且每个设备有其自己的时钟,很可能在通信中两台设备间出现了小小不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
校验位
串口通信中一种简单的检错方式,四种检错方式:偶、奇、高和低。没有校验位也是可以的
串口通信的接口标准
RS-232C,RS-232,RS-422A,RS-485等。常用RS-232和RS-485
串口操作类
System.IO.Port.SerialPort
常用字段
名称 | 说明 |
PortName | 获取或设置通信端口 (如:COM3) |
BaudRate | 获取或设置串行波特率(如:9600) |
DataBits | 获取或设置每个字节的标准数据位长度 |
Parity | 获取或设置奇偶数校验检查协议 |
StopBits | 获取或设置每个字节的标准停止位数 |
案例
private SerialPort serialPort;
private void init()
{
serialPort = new SerialPort();
//串口名称
serialPort.PortName = "COM3";
//串行波特率
serialPort.BaudRate = 9600;
//每个字节的标准数据长度
serialPort.DataBits = 8;
//设置停止位
serialPort.StopBits = StopBits.One;
//读写超时时间 单位为毫秒
serialPort.ReadTimeout = 500;
serialPort.WriteTimeout = 500;
}
名称 | 说明 |
Open | 打开一个新的串行端口连接 |
Close | 关闭端口连接 |
GetPortNames | 获取当前计算机串行端口名称数组 |
Read | 从SerialPort输入缓冲区读取 |
ReadExisting | 读取SerialPort对象的流和输入缓冲区中所有立即可用的字节 |
Write | 将数据写入串行端口输出缓冲区 |
public void Test()
{
if (serialPort == null || serialPort.IsOpen)
{
return;
}
//打开串口
serialPort.Open();
//读取串口中的内容
serialPort.ReadExisting();
//如果串口出于打开状态,则关闭。
if (serialPort.IsOpen)
{
serialPort.Close();
}
}
名称 | 说明 |
DataReceived | 表示将处理SerialPort对象的数据接收事件的方法 |
示例:
public void Test2()
{
//设备监听回调
serialPort.DataReceived += SerialPort_DataReceived;
}
//回调方法
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//获取可以读取的字节数
int len = serialPort.BytesToRead;
//创建缓存数据的数组
byte[] buff = new byte[len];
//把数据读取到buff数组中
serialPort.Read(buff, 0, len);
//将byte[]数组转换成string类型
string data = Encoding.Default.GetString(buff);
}