简介
公司给的一个小任务,这篇文章进行详细讲解
题目: modbus串口通讯
主要内容如下:
1、实现使用modbus通讯规约的测试软件;
2、具有通信超时功能;
3、分主站从站,并能编辑报文、生成报文等;
4、计算发送报文次数,接收报文次数,失败通信次数;
5、对接收的数据进行解析。
下面图片可以看出具体的内容:
知识点讲解
该小软件使用的知识如下:
1、modbus通信规约;
2、串口通讯;
3、定时器;
4、多线程;
1、modbus通讯规约
modbus是一个工业上常用的通讯协议,一个通讯约定,包括RTU,ASCII,TCP。该软件使用的RTU。
主站设备查询:
查询消肿的功能号告知被选中的设备要执行何种功能。数据段包括了从站设备要执行的功能的任何附加信息。
从站设备回应:
当从站设备正常回应后,在回应数据里也包括这功能号,并直接截取从站设备收集的数据。如果发生错误,功能号将被修改为用于指出回应消息为错误消息。并在数据段包括该描述的错误信息。错误校测域允许主设备确认消息的内容是否可用,是否正确。
下面的图片解释了modbus的规约的组成:
mobus通讯规约是由从机地址+功能号+数据地址+数据+CRC校验。
从机地址:该规约是单主站/多从站,主站轮询向从站请求的方式进行传输数据,并使用从机地址的方式区分从机。
功能号: 某指令是干啥,一目了然。接收方将通过功能号进行相应的执行功能。
下面为常用功能号:
数据地址:意思是数据存储的地址,从该存储的地址的获取数据。
CRC校验:循环冗余校验码,是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
对于校验,网上资料很多,这里直接上代码:
#region CRC16
public static byte[] CRC16(byte[] data)
{
int len = data.Length;
if (len > 0)
{
ushort crc = 0xFFFF;
for (int i = 0; i < len; i++)
{
crc = (ushort)(crc ^ (data[i]));
for (int j = 0; j < 8; j++)
{
crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
}
}
byte hi = (byte)((crc & 0xFF00) >> 8); //高位置
byte lo = (byte)(crc & 0x00FF); //低位置
return new byte[] { hi, lo };
}
return new byte[] { 0, 0 };
}
#endregion
串口通讯
在C#中实现串口通讯,由于C#微软封装的很好,提供了SerialPort类,命名空间为system.IO.Ports.
下面解释serialPort类编程中常用到的关键字和方法:
常用字段: