国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

STM8S003單片機modbus協議簡單通信示例

[復制鏈接]
樓主
bosa 發表于 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 E幣)


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 01:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表