亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        μC/Modbus在STM32上的移植及從站設(shè)計(jì)

        2014-12-18 11:14:27陳文禮饒毅高翔
        現(xiàn)代電子技術(shù) 2014年24期

        陳文禮+饒毅+高翔

        摘 ?要: 為了解決工業(yè)測控系統(tǒng)儀表數(shù)量多,通信協(xié)議不兼容,組網(wǎng)困難的問題,在此給出一種Modbus從站設(shè)計(jì)方法。從站系統(tǒng)平臺(tái)基于STM32F103處理器和μC/OS?Ⅱ嵌入式實(shí)時(shí)操作系統(tǒng),通過移植μC/Modbus協(xié)議棧實(shí)現(xiàn)Modbus RTU從站通信功能。在此詳細(xì)分析了μC/Modbus的架構(gòu)和工作流程,給出了移植及使用方法,能夠幫助讀者快速開發(fā)出符合標(biāo)準(zhǔn)的Modbus從站設(shè)備。

        關(guān)鍵詞: μC/Modbus; μC/OS?Ⅱ; STM32F103; 從站

        中圖分類號(hào): TN919?34; TP368.1 ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼: A ? ? ? ? ? ? ? ? ? ?文章編號(hào): 1004?373X(2014)24?0090?04

        Transplantation of μC/Modbus on STM32 and slave device design

        CHEN Wen?li, RAO Yi, GAO Xiang

        (Tangshan Kaicheng Electric Control Equipment Group Co., Ltd., Tangshan 063020, China)

        Abstract: In order to reduce instrumentation quantity, realize communications protocol compatibility and solve networking difficulty of industrial measurement and control system, a design method of Modbus slave is presented in this paper. The slave device platform is based on STM32F103 processor and μC/OS?II real?time embedded operating system. Modbus RTU slave communication function is realized by porting μC/Modbus protocol stack. The μC/Modbus architecture and workflow are analyzed in this paper. The transplantation and use methods are given to help readers to develop a qualified Modbus slave device quickly.

        Keywords: μC/Modbus; μC/OS?II; STM32F103; slave device

        隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,現(xiàn)代工業(yè)測控系統(tǒng)變得越來越復(fù)雜,儀表種類繁多且來自不同廠家,因此通信協(xié)議的標(biāo)準(zhǔn)化、統(tǒng)一化對(duì)整個(gè)系統(tǒng)的聯(lián)網(wǎng)顯得尤為重要。Modbus 協(xié)議是電子儀器儀表的一種通用語言,協(xié)議定義了電子設(shè)備能識(shí)別和使用的信息結(jié)構(gòu),廣泛用于工業(yè)通信領(lǐng)域,其優(yōu)點(diǎn)是實(shí)時(shí)性好,可靠性高,適用于小到中等規(guī)模的數(shù)據(jù)傳輸。

        自1979年由莫迪康公司發(fā)明以來,逐漸成為工業(yè)領(lǐng)域最流行的協(xié)議。盡管目前各種工業(yè)通信協(xié)議不斷涌現(xiàn),但Modbus憑借其簡單而精致的結(jié)構(gòu)以及開放性和無會(huì)員限制的特點(diǎn)仍得到越來越多的支持。國內(nèi)企業(yè)對(duì)Modbus 則更為青睞。幾乎所有工業(yè)設(shè)備、智能儀表等都在使用它作為通信標(biāo)準(zhǔn),HMI和組態(tài)軟件也都把它作為所支持的通信協(xié)議之一。

        μC/Modbus是一個(gè)針對(duì)嵌入式應(yīng)用的通用Modbus 協(xié)議棧,具有結(jié)構(gòu)清晰簡單,響應(yīng)速度快,占用資源少,單任務(wù)多通道等特點(diǎn)。將μC/Modbus移植到 ARM Cortex?M3 處理器上就可以構(gòu)架出高性價(jià)比的嵌入式產(chǎn)品,對(duì)于減少開發(fā)周期和提高產(chǎn)品的質(zhì)量等方面有著重要的意義。

        1 ?μC/Modbus的架構(gòu)及工作流程

        μC/Modbus源代碼包括有4個(gè)文件夾:Source、OS、Ports、Product。其中Source文件夾下的程序是相對(duì)獨(dú)立的、與硬件平臺(tái)和操作系統(tǒng)無關(guān)的部分,也就是說這部分在使用時(shí)不需要做任何改動(dòng)。包含文件:MB.C、MB.H,MB_DEF.H,MB_UTIL.C,MBS_CORE.C 。

        以下3個(gè)文件文件的程序是需要用戶根據(jù)使用的軟硬件平臺(tái)和應(yīng)用需求做相應(yīng)移植和修改的:

        OS???μC/Modbus與操作系統(tǒng)的接口程序。包含文件:MB_OS.C,MB_OS.H。

        Ports???μC/Modbus與CPU的接口程序。包含文件:CPU.H,MB_BSP.C。

        Product???μC/Modbus的配置文件和用戶應(yīng)用程序。包含文件:MB_CFG.H,MB_DATA.C。各模塊之間的關(guān)系如圖1所示。

        μC/Modbus協(xié)議棧要求處理器具有一個(gè)或多個(gè)串行接口、能夠容納Modbus數(shù)據(jù)幀的RAM空間和一個(gè)定時(shí)器。對(duì)操作系統(tǒng)的要求是能夠建立一個(gè)接收任務(wù)和一個(gè)消息事件隊(duì)列。μC/Modbus采用一個(gè)任務(wù)處理所有通道接收的數(shù)據(jù)幀,空閑時(shí)任務(wù)只是等待消息隊(duì)列上的事件。當(dāng)任何通道接收到數(shù)據(jù)幀時(shí),一個(gè)指向收到數(shù)據(jù)幀通道的指針被發(fā)布到消息隊(duì)列上,任務(wù)收到消息后解析該數(shù)據(jù)包,并做相應(yīng)的回復(fù)響應(yīng)。

        μC/Modbus為每個(gè)通道分配一個(gè)MODBUS_CH類型的數(shù)據(jù)結(jié)構(gòu),MODBUS_CH數(shù)據(jù)結(jié)構(gòu)里包括通道號(hào),工作模式,節(jié)點(diǎn)地址,通信參數(shù),超時(shí)計(jì)數(shù),發(fā)送緩存,接收緩存等。串口接收中斷服務(wù)程序會(huì)把收到的字節(jié)放置在接收緩存中,直到收到結(jié)束標(biāo)志。如果該通道被配置用于Modbus ASCII模式,包的末端為一個(gè)換行字符(即0x0A)。如果該通道被配置為Modbus RTU模式,一個(gè)數(shù)據(jù)幀發(fā)送結(jié)束后至少要有3.5個(gè)字節(jié)的空閑時(shí)間(參見Modbus RTU通訊規(guī)范)。本設(shè)計(jì)采用Modbus RTU模式,需要CPU提供一個(gè)定時(shí)器,以保證數(shù)據(jù)幀接收結(jié)束超時(shí)機(jī)制。如圖2所示,μC/Modbus為每個(gè)通道分配的MODBUS_CH數(shù)據(jù)結(jié)構(gòu)里都包含一個(gè)超時(shí)計(jì)數(shù)器TimeoutCtr。串口初始化時(shí),μC/Modbus會(huì)根據(jù)所設(shè)置的波特率計(jì)算出一個(gè)超時(shí)計(jì)數(shù)值。每次收到數(shù)據(jù),該通道的RTU計(jì)數(shù)器都會(huì)重置為超時(shí)計(jì)數(shù)值。例如一個(gè)通道配置為9 600 b/s,那么3.5個(gè)字符的傳輸時(shí)間為3 646 μs,假如CPU定時(shí)周期為1 ms,那么超時(shí)計(jì)數(shù)值為4,為了提高容錯(cuò)性μC/Modbus會(huì)在理論值上多一個(gè)定時(shí)周期,也就是此例最終的超時(shí)計(jì)數(shù)值等于5。串口每次接收數(shù)據(jù)都會(huì)對(duì)計(jì)數(shù)器重置,在定時(shí)中斷里,計(jì)數(shù)值遞減。當(dāng)計(jì)數(shù)值遞減到0時(shí),就會(huì)發(fā)送一個(gè)指向該超時(shí)通道的消息指針。μC/Modbus RTU模式下代碼工作流程如下:

        MB_CommRxTxISR_Handler() ??? MB_BSP.C

        串口收到數(shù)據(jù),并觸發(fā)接收中斷,中斷服務(wù)函數(shù)MB_CommRxTxISR_Handler調(diào)用MB_RxByte()函數(shù)進(jìn)行處理:

        MB_RxByte() ??? MB.C

        根據(jù)通道的工作模式,將接收的數(shù)據(jù)傳遞給ASCII或RTU 處理程序。如果是RTU調(diào)用 MB_RTU_RxByte()。

        MB_RTU_RxByte() ??? MB.C

        串口接收到的數(shù)據(jù)存放到接收緩存RXBUF[]里。由于RTU幀結(jié)束是按時(shí)間定界的,MB_RTU_RxByte()重置通道RTU定時(shí)計(jì)數(shù)器??,表示接收幀還沒有結(jié)束。一個(gè)完整幀的接收完成信號(hào)是通過前面所述的RTU計(jì)時(shí)超時(shí)產(chǎn)生的(參見 MB_RTU_TmrUpdate()???MB.C)。

        MB_OS_RxTask() ??? MB_OS.C

        μC/Modbus所有通信都是由MB_OS_RxTask()接收任務(wù)來處理。任務(wù)等待來自RTU定時(shí)器的超時(shí)消息,表明一個(gè)數(shù)據(jù)幀已接收結(jié)束。該消息實(shí)際上是一個(gè)指向Modbus通道的指針。然后調(diào)用MB_RxTask()(MB.C)判斷是Master還是Slave工作模式,如果是Slave模式則調(diào)用 MBS_RxTask()(MBS_CORE.C)。 MBS_RxTask()根據(jù)ASCII或RTU模式調(diào)用MBS_ASCII_Task()(MBS_CORE.C)或MBS_RTU_Task()(MBS_CORE.C)做該消息的實(shí)際處理:

        MBS_RTU_Task() – MBS_CORE.C

        MBS_RTU_Task()首先判斷接收的幀是否完整,然后調(diào)用MB_RTU_RxCalcCRC驗(yàn)證數(shù)據(jù)是否正確。如果是一個(gè)有效的幀,則調(diào)用MBS_FCxx_Handler()來解析:

        MBS_FCxx_Handler() ??? MBS_CORE.C

        該函數(shù)根據(jù)收到的功能碼,調(diào)用相應(yīng)的功能碼處理函數(shù)。并生產(chǎn)回復(fù)數(shù)據(jù)幀存放在TxFrameData[]數(shù)組里。

        MB_RTU_Tx() ??? MB.C

        如果從站需要回復(fù)一個(gè)數(shù)據(jù)幀給Modbus主站,這個(gè)函數(shù)就會(huì)被調(diào)用。 MB_RTU_Tx()將TxFrameData[]里的數(shù)據(jù)復(fù)制到發(fā)送緩存TXBUF[]中。 并是通過調(diào)用MB_RTU_TxCalcCRC()計(jì)算CRC校驗(yàn)。然后調(diào)用MB_Tx()來啟動(dòng)傳輸。

        MB_Tx()?MB.C

        這個(gè)函數(shù)用來將回復(fù)的數(shù)據(jù)幀發(fā)送到Modbus主站。將指針TxBufPtr指向TXBUF[]并使能發(fā)送完成中斷。通過調(diào)用MB_TxByte()來發(fā)送第一個(gè)字節(jié),在發(fā)送完成中斷里TxBufPtr遞增以發(fā)送下一個(gè)數(shù)據(jù),直到全部發(fā)送完成:

        MB_TxByte()?MB.C

        首先檢查剩余待發(fā)送的字節(jié)數(shù)TxBufByteCtr,如果TxBufByteCtr等于0則表明消息幀全部發(fā)送完成,則關(guān)閉發(fā)送中斷。如果TxBufByteCtr大于0,則調(diào)用MB_BSP.C文件里的串口發(fā)送函數(shù)MB_CommTx1(),將TxBufPtr指向的字節(jié)數(shù)據(jù)發(fā)送到串口。TxBufPtr加1以指向下一個(gè)數(shù)據(jù),TxBufByteCtr減1以記憶剩余待發(fā)送的字節(jié)數(shù)。

        2 ?μC/OS?Ⅱ操作系統(tǒng)接口部分移植

        為了建立Modbus接收任務(wù)及實(shí)現(xiàn)消息機(jī)制, μC/Modbus需要在MB_OS.C文件里實(shí)現(xiàn)3個(gè)函數(shù)和一個(gè)接收任務(wù)。

        MB_OS_Init()

        MB_OS_RxSignal()

        MB_OS_Exit()

        MB_OS_RxTask()

        首先用戶需要定義消息事件變量、任務(wù)優(yōu)先級(jí)及任務(wù)堆棧大小,其中消息單元數(shù)等于Modbus通道數(shù)[1]。

        static ?OS_EVENT ? ? ? ? ? ?*MB_OS_RxQ;

        static ?void ? ? *MB_OS_RxQTbl[MODBUS_CFG_MAX_CH];

        #define ?MB_OS_CFG_RX_TASK_PRIO ? ? ? ? ? ? ? ?3

        #define MB_OS_CFG_RX_TASK_ID ? MB_OS_CFG_RX_

        TASK_PRIO

        #define ?MB_OS_CFG_RX_TASK_STK_SIZE ? ? ? ? ? ?256

        MB_OS_Init ()

        用于初始化μC/OS?II操作系統(tǒng)接口,創(chuàng)建一個(gè)消息隊(duì)列和一個(gè)等待要接收的數(shù)據(jù)包的任務(wù)。主要代碼如下[2]:

        MB_OS_RxQ=OSQCreate(&MB_OS_RxQTbl[0], ?MODBUS_CFG_MAX_CH);

        (void)OSTaskCreateExt((void (*)(void *)) MB_OS_RxTask,

        (void ? ? ? ? ? *) 0,

        (OS_STK *)&MB_OS_RxTaskStk[MB_OS_CFG_RX_TASK_STK_SIZE ? 1],

        (INT8U ? ? ? ? ? ) MB_OS_CFG_RX_TASK_PRIO,

        (INT16U ? ? ? ? ?) MB_OS_CFG_RX_TASK_ID,

        (OS_STK ? ? ? ? *)&MB_OS_RxTaskStk[0],

        (INT32U) MB_OS_CFG_RX_TASK_STK_SIZE,

        (void ? ? ? ? ? *) 0,

        (INT16U)(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));

        MB_OS_RxSignal()

        一個(gè)數(shù)據(jù)包接收結(jié)束時(shí)MB_OS_RxSignal()就會(huì)被調(diào)用。其主要代碼就是向消息隊(duì)列發(fā)布消息OSQPost(MB_OS_RxQ, (void *)pch);其中參數(shù)pch為指向接收到數(shù)據(jù)包的Modbus通道的數(shù)據(jù)結(jié)構(gòu)。

        MB_OS_Exit()

        此函數(shù)在Modbus任務(wù)終止時(shí)被調(diào)用,用于刪除任務(wù)和 消息隊(duì)列。

        OSTaskDel(MB_OS_CFG_RX_TASK_PRIO);

        OSQDel(MB_OS_RxQ, OS_DEL_ALWAYS, ?&err);

        MB_OS_RxTask()

        這個(gè)任務(wù)是由MB_OS_Init()創(chuàng)建, 如前面所述該任務(wù)只是簡單等待消息,并調(diào)用MB_RxTask()主要代碼如下:

        while (DEF_TRUE) {

        pch=(MODBUS_CH*)OSQPend(MB_OS_RxQ,0,&err); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MB_RxTask(pch); }

        μC/Modbus已經(jīng)提供了基于μC/OS?Ⅱ操作系統(tǒng)的接口程序,如果用戶系統(tǒng)使用的是μC/OS?Ⅱ則不需要做任何改動(dòng)。但μC/Modbus可以在任何實(shí)時(shí)操作系統(tǒng)下運(yùn)行,只是需要用戶來完成接口程序。

        3 ?STM32F103處理器接口部分移植

        μC/Modbus源碼Ports文件夾下的程序是與硬件平臺(tái)關(guān)聯(lián)的。CPU.H用于定義數(shù)據(jù)類型、處理器堆棧數(shù)據(jù)字長、堆棧增長方向、任務(wù)切換宏和臨界區(qū)訪問處理方式。MB_BSP.C用于操作串口和RTU定時(shí)器[3]。

        OS_CPU.H 頭文件移植到Cortex?M3平臺(tái)時(shí),需要重新定義包含與編譯器無關(guān)的數(shù)據(jù)類型。代碼如下:

        typedef ? ? ? ? ? ?void ? ? ?CPU_VOID;

        typedef ?unsigned ?char ? ? ?CPU_CHAR;

        typedef ?unsigned ?char ? ? ?CPU_BOOLEAN;

        typedef ?unsigned ?char ? ? ?CPU_INT08U;

        typedef ? ?signed ?char ? ? ?CPU_INT08S;

        typedef ?unsigned ?short ? ? CPU_INT16U;

        typedef ? ?signed ?short ? ? CPU_INT16S;

        typedef ?unsigned ?int ? ? ? CPU_INT32U;

        typedef ? ?signed ?int ? ? ? CPU_INT32S;

        typedef ? ? ? ? ? ?float ? ? CPU_FP32;

        typedef ? ? ? ? ? ?double ? ?CPU_FP64;

        定義存儲(chǔ)模式,Cortex?M3 使用的是小端存儲(chǔ)模式。

        #define ?CPU_CFG_ENDIAN_TYPE ? CPU_ENDIAN_TYPE_LITTLE

        定義臨界區(qū)代碼訪問涉及到的全局中斷開關(guān)指令有OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。 在OS_CPU.H 頭文件中定義如下[4]:

        typedef ?CPU_INT32U ?CPU_SR;

        #define ?CPU_CRITICAL_ENTER() ? ?{cpu_sr = CPU_SR_Save();}

        #define ?CPU_CRITICAL_EXIT() ? ? {CPU_SR_Restore(cpu_sr);}

        其中CPU_SR_Save ()和CPU_SR_Restore () 分別對(duì)應(yīng)關(guān)中斷和開中斷處理,需要使用匯編代碼實(shí)現(xiàn),代碼如下:

        CPU_SR_Save

        MRS ? ? R0, PRIMASK ? ? ? ? ? ? ? ? ?;保存PRIMASK

        CPSID ? I ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;關(guān)中斷

        BX ? ? ?LR

        CPU_SR_Restore

        MSR ? ? PRIMASK, R0 ? ? ? ? ? ? ? ? ?;恢復(fù)PRIMASK

        BX ? ? ?LR

        MB_BSP.C中實(shí)現(xiàn)串口操作、串口初始化、串口配置、串口發(fā)送接收中斷服務(wù)程序和定時(shí)中斷服務(wù)程序,具體實(shí)現(xiàn)參考STM32固件庫。

        MB_CommExit()???關(guān)閉使用的所有串行接口

        MB_CommPortCfg()???配置串口通信參數(shù)

        MB_CommRxTxISR_Handler()???串口接收、發(fā)送中斷服務(wù)程序,需要加入如下代碼。

        if (Rx Interrupt) {

        pch?>RxCtr++;

        MB_RxByte(pch, c);

        }

        if (Tx Interrupt) {

        pch?>TxCtr++;

        MB_TxByte(pch);

        }

        MB_CommRxIntDis()???使能串口接收中斷。

        MB_CommRxIntEn()???禁止串口接收中斷。

        MB_CommTx1()???發(fā)送一個(gè)字節(jié)數(shù)據(jù)。

        MB_CommTxIntDis()???禁止串口發(fā)送中斷。

        MB_CommTxIntEn()???使能串口發(fā)送中斷。

        MB_RTU_TmrInit()???初始化RTU定時(shí)器。

        MB_RTU_TmrExit()???停用RTU定時(shí)器。

        MB_RTU_TmrISR_Handler()???RTU 定時(shí)中斷服務(wù)程序。需要加入如下代碼。

        MB_RTU_TmrCtr++;

        MB_RTU_TmrUpdate() ;

        4 ?μC/ Modbus的使用及應(yīng)用程序設(shè)計(jì)

        移植部分的代碼編寫完成后,就可以根據(jù)自己的應(yīng)用需求配置μC/Modbus和設(shè)計(jì)應(yīng)用程序。

        在MB_CFG.H文件中配置參數(shù)。

        定義設(shè)備為Modbus從站設(shè)備

        #define ?MODBUS_CFG_SLAVE_EN ? ? ?DEF_ENABLED ? ? ? ?#define ?MODBUS_CFG_MASTER_EN ? ? DEF_DISABLED ? ? ? ? 設(shè)置從站支持Modbus RTU模式

        #define ?MODBUS_CFG_ASCII_EN ? DEF_DISABLED ? ? ? ? ? ? ? ? ?#define ?MODBUS_CFG_RTU_EN ? ? DEF_ENABLED

        設(shè)置通道數(shù)

        #define ?MODBUS_CFG_MAX_CH ? ? 1

        設(shè)置串口發(fā)送接收緩存大小

        #define ?MODBUS_CFG_BUF_SIZE ? ? ? 255

        設(shè)置禁用浮點(diǎn)數(shù)

        #define ?MODBUS_CFG_FP_EN ? ? ? ? ? DEF_DISABLED

        設(shè)置設(shè)備支持的命令碼

        #define ?MODBUS_CFG_FC01_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC02_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC03_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC04_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC05_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC06_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC15_EN ? ? ? ? DEF_ENABLED

        #define ?MODBUS_CFG_FC16_EN ? ? ? ? DEF_ENABLED

        根據(jù)所支持的命令碼在MB_DATA.C文件中實(shí)現(xiàn)以下函數(shù):

        MB_CoilRd()用于響應(yīng)01功能碼, 讀一個(gè)線圈的值。

        MB_CoilWr()用于響應(yīng)05、15功能碼,寫一個(gè)線圈的值。

        MB_DIRd()用于響應(yīng)02功能碼,讀一個(gè)離散輸入的值。

        MB_InRegRd()用于響應(yīng)04功能碼。讀一個(gè)輸入寄存器的值。

        MB_HoldingRegRd()用于響應(yīng)03功能碼,讀取一個(gè)保持寄存器的值。

        MB_HoldingRegWr()用于響應(yīng)06、16功能碼,寫一個(gè)保持寄存器的值。

        最后用戶就可以在main函數(shù)里或在用戶任務(wù)里啟動(dòng)μC/ Modbus。首先調(diào)用MB_Init()初始化μC/Modbus,然后通過MB_CfgCh()配置Modbus通道。一旦通道配置完成,就可以與Modbus主站通信而不需要用戶參與。例如設(shè)從站設(shè)備具有一個(gè)Modbus RTU端口、9 600 b/s、從站地址為1。代碼如下[5]:

        MB_Init(1000); ? //初始化 μC/Modbus,時(shí)鐘頻率 1 000 Hz

        MB_CfgCh ( ? 1, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // Modbus通道號(hào)

        MODBUS_SLAVE, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 從設(shè)備

        0,

        MODBUS_MODE_RTU, ? ? ? ? ? ? ?//Modbus RTU模式

        MODBUS_USARTPort, ? ? ? ? ? ? ? ? ? // UART串口號(hào)

        9600, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//波特率

        8, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //8個(gè)數(shù)據(jù)位

        MODBUS_PARITY_NONE , ? ? ? ? ? ? ? ? ? ? //無校驗(yàn)

        1, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //1個(gè)停止位

        MODBUS_WR_EN); ? ? ? ? ? ? ? ? ? ? ? ?//允許寫操作

        5 ?結(jié) ?語

        本文主要論述了μC/Modbus在Cortex?M3內(nèi)核處理器上的移植過程并給出關(guān)鍵代碼,移植后的μC/Modbus能夠穩(wěn)定運(yùn)行于STM32F103處理器上。本移植能通用于所有Cortex?M3處理器和μC/OS?Ⅱ操作系統(tǒng)平臺(tái)上,對(duì)于將μC/Modbus移植到其他體系平臺(tái)上同樣具有參考作用。實(shí)驗(yàn)表明μC/Modbus 是一款簡單高效移植方便的標(biāo)準(zhǔn)Modbus協(xié)議棧。讀者在了解μC/Modbus工作原理及移植過程之后,也可進(jìn)一步做優(yōu)化操作,比如利用STM32的串口DMA功能取代中斷方式,以進(jìn)一步降低CPU的開銷。

        參考文獻(xiàn)

        [1] LABROSSE J J. μC/OS?Ⅱ:源碼公開的實(shí)時(shí)嵌入式操作系統(tǒng)[M].紹貝貝,譯.北京:中國電力出版社,2001.

        [2] YIU J. Cortex?M3權(quán)威指南[M].宋巖,譯.北京:清華大學(xué)出版社,2008.

        [3] 張桂,金國強(qiáng),李輝.基于ARM平臺(tái)Modbus RTU協(xié)議的研究與實(shí)現(xiàn)[J].電力科學(xué)與工程,2011(1):23?27.

        [4] 王曉鳴.實(shí)時(shí)操作系統(tǒng)μC/OS?Ⅱ在ARM上的移植[J].機(jī)電一體化,2007(1):56?58.

        [5] 周軍,陳偉峰.基于ARM9和μC/OS?Ⅱ的Modbus通信協(xié)議的實(shí)現(xiàn)[J].自動(dòng)化儀表,2009(2):24?26.

        [6] 潘迪夫,習(xí)可.以PLC為通信主站的Modbus控制網(wǎng)絡(luò)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010,33(5):142?144.

        日韩免费高清视频网站| 十八禁无遮挡99精品国产| 猫咪av成人永久网站在线观看| 天天躁狠狠躁狠狠躁夜夜躁| 狠狠躁夜夜躁AV网站中文字幕| 亚洲高清一区二区三区在线观看 | 亚洲av高清资源在线观看三区 | 国产在线91精品观看| 国产做无码视频在线观看| 亚洲色大成网站www久久九| 精品视频在线观看免费无码| 日本高清不卡一区二区三区| 91久久国产香蕉熟女线看| 色偷偷888欧美精品久久久| 全球中文成人在线| 久久国产成人亚洲精品影院老金| 精品一区二区中文字幕| 日本一区二区在线免费看| 欧美村妇激情内射| 洗澡被公强奷30分钟视频| 97久久久久国产精品嫩草影院| 女同欲望一区二区三区| 国产av一区二区三区性入口 | 国产精品视频免费的| 久久老熟女乱色一区二区| 爆操丝袜美女在线观看| 久久精品国产成人| 精品国产AⅤ一区二区三区4区| 日本高清不卡一区二区三区| 精品露脸熟女区一粉嫩av| 秘书边打电话边被躁bd视频| 亚洲免费观看在线视频| 日韩精品首页在线观看| 国内偷拍国内精品多白86| 国产无套粉嫩白浆在线观看| 亚洲av日韩av无码av| 国产颜射视频在线播放| 午夜男女靠比视频免费| 亚洲av无码国产精品永久一区| 国产思思99re99在线观看| 亚洲一区二区三区av色婷婷 |