日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

FreeModbus移植到STM32F107(以太网传输方式)

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeModbus移植到STM32F107(以太网传输方式) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.創(chuàng)建工程

?

配置好之后生成工程

?

2.將FreeModbus源碼,拷貝到工程目錄

?

3.將FreeModbus文件添加進(jìn)工程

打開(kāi)mbtcp.c文件發(fā)現(xiàn),受MB_TCP_ENABLED宏定義的影響,所有代碼都是灰的

因此跳轉(zhuǎn)到宏定義的地方。打開(kāi)TCP模式,并將RTU和ASCII模式關(guān)閉

打開(kāi)mbrtu.c和mbascii.c文件檢查,發(fā)現(xiàn)mbrtu.c源碼有問(wèn)題,不受宏定義影響

因此修改mbrtu.c源碼

修改好之后,編譯出現(xiàn)錯(cuò)誤

?

4.移植底層接口

先看第一個(gè)錯(cuò)誤,缺少port.h

借鑒demo里面STR71XTCP的程序。將STR71XTCP中的port文件夾,拷貝到工程中。

刪除重復(fù)文件mbconfig.h

將文件加入工程

添加好之后,重新編譯,出現(xiàn)錯(cuò)誤,port.h中包含了STR71X相關(guān)代碼

將這些代碼修改

重新編譯,出現(xiàn)錯(cuò)誤,發(fā)現(xiàn)demo中STR71XTCP程序原來(lái)是帶操作系統(tǒng)的。portevent.c文件不適用于裸機(jī)。

借鑒demo里面AVR的程序。將AVR中的portevent.c文件,拷貝過(guò)來(lái)并覆蓋源文件。

重新編譯,有部分宏沒(méi)有定義。

打開(kāi)port.h,重新定義。

重新編譯,出現(xiàn)錯(cuò)誤,NETCONN_COPY沒(méi)有定義。這是因?yàn)閘wip沒(méi)有配置LWIP_NETCONN或者LWIP_SOCKET。

?

對(duì)于這個(gè)我們直接搜尋整個(gè)工程,發(fā)現(xiàn)NETCONN_COPY的值為1。將NETCONN_COPY的值直接替換掉。

?

重新編譯,報(bào)告eMBRegCoilsCB、eMBRegDiscreteCB、eMBRegHoldingCB和eMBRegInputCB沒(méi)有定義。

這四個(gè)接口是協(xié)議棧預(yù)留給用戶(hù)自己去實(shí)現(xiàn)的,分別創(chuàng)建user_mb_app.h和user_mb_app.c兩個(gè)文件

