串口转继电器通信协议 V1.0
协议:自带CRC检验程序 非常经典
1 简介
RY51SD8P232/485 是一款串口控制继电器模块,针对工业及家庭应用而设计,可用于 工业自动化及物联网系统集成。RY51SD8P232/485 兼容任何主流操作系统,提供两种标准 工业串行通信接口 RS-232 和 RS-485,均可支持高达 115.2kbps 的通信速率。板载 8 路独立 继电器,两种通信接口均支持高达 15 级级联,支持自定义及 Modbus RTU 通信协议。
2 关键特性
供电接口
输入直流电压 9~30V,标准 5.5-2.1 插孔供电接口和工业接线端子,两种供电方式。为主 从供电模式,当插孔处电源接入时,无论接线端子是否连接电源,均由插孔处供电。当插孔处未插入电源时,才可由接线端子供电。
电源指示灯 当有电源接入时,电源指示灯点亮。
8 位拨码开关 用于设置通信波特率、设置通信方式、模块地址设置,注意设置好后,模块重新加电生效。
拨码开关从左往右依次为 bit1 至 bit8,每一位的具体功能后续介绍。拨码开关的某一位 往上拨表示逻辑“0”,往下拨表示逻辑“1”。
通信方式选择跳线,如上图所示,当跳线帽连接至左边时为 RS-232 通信,当跳线帽连接
至右边时为 RS-485 通信,默认为 RS-232 通信。
通信指示灯 发送或接收数据时,通信灯闪烁。
8 路继电器状态指示灯 继电器某路打开时,对应的指示灯点亮。
8 路继电器接线端子
每路继电器配备了一个三脚的接线端子,以继电器 S1 为例,如上图,中间和左边管脚
为常闭合状态,中间与右边管脚为常断开状态。继电器打开时,中间与左边管脚断开, 中间与右边管脚连接,其它继电器与此相同。负载与设备接线方法如上图所示。
5 级联方式
模块可实现最多 15 级主从模式级联,RS-485、RS-232 级联方式示意图如下所示。
在通信过程中需保证所有模块通信波特率相同,通信波特率由拨码开关 bit1->bit3 设定。
主机通过模块地址来区分网络中的模块,因此,需保证每个模块的地址均不相同。,模 块地址由拨码开关 bit5->bit8 设定。
6 波特率设置
最高波特率可达 115200bps,由拨码开关 bit1->bit3 设定,设置如下图所示,设置好后, 模块重新上电生效。
7 模块地址设置
模块地址由拨码开关 bit5->bit8 设定,设置范围为:0x00~0x0E 共 15 个地址,如下图所 示。设置好后,模块重新上电生效。
8 通信协议
支持 modbus RTU 以及自定义两种通信协议。通信协议由拨码开关 bit4 来选择,当 bit4 为逻辑 1 时,如下图右边所示,设置为 modbus RTU 通信协议。当 bit4 为逻辑 0 时,如下图 左边所示,设置为自定义通信协议。
Modbus RTU 通信协议一帧完整的数据包括“地址+命令+数据+校验”内容。数据发送顺
序为地址在前,最后为校验。字节发送为低位至高位的顺序。校验数值为“地址+命令+数据” 计算结果。如下图所示,一帧数据包括 8bit 地址,16bit 命令,N 个字节数据,2 字节的 CRC16校验。
地址:8bit 地址值为模块的地址;
命令:命令的字节 1 表示“写”继电器或 “读”继电器,0x01 表示“写”,即控制模块继 电器开或关,0x02 表示 “读”,即读取模块继电器状态。
命令的字节 2 表示控制的继电器开关的方式,0x11:同时控制 8 个继电器中任意开 或关。0x22:打开某几个或全部,其他保持不变。0x33:关闭某几个或全部,其他保 持不变。具体哪些继电器由数据 1 决定。0x44:与字节 1 的 0x02 配合使用。
数据:数据 1 为一个字节即 8bit,每一 bit 对应的一个继电器,最高位对应的继电器 S8,依
顺序排列,最低位对应继电器 S1。对应位为“1”表示打开继电器,“0”表示关闭继 电器。数据 2~N 为可选数据。
CRC16 校验:为前面所以数据的校验值,共包括 2 个字节,高字节在前,低字节在后。 注:地址 0x0F 为广播地址,只有“写”继电器时起作用,对所有级联模块同时写数据,与
模块实际地址无关。 应用实例:
0x00 0x01 0x11 0x01 0x9C 0x74
使地址为 0x00 的模块,打开继电器 1 其它关闭。其中,0x9C 0x74 分别为前面数据的
CRC16 校验高、低字节。
0x00 0x01 0x22 0x02 0xC8 0x85
使地址为 0x00 的模块,打开继电器 2 其它不变。其中,0xC8 0x85 分别为前面数据的
CRC16 校验高、低字节。
0x0E 0x01 0x33 0x7F 0x06 0x1C
使地址为 15 的模块,关闭继电器 8 其它不变。其中,0x06 0x1C 分别为前面数据的
CRC16 校验高、低字节。
0x01 0x02 0x44 0x21 0x53
读取地址为 0x01 模块 8 各继电器状态,模块返回数据如下:
0x01 0x02 0x01 0xFF 0xE1 0xC8
读模块时,返回数据格式如下所示:
返回的地址为被读模块的地址,命令字节 1、2 为固定值 0x02、0x01,数据 1 为 8 路继
电器的状态值,某一位为 1 表示该路继电器为打开,为 0 表示关闭状态。最后两个字节为前 面 4 字节的 CRC16 校验值。
自定义通信:自定义通信方式与 modbus RTU 的唯一区别为,不带 CRC16 校验,即发送和接 收的数据没有最后两个字节。
注:该模块只是实现了 modbus RTU 的部分功能,在实际应用中以上述讲解的通信方式为准。 部分控制数据如下图所示:
9 测试软件
模块配置了测试软件,界面如下图所示,可运行于 XP/win7/win10 等操作系统。软件包
括控制继电器,读取继电器,显示继电器状态以及计算 CRC16 功能。
使用软件时,首先设置好与模块对应的“端口”、“波特率”、“地址码”,然后点击“打 开串口”按钮,若串口成功打开,左边红色指示灯点亮。
若需要控制打开某个继电器则勾选相应的继电器,如果通信方式为 modbus RTU 则勾选 “校验”选项(自定义模式不勾选),点击“控制”按钮,将相应的数据发送出去,发送的 数据将以 16 进制的格式显示在“已发送”编辑框中。
点击“读状态”按钮,接收到的数据将显示在“已接收”编辑框中,继电器的状态将显 示在右上部分 8 个显示小灯处。
另外,软件还集成了 CRC16 校验计算功能,16 进制数据输入格式如下图所示,点击“计 算”按钮,计算结果显示到编辑框中,高字节在前,低字节在后,如下图所示“DC”高字 节,“BC”为低字节。
注:输入数据时中间以空格隔开,注意最后一个数后面请勿添加空格。
10 CRC16 函数
单片机源程序如下:
- /* CRC16 计算函数, ptr-数据指针, len-数据长度,返回值-计算出的 CRC16 数值 */
- unsigned int GetCRC16(unsigned char *ptr, unsigned char len)
- {
- unsigned int index;
- unsigned char crch = 0xFF; //高 CRC 字节
- unsigned char crcl = 0xFF; //低 CRC 字节
- unsigned char code TabH[] = { //CRC 高位字节值表
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
- 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
- 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
- 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
- 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
- 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
- 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
- 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
- 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
- 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
- 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;
- unsigned char code TabL[] = { //CRC 低位字节值表
- 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
- 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
- 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
- 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
- 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
- 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
- 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
- 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
- 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
- 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
- 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
- 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
- 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
- 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
- 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
- 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
- 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
- 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
- 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
- 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
- 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
- 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
- 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
- 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
- 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
- 0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
- while (len--) //计算指定长度的 CRC
- { index = crch ^ *ptr++; crch = crcl ^ TabH[index]; crcl = TabL[index];
- }
- return ((crch<<8) | crcl);
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
串口转继电器通信协议 V1.0.pdf
(1006.28 KB, 下载次数: 42)
|