STM32 freemodbus TCP 通讯

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


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


1、STM32 CubeMX建立工程,内容包括 ETH,FreeRTOS,LWIP

STM32 freemodbus TCP 通讯_第1张图片


2、只需要配置LWIP为静态地址,这是因为我的设备不方便用动态地址,你也可以不改用DHCP

STM32 freemodbus TCP 通讯_第2张图片

3、生成KEIL5工程,然后加入freemodbus文件,进行修改。

STM32 freemodbus TCP 通讯_第3张图片


在这里主要是修改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 freemodbus TCP 通讯_第4张图片


STM32 freemodbus TCP 通讯_第5张图片


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


你可能感兴趣的:(STM32 freemodbus TCP 通讯)