#ifndef _USER_MB_APP_H_ #define _USER_MB_APP_H_/* ----------------------- Modbus includes ----------------------------------*/ #include "mb.h" #include "mbconfig.h" #include "mbframe.h" #include "mbutils.h"/* -----------------------Slave Defines -------------------------------------*/ #define S_DISCRETE_INPUT_START 0 #define S_DISCRETE_INPUT_NDISCRETES 16 #define S_COIL_START 0 #define S_COIL_NCOILS 64 #define S_REG_INPUT_START 0 #define S_REG_INPUT_NREGS 100 #define S_REG_HOLDING_START 0 #define S_REG_HOLDING_NREGS 100 /* salve mode: holding register's all address */ #define S_HD_RESERVE 0 #define S_HD_CPU_USAGE_MAJOR 1 #define S_HD_CPU_USAGE_MINOR 2 /* salve mode: input register's all address */ #define S_IN_RESERVE 0 /* salve mode: coil's all address */ #define S_CO_RESERVE 0 /* salve mode: discrete's all address */ #define S_DI_RESERVE 0/* -----------------------Master Defines -------------------------------------*/ #define M_DISCRETE_INPUT_START 0 #define M_DISCRETE_INPUT_NDISCRETES 16 #define M_COIL_START 0 #define M_COIL_NCOILS 64 #define M_REG_INPUT_START 0 #define M_REG_INPUT_NREGS 100 #define M_REG_HOLDING_START 0 #define M_REG_HOLDING_NREGS 100 /* master mode: holding register's all address */ #define M_HD_RESERVE 0 /* master mode: input register's all address */ #define M_IN_RESERVE 0 /* master mode: coil's all address */ #define M_CO_RESERVE 0 /* master mode: discrete's all address */ #define M_DI_RESERVE 0#endif /** FreeModbus Libary: user callback functions and buffer define in slave mode* Copyright (C) 2013 Armink <armink.ztl@gmail.com>** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA** File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $*/ #include "user_mb_app.h"/*------------------------Slave mode use these variables----------------------*/ //Slave mode:DiscreteInputs variables USHORT usSDiscInStart = S_DISCRETE_INPUT_START; #if S_DISCRETE_INPUT_NDISCRETES%8 UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1]; #else UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ; #endif //Slave mode:Coils variables USHORT usSCoilStart = S_COIL_START; #if S_COIL_NCOILS%8 UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ; #else UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ; #endif //Slave mode:InputRegister variables USHORT usSRegInStart = S_REG_INPUT_START; USHORT usSRegInBuf[S_REG_INPUT_NREGS] ; //Slave mode:HoldingRegister variables USHORT usSRegHoldStart = S_REG_HOLDING_START; USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ;/*** Modbus slave input register callback function.** @param pucRegBuffer input register buffer* @param usAddress input register address* @param usNRegs input register number** @return result*/ eMBErrorCode eMBRegInputCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs) {eMBErrorCode eStatus = MB_ENOERR;USHORT iRegIndex;USHORT * pusRegInputBuf;USHORT REG_INPUT_START;USHORT REG_INPUT_NREGS;USHORT usRegInStart;pusRegInputBuf = usSRegInBuf;REG_INPUT_START = S_REG_INPUT_START;REG_INPUT_NREGS = S_REG_INPUT_NREGS;usRegInStart = usSRegInStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= REG_INPUT_START)&& (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)){iRegIndex = usAddress - usRegInStart;while (usNRegs > 0){*pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8);*pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF);iRegIndex++;usNRegs--;}}else{eStatus = MB_ENOREG;}return eStatus; }/*** Modbus slave holding register callback function.** @param pucRegBuffer holding register buffer* @param usAddress holding register address* @param usNRegs holding register number* @param eMode read or write** @return result*/ eMBErrorCode eMBRegHoldingCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode) {eMBErrorCode eStatus = MB_ENOERR;USHORT iRegIndex;USHORT * pusRegHoldingBuf;USHORT REG_HOLDING_START;USHORT REG_HOLDING_NREGS;USHORT usRegHoldStart;pusRegHoldingBuf = usSRegHoldBuf;REG_HOLDING_START = S_REG_HOLDING_START;REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;usRegHoldStart = usSRegHoldStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= REG_HOLDING_START)&& (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)){iRegIndex = usAddress - usRegHoldStart;switch (eMode){/* read current register values from the protocol stack. */case MB_REG_READ:while (usNRegs > 0){*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8);*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF);iRegIndex++;usNRegs--;}break;/* write current register values with new values from the protocol stack. */case MB_REG_WRITE:while (usNRegs > 0){pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;iRegIndex++;usNRegs--;}break;}}else{eStatus = MB_ENOREG;}return eStatus; }/*** Modbus slave coils callback function.** @param pucRegBuffer coils buffer* @param usAddress coils address* @param usNCoils coils number* @param eMode read or write** @return result*/ eMBErrorCode eMBRegCoilsCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode) {eMBErrorCode eStatus = MB_ENOERR;USHORT iRegIndex , iRegBitIndex , iNReg;UCHAR * pucCoilBuf;USHORT COIL_START;USHORT COIL_NCOILS;USHORT usCoilStart;iNReg = usNCoils / 8 + 1;pucCoilBuf = ucSCoilBuf;COIL_START = S_COIL_START;COIL_NCOILS = S_COIL_NCOILS;usCoilStart = usSCoilStart;/* it already plus one in modbus function method. */usAddress--;if( ( usAddress >= COIL_START ) &&( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ){iRegIndex = (USHORT) (usAddress - usCoilStart) / 8;iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8;switch ( eMode ){/* read current coil values from the protocol stack. */case MB_REG_READ:while (iNReg > 0){*pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++],iRegBitIndex, 8);iNReg--;}pucRegBuffer--;/* last coils */usNCoils = usNCoils % 8;/* filling zero to high bit */*pucRegBuffer = *pucRegBuffer << (8 - usNCoils);*pucRegBuffer = *pucRegBuffer >> (8 - usNCoils);break;/* write current coil values with new values from the protocol stack. */case MB_REG_WRITE:while (iNReg > 1){xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8,*pucRegBuffer++);iNReg--;}/* last coils */usNCoils = usNCoils % 8;/* xMBUtilSetBits has bug when ucNBits is zero */if (usNCoils != 0){xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils,*pucRegBuffer++);}break;}}else{eStatus = MB_ENOREG;}return eStatus; }/*** Modbus slave discrete callback function.** @param pucRegBuffer discrete buffer* @param usAddress discrete address* @param usNDiscrete discrete number** @return result*/ eMBErrorCode eMBRegDiscreteCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNDiscrete) {eMBErrorCode eStatus = MB_ENOERR;USHORT iRegIndex , iRegBitIndex , iNReg;UCHAR * pucDiscreteInputBuf;USHORT DISCRETE_INPUT_START;USHORT DISCRETE_INPUT_NDISCRETES;USHORT usDiscreteInputStart;iNReg = usNDiscrete / 8 + 1;pucDiscreteInputBuf = ucSDiscInBuf;DISCRETE_INPUT_START = S_DISCRETE_INPUT_START;DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES;usDiscreteInputStart = usSDiscInStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= DISCRETE_INPUT_START)&& (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)){iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8;iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8;while (iNReg > 0){*pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++],iRegBitIndex, 8);iNReg--;}pucRegBuffer--;/* last discrete */usNDiscrete = usNDiscrete % 8;/* filling zero to high bit */*pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete);*pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete);}else{eStatus = MB_ENOREG;}return eStatus; }

