在STM8S003單片機最小系統上實現modbus通信協議,單片機做為從機,接收主機發送的指令,實現modbus簡單通信,僅支持讀多個保持寄存器(03),寫單個保持寄存器(06),寫多個保持寄存器(16),這三個指令。
代碼注釋完整,部分源碼:完整源碼見附件- #include "modbus.h"
- #include "crc16.h"
- #include "uart.h"
- extern u8 ReceiveBuf[MaxDataLen];
- extern u8 RecIndexLen;
- u8 SendBuf[MaxDataLen] = {0};
- u16 StartRegAddr = 0;
- u8 err = 0; //錯誤代碼
- u8 HoldReg[16] = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; //存儲8路輸出功率值
- /*
- 錯誤代碼說明:
- 0x01 不是支持的功能碼
- 0x02 起始地址不在規定范圍內
- 0x03 寄存器數量不在規定范圍內
- 0x04 數據校驗錯誤
- */
- //處理接收到的數據
- // 接收: [地址][功能碼][起始地址高][起始地址低][總寄存器數高][總寄存器數低][CRC低][CRC高]
- void DisposeReceive( void )
- {
- u16 CRC16 = 0, CRC16Temp = 0;
- if( ReceiveBuf[0] == SlaveID ) //地址等于本機地址 地址范圍:1 - 32
- {
- CRC16 = App_Tab_Get_CRC16( ReceiveBuf, RecIndexLen - 2 ); //CRC校驗 低字節在前 高字節在后 高字節為報文最后一個字節
- CRC16Temp = ( ( u16 )( ReceiveBuf[RecIndexLen - 1] << 8 ) | ReceiveBuf[RecIndexLen - 2] );
- if( CRC16 != CRC16Temp )
- {
- err = 4; //CRC校驗錯誤
- }
- StartRegAddr = ( u16 )( ReceiveBuf[2] << 8 ) | ReceiveBuf[3];
- if( StartRegAddr > 0x07 )
- {
- err = 2; //起始地址不在規定范圍內 00 - 07 1 - 8號通道
- }
- if( err == 0 )
- {
- switch( ReceiveBuf[1] ) //功能碼
- {
- case 3: //讀多個寄存器
- {
- Modbus_03_Slave();
- break;
- }
- case 6: //寫單個寄存器
- {
- Modbus_06_Slave();
- break;
- }
- case 16: //寫多個寄存器
- {
- Modbus_16_Slave();
- break;
- }
- default:
復制代碼 完整工程源碼:
STM8S_UARTV0.1.zip
(553.09 KB, 售價: 5 E幣)
2021-5-9 02:57 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|