資源簡介
ModBus-RTU協(xié)議C封裝 使用C封裝的,可以移植到任何平臺。

代碼片段和文件信息
/*************************************************************************************************************
?*?文件名: MODBUS_RTU.c
?*?功能: MODBUS_RTU通信協(xié)議層
?*?作者: cp1300@139.com
?*?創(chuàng)建時間: 2014-03-24
?*?最后修改時間:2015-07-02
?*?詳細(xì): MODBUS?RTU通信協(xié)議層
2015-04-27:添加發(fā)送延時,防止通信幀結(jié)束時產(chǎn)生干擾
2015-05-20:修復(fù)當(dāng)接收字節(jié)小于2的時候進(jìn)行CRC校驗(yàn)出現(xiàn)異常
2016-04-11:增加初始化標(biāo)記,當(dāng)沒有初始化時,直接退出modbus,增加內(nèi)存檢測,如果內(nèi)存指針為空,則退出
2017-03-06:增加底層接口支持,并且去掉了溢出檢測
2017-03-23:修改名稱錯誤,應(yīng)為為modbus增加所有接口回調(diào)模式,完全與底層通信解耦,移植性能更強(qiáng)
2018-01-27:增加延時接口
*************************************************************************************************************/
#include?“system.h“
#include?“usart.h“
#include?“MODBUS_RTU.h“
//調(diào)試開關(guān)
#define?MODBUS_RTU_DBUG ? 0
#if?MODBUS_RTU_DBUG
#include?“system.h“
#define?modbus_debug(format...) uart_printf(format##__VA_ARGS__)
#else
#define?modbus_debug(format...) /\
/
#endif //MODBUS_RTU_DBUG
/*************************************************************************************************************************
*?函數(shù) : bool?MODBUS_Init(MODBUS_HANDLE?*pHandleu8?*pTxBuff?u16?TxBuffSize?u16?TxByteTimeUs?u16?RxTimeOutMs?
bool?(*?pSendData)(u8?*pDataBuff?u16?DataLen)
int?(*?pReadData)(u8?**pDataBuff?u8?ByteTimeOut?u16?TimeOut?u16?*pReceiveDelay)
void?(*pClearRxData)(void)
void?(*pDelayMS)(u8?ms))
*?功能 : MODBUS?初始化
*?參數(shù) : pHandle:當(dāng)前初始化的MODBUS句柄pTxBuff:發(fā)送緩沖區(qū)指針;TxBuffSize:發(fā)送緩沖區(qū)大小;
TxByteTimeUs:發(fā)送1個字節(jié)的時間(用于RS485收發(fā)切換,特別是發(fā)送后的切換延時)延時大小為0-65535(us);RxTimeOutMs:接收超時單位mspReceiveDelay:返回接收延時,單位ms
pSendCallBack:發(fā)送回調(diào)函數(shù)(pDataBuff:發(fā)送數(shù)據(jù)緩沖區(qū),DataLen:發(fā)送數(shù)據(jù)長度)
pReadCallBack:接收數(shù)據(jù)回調(diào)函數(shù),會等待直到數(shù)據(jù)被寫入到接收緩沖區(qū)(pDataBuff:接收數(shù)據(jù)緩沖區(qū),ByteTimeOut:等待的字節(jié)超時時間,單位msTimeOut:數(shù)據(jù)包超時時間,單位ms)
pClearRxData:清除接收數(shù)據(jù)緩沖區(qū)回調(diào)函數(shù)
pDelayMS:系統(tǒng)ms延時接口
*?返回 : FALSE:初始化失敗;TRUE:初始化成功
*?依賴 : 底層回調(diào)接口
*?作者 : cp1300@139.com
*?時間 : 2014-09-25
*?最后修改時間? :? 2017-03-23
*?說明 :? 發(fā)送緩沖區(qū)必須大于最大數(shù)據(jù)包大小否則會出現(xiàn)內(nèi)存溢出
2017-03-23:增加回調(diào),拋離底層依賴
2018-01-27:增加延時回調(diào)
*************************************************************************************************************************/
bool?MODBUS_Init(MODBUS_HANDLE?*pHandleu8?*pTxBuff?u16?TxBuffSize?u16?TxByteTimeUs?u16?RxTimeOutMs?
bool?(*?pSendData)(u8?*pDataBuff?u16?DataLen)
int?(*?pReadData)(u8?**pDataBuff?u8?ByteTimeOut?u16?TimeOut?u16?*pReceiveDelay)
void?(*pClearRxData)(void)
void?(*pDelayMS)(u8?ms))
{
pHandle->ID?=?0;
if(pHandle?==?NULL)?return?FALSE;
pHandle->WriteRegCnt?=?0; //寫入寄存器次數(shù)
pHandle->ReadRegCnt?=?0; //讀取寄存器次數(shù)
pHandle->ReturnTimeMs?=?0; //數(shù)據(jù)返回時間
pHandle->pTxBuff?=?pTxBuff; //發(fā)送緩沖區(qū)
pHandle->TxBuffSize?=?TxBuffSize; //發(fā)送緩沖區(qū)大小
pHandle->RxTimeOutMs?=?RxTimeOutMs; //接收超時時間
if(pHandle->RxTimeOutMs?20)?pHandle->RxTimeOutMs?=?20; //限制最小為20ms
pHandle->SlaveAddr?=?0; //從機(jī)地址無效?
pHandle->TxByteTimeUs?=?TxByteTimeU
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
????I.A....?????49949??2018-03-23?22:27??ModBus\MODBUS_RTU.c
????I.A....??????8686??2018-03-23?22:27??ModBus\MODBUS_RTU.h
????I.A....??????7525??2018-03-23?22:27??ModBus\MODBUS_SLAVE.c
????I.A....??????1202??2018-03-23?22:27??ModBus\MODBUS_SLAVE.h
?????目錄??????????0??2018-03-23?22:27??ModBus
-----------?---------??----------?-----??----
????????????????67362????????????????????5
評論
共有 條評論