重新編譯,提示vMBPortEventClose未定義。由于我們是裸機(jī)程序,并未創(chuàng)建系統(tǒng)對(duì)象,也就不需要釋放。直接將vMBPortEventClose注釋即可。

重新編譯,無(wú)錯(cuò)誤

8.協(xié)議棧移植工作完成。

燒錄之后,發(fā)現(xiàn)程序死在了vMBPortLog函數(shù)中。這是由于我們沒(méi)有打印口,我們直接將這段代碼注釋即可。

總結(jié)

以上是生活随笔為你收集整理的FreeModbus移植到STM32F107(以太网传输方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧洲国产精品 | 被黑人啪到哭的番号922在线 | 中文字幕制服丝袜 | xxxxx在线视频 | 久久黄色一级 | 国产91片 | 青青一区二区 | 国产一区二区三区色淫影院 | 亚洲视频黄 | 青青操视频在线 | 亚洲黄色视屏 | jizz日本少妇 | 免费看国产一级片 | 中文字幕资源网 | 色情毛片| 在线观看免费av网址 | 宿舍女女闺蜜调教羞辱 | 亚洲尹人 | 国产码视频 | 欧美熟妇久久久久 | 亚洲天堂av影院 | 久久久久一级 | 国产成人精品女人久久久 | 欧美日本高清视频 | 熟妇女人妻丰满少妇中文字幕 | 美女黄免费| 中文字幕免费在线观看视频 | 日韩视频精品在线 | 国产精品熟女视频 | 国产片在线 | 久久久久久久久免费视频 | 精品欧美一区二区三区免费观看 | 手机看片福利永久 | 久久久久久久影视 | 亚洲av无码精品一区二区 | 精品一区二区三区无码按摩 | 精品欧美在线观看 | 国产精品黄在线观看 | 美国福利片 | 在线观看 一区 | 久久综合热 | 四虎在线视频 | 日本高清视频在线播放 | 国产综合精品在线 | 亚洲欧美日韩精品色xxx | 国产高清精品在线观看 | 国产91亚洲 | 神马午夜dy888 | 欧美日韩精选 | 一色av| 欧美xxxx黑人xyx性爽 | 夜夜操综合 | 亚洲涩网 | 亚洲欧美成人一区二区三区 | 九色porny原创自拍 | 久久成人综合 | 欧美在线视频网 | 亚洲中文字幕在线一区 | 跪求黄色网址 | 日韩在线精品视频一区二区涩爱 | 久久久久无码精品国产 | 国产精品免费视频一区 | 国产jjizz一区二区三区视频 | 成人动漫在线免费观看 | 欧美亚洲视频 | 爱色av网站| 国产91丝袜在线播放九色 | 欧美理伦片在线播放 | 亚洲精品一区二区口爆 | 天堂资源网 | 欧美理伦片在线播放 | jizzjizz亚洲| 亚洲一区在线播放 | 性开放的欧美大片 | 欧美大黄 | 国产成a人亚洲精v品无码 | 日本久久黄色 | 天天插天天干 | 在线免费观看av网 | 中文字幕欧美在线观看 | 国产在线视频99 | 天堂亚洲 | 欧美片网站yy | a毛片在线免费观看 | 偷拍视频一区二区 | 亚洲欧美成人一区二区 | 五月天激情国产综合婷婷婷 | av噜噜噜 | 欧美精品在线一区二区三区 | 毛片88| 岛国裸体写真hd在线 | 国产女人和拘做受视频免费 | 国产高清在线 | 无码国产精品一区二区高潮 | 亚洲欧美校园春色 | 亚洲人成在线观看 | 黄色一级大片免费看 | 久久精品在线 | 日韩一区二区三区在线观看视频 |