FreeModbus从站设计(9)-详解FreeModbus在单片机串口上的数据收发过程
关键词:FreeModbus STM32F103 CubeMX HAL库 串口
1.引言
在上一篇文章中,主要阐述了vMBPortSerialEnable()这个函数如何基于HAL库调度单片机串口的收发,感觉还是不是很清晰,因此,孔丙火(微信公众号:孔丙火)在这一篇文章中,重点捋一下串口的收发函数调用关系,以求有有一个清晰的脉络。
2.函数调用的基本框架
直接上图,更清晰,接收过程如图1所示,发送过程如图2所示。
图1
接收过程起源于vMBPortSerialEnable()函数的调用,此时,该函数将串口设置位接收状态,即使能接收中断,禁止发送中断。从图中可以清晰的看出,需要修改的地方就是接收中断的回调函数和portserial.c和porttimer.c中的几个函数。至于何时调用vMBPortSerialEnable()函数,孔丙火(微信公众号:孔丙火)认为,我们是不需要关心的,只要按照之前的文章,把FreeModbus的代码添加到keil工程中,FreeModbus协议栈会进行调度。接收过程是一个字节一个字节进行接收的,当协议栈检测到定时器超时,则认为一个完整的数据帧接收完毕,开始进入数据处理的阶段,数据处理完成后,则进行回复数据的发送。
图2
发送过程同样起源于vMBPortSerialEnable()函数的调用,此时,该函数将串口设置位发送状态,即使能发送中断,禁止接收中断。从图中可以清晰的看出,需要修改的地方就是发送中断的回调函数和portserial.c中的几个函数。至于何时调用vMBPortSerialEnable()函数,孔丙火(微信公众号:孔丙火)认为,我们是不需要关心的,只要按照之前的文章,把FreeModbus的代码添加到keil工程中,FreeModbus协议栈会进行调度。发送过程同样是一个字节一个字节进行的,在xMBRTUTransmitFSM()函数中,会检测是否还有需要发送的数据,若没有数据需要发送了,则会调用vMBPortSerialEnable()函数,再次将串口设置为接收状态。作为Modbus从站,串口大部分时间是处于接收状态的。
3.总结
在这篇文章中,孔丙火(微信公众号:孔丙火)接着上一篇文章的思路,用两张图把FreeModbus在单片机串口上数据收发流程进行了梳理,脉络更加清晰。有了这样一个思路,可以更好地理解,移植FreeModbus的时候,为什么需要修改portserial.c和porttimer.c中的函数,和为什么需要修改串口中断的回调函数。从这篇文章中,也可以看出,采用HAL库是比较简单的,像是中断处理这些内容库函数都已经处理好了,很方便,可以提高开发效率。
文章在公众号(孔丙火)同步推出,欢迎查看更多系列文章。
单片机、ARM、现场总线、PLC、嵌入式软硬件的设计经验分享,秉承“点点滴滴皆智慧”的理念,以实际项目为单元阐述知识点,一起分享,共同交流。

©著作权归作者所有:来自51CTO博客作者haoren1101的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. STM32串口配置(1,2,3,4)
  2. Oracle行列互换总结
  3. Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存
  4. 使用Composition API在Vue3中创建防抖搜索输入框
  5. 编写优雅Javascript代码的最佳实践
  6. Vue开发中可以使用的ES6新特征
  7. JavaScript从作为函数实参的对象中提取数据
  8. 痞子衡嵌入式:串口调试工具pzh-com诞生记(3)- 串口功能实现(pySeria
  9. 痞子衡嵌入式:串口调试工具pzh-com诞生记(6)- 打包发布(PyInstaller

随机推荐

  1. Android 创建悬停通知栏
  2. android之hardwareAccelerated你不知道的
  3. android 横向ListView 横向列表
  4. china
  5. 10 Must-Have Android Tools for Develop
  6. Android各版本的版本号、版本名、API及发
  7. Android Firewall(防火墙) AndFire 首发
  8. Android加密算法:AES、Base64加密算法
  9. android Socket实现简单聊天小程序
  10. Android(安卓)CheckBox设置背景selector