STM8S003单片机modbus协议简单通信示例

[复制链接]
查看12 | 回复0 | 2021-5-9 02:57:28 | 显示全部楼层 |阅读模式
在STM8S003单片机最小系统上实现modbus通信协议,单片机做为从机,接收主机发送的指令,实现modbus简单通信,仅支持读多个保持寄存器(03),写单个保持寄存器(06),写多个保持寄存器(16),这三个指令。
代码注释完整,部分源码:完整源码见附件
  1. #include "modbus.h"
  2. #include "crc16.h"
  3. #include "uart.h"

  4. extern u8 ReceiveBuf[MaxDataLen];
  5. extern u8 RecIndexLen;

  6. u8 SendBuf[MaxDataLen] = {0};
  7. u16 StartRegAddr = 0;
  8. u8 err = 0;                                                        //错误代码

  9. u8 HoldReg[16] = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; //存储8路输出功率值

  10. /*
  11. 错误代码说明:
  12. 0x01  不是支持的功能码
  13. 0x02  起始地址不在规定范围内
  14. 0x03  寄存器数量不在规定范围内
  15. 0x04  数据校验错误
  16. */
  17. //处理接收到的数据
  18. // 接收: [地址][功能码][起始地址高][起始地址低][总寄存器数高][总寄存器数低][CRC低][CRC高]
  19. void DisposeReceive( void )
  20. {
  21.     u16 CRC16 = 0, CRC16Temp = 0;
  22.     if( ReceiveBuf[0] == SlaveID )                                 //地址等于本机地址 地址范围:1 - 32
  23.     {
  24.         CRC16 = App_Tab_Get_CRC16( ReceiveBuf, RecIndexLen - 2 );  //CRC校验 低字节在前 高字节在后 高字节为报文最后一个字节
  25.         CRC16Temp = ( ( u16 )( ReceiveBuf[RecIndexLen - 1] << 8 ) | ReceiveBuf[RecIndexLen - 2] );
  26.         if( CRC16 != CRC16Temp )
  27.         {
  28.             err = 4;                                               //CRC校验错误
  29.         }
  30.         StartRegAddr = ( u16 )( ReceiveBuf[2] << 8 ) | ReceiveBuf[3];
  31.         if( StartRegAddr > 0x07 )
  32.         {
  33.             err = 2;                                               //起始地址不在规定范围内 00 - 07    1 - 8号通道
  34.         }
  35.         if( err == 0 )
  36.         {
  37.             switch( ReceiveBuf[1] )                                //功能码
  38.             {
  39.                 case 3:                                            //读多个寄存器
  40.                 {
  41.                     Modbus_03_Slave();
  42.                     break;
  43.                 }
  44.                 case 6:                                            //写单个寄存器
  45.                 {
  46.                     Modbus_06_Slave();
  47.                     break;
  48.                 }
  49.                 case 16:                                           //写多个寄存器
  50.                 {
  51.                     Modbus_16_Slave();
  52.                     break;
  53.                 }
  54.                 default:
复制代码
完整工程源码: STM8S_UARTV0.1.zip (553.09 KB, 售价: 5 工控币)


回复

使用道具 举报

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

本版积分规则