目录
1,前言
2,安装虚拟串口软件
3,新建项目,加入 flyfire.CustomSerialPort
4,flyfire.CustomSerialPort 说明
5,开始使用 flyfire.CustomSerialPort
6,实现把数据写入串口
7,实现监听串口消息、多设备进行通讯
8,Modbus 协议的实现例子
1,前言
开发环境:在 Visual Studio 2017,.NET Core 2.x
串口通讯用于设备之间,传递数据,物联网设备中广泛使用串口方式连接通讯,物联网通讯协议 :Modbus 协议 ASCII、RTU、TCP模式是应用层的协议,与通讯方式无关。
笔者现在实现的是 串口通信,实现后,可以在上层加上 Modbus 协议,笔者的另一篇文章即是在串口上实现 Modbus 协议,计算中心向物联网设备发送消息,要求设备响应,传送设备信息、检测状态等。
本文是 串口通讯 的实现。
2,安装虚拟串口软件
由于开发在 Windows,也为了调试方便,使用需要安装虚拟串口软件: Virtual Serial Port Driver
安装完成后
添加串口
请添加 4-6 个串口,COM1,COM2,COM3,COM4 ... ...
关机重启
好了,为了使串口生效,请关机重启(不一定要关机,不过为了避免出现问题,还是关机重启比较好)。
开机后,打开 设备管理器 ,查看 设备 - 端口(COM 和 LPT),出现如下图所示,说明正常
原理
因为是虚拟串口,有些问题需要注意一下
A B(或者说服务端、客户端)不能使用同一个串口,你在设备管理器查看串口时(上面也有图),是不是看到
COM1 -> COM2
COM2 -> COM1
因为这是一个虚拟串口,所以只能是单方向的,所以 A、B 需要分别使用两个串口进行通讯,而虚拟串口把 COM1 - COM2 连接起来了。我们不需要关心这个,这里只是说明一下。
3,新建项目,加入 flyfire.CustomSerialPort
新建一个 .NET Core 控制台项目
名字可以随便起,笔者用了 SerialPortTest ,那我们都用这个吧
添加 flyfire.CustomSerialPort
在项目中 添加 Nuget,搜索 flyfire.CustomSerialPort ,然后安装
把类库需要的 Linux 依赖库添加到项目中,关于原因、添加方法,可以看笔者的另一篇文章 https://www.cnblogs.com/whuanle/p/10499498.html#4
4,flyfire.CustomSerialPort 说明
CustomSerialPort 类,所有功能都集中在这里面了,笔者将详细说明此类下字段、方法等的使用
protected SerialPortStream sp;
- 支持通讯串口通讯的类
public CustomSerialPort(string portName, int baudRate = 115200,
Parity parity = Parity.None, int databits = 8, StopBits stopBits = StopBits.One);
用于初始化一个串口,使用此串口进行通讯
- portName 串口名称
- baudRate 比特率,是指每秒传送的比特(bit)数,默认115200bps,不清楚 -> 百度
- parity 表示奇偶性校验方式,枚举,None:没有校验为,Odd:奇校验,Even:偶检验,Space:总为0,Mark:总为1
- databits 设置数据位,这里表示 8位
- stopBits 停止位,One,One5,Twe方便表示1、1.5、2个停止位
因为串口设备通讯是在 OSI 七层的传输层,所以对这些都有相应的规定。TCP/IP 相对于 串口 来说,不必要关注这些。
public int ReceiveTimeout { get; set; } //接收超时时间 public bool ReceiveTimeoutEnable { get; set; } public bool RtsEnable { get; set; } //不详 public bool DtrEnable { get; set; } //不详 public bool IsOpen { get; } //检测是否在使用 public StopBits StopBits { get; set; } //枚举,上面说明的 public int DataBits { get; set; } //上面说明了 public Parity Parity { get; set; } //枚举,上面说明了 public int BaudRate { get; set; } public int BufSize { get; set; } public string PortName { get; set; } //使用的串口名
public event CustomSerialPortReceivedEventHandle ReceivedEvent; //一个事件,可以把接收到消息后需要触发的时间绑定到此事件 public static string ByteToHexStr(byte[] bytes); //把比特流转为字符串 public static string[] GetPortNames(); public void Close(); //关闭串口 public void Dispose(); public bool Open(); //释放串口 public void Write(string text); //以字符串的形式写入串口 public void Write(byte[] buffer); //以字节流的方式写入串口(推荐) public void WriteLine(string text); //写入字符串,应该是与Modbus ASCII有关,Ascii方式需要在数据后面加上换行符表示已经结束传送 protected void ReceiveTimeoutCheckFunc(); protected void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e); //后台线程处理,表示收到串口消息后,触发那些事件
以上,就是对 flyfire.CustomSerialPort 的说明,下面笔者说明怎么使用。
5,开始使用 flyfire.CustomSerialPort
新建一个类 SerialSerice.cs
新建一个类 SerialSerice.cs ,设计此类用于提供串口通讯服务。
在 SerialSerice.cs 引入
using flyfire.IO.Ports; using RJCP.IO.Ports;
using System.Threading;
编写以下代码(你可能觉得有些奇怪,原因后面说),先不管这些东西,也不要管为什么这样写
namespace SerialPortTest { /// <summary> /// 用于封装需要的串口通讯 /// </