国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
STM8S003單片機modbus協議簡單通信示例
[打印本頁]
作者:
bosa
時間:
2021-5-9 02:57
標題:
STM8S003單片機modbus協議簡單通信示例
在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幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0