- 1、配置串口信息
- 2、打开串口
- 3、发送数据
- 4、接收数据
- 1)无返回值
- 2)有返回值
- 5、关闭串口
- 6、释放资源
我这里是项目要求,基于 .net framework4.0 框架。
功能实现主要依靠.net提供的 System.IO.Ports.SerialPort 类。
串口通信分为6个步骤: 1、配置串口信息
根据设备厂商提供的串口对接说明实例化SerialPort对象。
//设置串口属性
var ComDevice = new SerialPort
{
PortName = "COM1", //串口
BaudRate = 4800, //波特率
Parity = Parity.None, //校验位
DataBits = 8, //数据位
StopBits = StopBits.One, //停止位
WriteTimeout = 1000, //设置串口写入数据阻塞时长,阻塞到写入数据或超时(这里为1秒)
ReadTimeout = 1000, //设置串口读取数据阻塞时长,阻塞到读取数据或超时(这里为1秒)
};
2、打开串口
///3、发送数据/// 开启端口 /// ///public bool OpenPort() { try { if (!ComDevice.IsOpen) { //开启串口 ComDevice.Open(); } } catch (Exception ex) { Console.WriteLine("未能成功开启串口:" + ex.Message); return false; } return true; }
注意设置WriteTimeout 。如果没设置,调用ComDevice.Write之后可能会卡死。
///4、接收数据 1)无返回值/// 将编码后的消息传递给串口 /// /// ///public bool SendData(byte[] bytesData) { //串口已开启 if (ComDevice.IsOpen) { try { //将消息传递给串口 ComDevice.Write(bytesData, 0, bytesData.Length); return true; } catch (Exception ex) { Console.WriteLine("发送失败:" + ex.Message); } } else { Console.WriteLine("串口未开启"); } return false; }
通过SerialPort对象的DataReceived委托实现。
//接收数据
ComDevice.DataReceived += new SerialDataReceivedEventHandler((sender, e) =>
{
//开辟接收缓冲区
byte[] bytesData = new byte[ComDevice.BytesToRead];
//从串口读取数据
ComDevice.Read(bytesData, 0, bytesData.Length);
//数据解码,根据设备厂商约定的方式解码
var data = Encoding.ASCII.GetString(bytesData);
});
2)有返回值
从串口缓冲区循环读取,直到读到有效数据,返回有效数据。
有效数据的标识根据设备厂商的约定设置。
///5、关闭串口/// 循环读取串口数据 /// /// 数据标识 /// 串口 ///private string CirclularReadData(string key) { for (int i = 0; i < 50; i++) { int bytesRead = ComDevice.BytesToRead; //获取接收缓冲区中数据的字节数 //接收缓冲区数据不为空,读取缓冲池数据 if (bytesRead > 0) { //开辟接收缓冲区 byte[] bytesData = new byte[bytesRead]; //从串口读取数据 ComDevice.Read(bytesData, 0, bytesData.Length); //数据编码,根据设备厂商约定的方式编码 var data = Encoding.ASCII.GetString(bytesData); Console.WriteLine($"【串口】缓冲区数据读取(第{i}次):" + data); //如果检测到标识,退出,并返回数据 if (data.Contains(key)) { return data; } } //接收缓冲区数据为空,阻塞当前进程,2s else { Console.WriteLine("【串口】缓冲区暂无可读数据,等待2s"); Thread.Sleep(2000); } } return null; }
///6、释放资源/// 关闭串口 /// /// ///public bool ClosePort(ref string msg) { try { if (ComDevice.IsOpen) { ComDevice.Close(); } } catch (Exception ex) { Console.WriteLine("串口关闭错误:" + ex.Message); return false; } return true; }
这点很重要,串口用完就要立即释放。
ComDevice.Dispose();



