找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4811|回复: 4
收起左侧

串口转继电器通信协议 自带CRC检验程序 很经典

[复制链接]
ID:228542 发表于 2017-11-19 22:22 | 显示全部楼层 |阅读模式
串口转继电器通信协议 V1.0
协议:自带CRC检验程序   非常经典
0.png
1 简介
RY51SD8P232/485 是一款串口控制继电器模块,针对工业及家庭应用而设计,可用于 工业自动化及物联网系统集成。RY51SD8P232/485 兼容任何主流操作系统,提供两种标准 工业串行通信接口 RS-232 和 RS-485,均可支持高达 115.2kbps 的通信速率。板载 8 路独立 继电器,两种通信接口均支持高达 15 级级联,支持自定义及 Modbus RTU 通信协议。

2 关键特性
0.png
   供电接口
输入直流电压 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 级联方式示意图如下所示。
0.png
在通信过程中需保证所有模块通信波特率相同,通信波特率由拨码开关 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校验。
0.png
地址: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 函数
单片机源程序如下:
  1. /* CRC16  计算函数, ptr-数据指针, len-数据长度,返回值-计算出的 CRC16  数值 */
  2. unsigned int GetCRC16(unsigned char *ptr, unsigned char len)
  3. {
  4. unsigned int index;
  5. unsigned char crch = 0xFF; //高 CRC  字节
  6. unsigned char crcl = 0xFF; //低 CRC  字节
  7. unsigned char code TabH[] = { //CRC  高位字节值表
  8. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  9. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  10. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  11. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  12. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  13. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  14. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  15. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,


  16. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  17. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  18. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  19. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  20. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  21. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  22. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  23. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  24. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  25. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  26. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  27. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  28. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  29. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  30. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  31. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  32. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  33. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;
  34. unsigned char code TabL[] = { //CRC  低位字节值表
  35. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
  36. 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  37. 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
  38. 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
  39. 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
  40. 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  41. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
  42. 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  43. 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
  44. 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  45. 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
  46. 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  47. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
  48. 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  49. 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  50. 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  51. 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
  52. 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  53. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
  54. 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  55. 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
  56. 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  57. 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
  58. 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  59. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
  60. 0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
  61. while (len--) //计算指定长度的 CRC
  62. {        index = crch ^ *ptr++; crch = crcl ^ TabH[index]; crcl = TabL[index];
  63. }
  64. return ((crch<<8) | crcl);
  65. }

  66. ……………………

  67. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
串口转继电器通信协议 V1.0.pdf (1006.28 KB, 下载次数: 42)

评分

参与人数 1黑币 +5 收起 理由
七九六 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:344633 发表于 2018-7-18 15:53 | 显示全部楼层
楼主真厉害         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表