STM32|STM32 freemodbus TCP 通讯

这两天一直在调试STM32F4的 TCP,并且想应用到freemodbus TCP,这样我的设备就可以集成化联网控制。


因为现在大部分使用STM32的应该都使用ST专用的配置软件STM32 CubeMX进行程序的初期工程,这有一个好处,就是加快开发进度,我这里也是在此软件下进行开发,我只是为了记下自己的使用过程,方便以后查看,写的可能会比较乱。


1、STM32 CubeMX建立工程,内容包括 ETH,FreeRTOS,LWIP
STM32|STM32 freemodbus TCP 通讯
文章图片




2、只需要配置LWIP为静态地址,这是因为我的设备不方便用动态地址,你也可以不改用DHCP
STM32|STM32 freemodbus TCP 通讯
文章图片


3、生成KEIL5工程,然后加入freemodbus文件,进行修改。
STM32|STM32 freemodbus TCP 通讯
文章图片




在这里主要是修改porttcp.c这个文件,并且在port.h 里面增加个宏定义
/* Critical section management. */
extern void vPortEnterCritical( void );
extern void vPortExitCritical( void );


#define ENTER_CRITICAL_SECTION()vPortEnterCritical( )
#define EXIT_CRITICAL_SECTION()vPortExitCritical( )


还有在mbconfig.h下面配置为TCP方式
/*! \brief If Modbus ASCII support is enabled. */
#define MB_ASCII_ENABLED(0 )
/*! \brief If Modbus RTU support is enabled. */
#define MB_RTU_ENABLED(0 )
/*! \brief If Modbus TCP support is enabled. */
#define MB_TCP_ENABLED(1 )



4、主程序增加一个应答freemodbus TCP即可。
osThreadDef(ModbusPollTask, eMBPollTask, osPriorityNormal, 0, 128);
osThreadCreate(osThread(ModbusPollTask), NULL);

当然在创建任务之前,先初始一下freemodbus tcp,我们直接在生成的 StartDefaultTask 任务里进行初始化也可以。MX_LWIP_Init(); 会生成一个收包和应答ARP和PING的任务。这是软件自动生成的,这样我们要做的工作就很少了。
/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{
MX_LWIP_Init();
/* USER CODE BEGIN 5 */
eMBTCPInit(0);
eMBEnable();
/* Infinite loop */
for(; ; )
{
osDelay(1);
}
/* USER CODE END 5 */
}



到此我们的freemodbus tcp就可以了,通过ping 和 modbus poll连接测试都没有问题。
STM32|STM32 freemodbus TCP 通讯
文章图片




STM32|STM32 freemodbus TCP 通讯
文章图片




当然中间会有点小的问题,不过我相信大家一定能自己解决的。细节自己看原代码体会,我也是初学者。
【STM32|STM32 freemodbus TCP 通讯】

    推荐阅读