美文网首页
STM32F103、FreeModbus从站设计(6)-让串口和

STM32F103、FreeModbus从站设计(6)-让串口和

作者: 孔_df84 | 来源:发表于2021-03-18 22:10 被阅读0次

FreeModbus从站设计(6)-让串口和Modbus初始化的参数同步起来

关键词:Modbus FreeModbus STM32F103C8T6 CubeMX 移植

1.基本原理

在这一篇文章中,孔丙火(微信公众号:孔丙火)主要介绍协议栈初始化,以及与串口相关的代码修改。串口的初始化函数是CubeMx自动生成的,其波特率等参数最好与freemodbus协议栈初始化参数保持一致,这样方便程序的维护和功能扩展,例如,当需要修改通信的波特率的时候,只需要修改一处就可以了,不用先修改串口的初始化参数,再修改协议栈的参数,这是一个实战例程与纯教程的区别。

本文的总体思路:创建一些全局变量,用于存储通信参数,串口、定时器、Freemodbus协议栈的初始化,都采用这些变量,需要更改的时候,只需改变这些变量的值即可。另外,这些通信参数后续计划存储在flash里面,定时器的参数会随波特率的不同而改变,这些在后续的文章中会阐述。

2.代码修改

2.1关于assert的说明

在Freemodbus的协议栈中,很多地方使用了assert,因此,在Cube生成工程的时候,孔丙火(微信公众号:孔丙火)认为,最好使能enable assert选项,如果没有使能,编译的时候可能出错,这个时候可以勾掉MicroLIB,因为MicroLIB不支持assert。

2.2宏的修改

(1)MB_RTU_ENABLED、MB_ASCII_ENABLED、MB_TCP_ENABLED

这里我们实现的是RTU,只需将MB_RTU_ENABLED定义为1即可。孔丙火(微信公众号:孔丙火)顺便说一句,在基于串口的Modbus中,RTU是必选项,ASCII是可选项,也就是说RTU是必须要实现的。

(2)ENTER_CRITICAL_SECTION( )和EXIT_CRITICAL_SECTION( )

这两个函数是进入和退出关键进程,这里定义为__disable_irq()和__enable_irq(),后边两个函数是ARM内核函数,作用是禁止中断和使能中断。

#define ENTER_CRITICAL_SECTION( ) __disable_irq() 

#define EXIT_CRITICAL_SECTION( )  __enable_irq()

2.3协议栈初始化

在main.c文件中的while(1)之前,调用eMBInit(  )完成协议栈的初始化,然后调用eMBEnable(  )使能协议栈。eMBInit(  )的定义如下:eMBErrorCode

eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity ),共5个参数,eMode模式:RTU或ASCII,ucSlaveAddress从站地址,ucPort单片机的串口号,ulBaudRate波特率,eParity校验方式,我们这里串口参数是在Cube生产的函数里初始化的,而且串口接收或发送的数据HAL库函数已经处理好了,因此,孔丙火(微信公众号:孔丙火)认为,有用的参数只有eMode,ucSlaveAddress,ulBaudRate,其余两个设错了,其实也没影响(仅限于本文的实现方法)。

在modbus_app.c中定义如下全局变量:

uint8_t ucUsrSlaveAddress;//从站地址

uint32_t ulUsrBaudRate;//波特率

eMBParity eUsrParity;//校验方式

uint8_t ucUsrStopBits;//停止位

新建modbus_app.h,在其中进行extern定义,一般在其他c文件中使用。

最终,在main.c中做如下调用:

eMBInit( MB_RTU, ucUsrSlaveAddress, 1, ulUsrBaudRate, eUsrParity );

2.4串口参数初始化

在MX_USART2_UART_Init()中修改,此函数是Cube自动生成的,在usart.c中。

最终函数如下:

huart2.Instance = USART2;

  huart2.Init.BaudRate = ulUsrBaudRate;

  if(eUsrParity == MB_PAR_NONE)huart2.Init.WordLength = UART_WORDLENGTH_8B;

  else huart2.Init.WordLength = UART_WORDLENGTH_9B;

  if(ucUsrStopBits == 1)huart2.Init.StopBits = UART_STOPBITS_1;

  else if(ucUsrStopBits == 2)huart2.Init.StopBits = UART_STOPBITS_2;

  if(eUsrParity == MB_PAR_NONE)huart2.Init.Parity = UART_PARITY_NONE;

  else if(eUsrParity == MB_PAR_EVEN)huart2.Init.Parity = UART_PARITY_EVEN;

  else if(eUsrParity == MB_PAR_ODD)huart2.Init.Parity = UART_PARITY_ODD;

  huart2.Init.Mode = UART_MODE_TX_RX;

  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart2.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart2) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

波特率使用了全局变量,单片机的数据位个数和停止位根据全局变量确定。

3.总结

这种方法让让串口和Modbus初始化的参数同步起来了,也方便通信参数的在线修改,更接近实战。

————————————————

相关文章

  • STM32F103、FreeModbus从站设计(6)-让串口和

    FreeModbus从站设计(6)-让串口和Modbus初始化的参数同步起来 关键词:Modbus FreeMod...

  • 软件调试总结之FreeModbus移植

    在研发某个电子产品时,由于需要用到FreeModbus协议,所以对FreeModbus协议进行了系统的自我...

  • 串口

    串口使用和CSerial类 windows下打开串口COM10的坑 从注册表获取所有的串口[Windows] wi...

  • STM32F103之串口配置

    串口应该是单片机必玩的东西啦,而且每个单片机都会至少有1个串口,可以将它们用来与其他设备通信。 接下来我们以最常用...

  • STM32F103C8T6-CubeMx串口收发程序详细设计与测

    STM32F103C8T6-CubeMx串口收发程序详细设计与测试(1)——CubeMx生成初始代码 关键词:ST...

  • Android串口通信

    转载请说明出处!作者:kqw攻城狮出处:个人站 | CSDN 串口通信偏向嵌入式一点,是Android设备通过串口...

  • Android平台的串口通信技术

    概念 串口通信 概念;串口通信(Serial Communications)按位(bit)发送和接收字节。串口可以...

  • LoRa相关设备AT指令集

    串口协议分类 串口作为物理层/传输层的设计中,存在大量的协议,包括: STX/ETX,以STX/ETX为首尾隔断符...

  • 多串口通信

    一共3个串口,1个串口做主设备,2个串口做从设备,直接都接上的话,主设备发送数据,从设备接受是没有问题的;但是其中...

  • stm32利用串口debug的方法

    针对该款stm32芯片(stm32f107vct6)没有软件仿真库的问题,设计了新的调试方式,即通过串口打印文件名...

网友评论

      本文标题:STM32F103、FreeModbus从站设计(6)-让串口和

      本文链接:https://www.haomeiwen.com/subject/lyqmcltx.html