<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[孔丙火]]></title><description><![CDATA[不善言谈的我们，只能通过书本汲取营养，用笔表达思想。从单片机到PLC，以及嵌入式，愿我们相互交流，共同进步。不忘初心，方得始终。]]></description><link>https://blog.csdn.net/haoseren</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; haoseren]]></copyright><item><title><![CDATA[用keil进行debug时，如何让时间准确起来？]]></title><link>https://blog.csdn.net/haoseren/article/details/128781577</link><guid>https://blog.csdn.net/haoseren/article/details/128781577</guid><author>haoseren</author><pubDate>Sat, 28 Jan 2023 20:16:10 +0800</pubDate><description><![CDATA[只要运用正确，在keil的debug模式，测得的运行时间比用示波器测得的要准确，并且使用方便。按照孔丙火（微信公众号：孔丙火）的测试与理解，keil在debug时，应该是对运行时间进行的计算，应该是比较准的。]]></description><category></category></item><item><title><![CDATA[Modbus的通信参数存在flash中，如果改乱了，该怎么办--FreeModbus从站设计（12）]]></title><link>https://blog.csdn.net/haoseren/article/details/118614497</link><guid>https://blog.csdn.net/haoseren/article/details/118614497</guid><author>haoseren</author><pubDate>Fri, 09 Jul 2021 20:54:05 +0800</pubDate><description><![CDATA[将Modbus的通信参数存储在单片机STM32F103C8T6的flash中，可以简化硬件电路设计，功能扩展也更加灵活。这种方法也有副作用，因为是用通信的方法修改参数，如果用户把上次修改的参数忘记了，岂不是无法建立串口连接了？要么一个一个参数地试，费时费力，要么重新刷单片机的程序，但这需要开发工程师的参与。公众号之前有一篇文章，是讲PLC的上电停止功能的，这里可以做一个借鉴，来解决这个问题。大体的意思，就是为用户保留一个数据命令，当单片机上电的时候，收到这个命令，就采用默认的通信参数运行。]]></description><category></category></item><item><title><![CDATA[如何把Modbus的通信参数存在单片机的flash中-FreeModbus从站设计（11）]]></title><link>https://blog.csdn.net/haoseren/article/details/118570359</link><guid>https://blog.csdn.net/haoseren/article/details/118570359</guid><author>haoseren</author><pubDate>Thu, 08 Jul 2021 11:40:12 +0800</pubDate><description><![CDATA[作为从站，Modbus-RTU通信的参数主要包括从站地址和串口参数，串口参数又包括波特率、校验位、停止位等，把这些参数存储在单片机的flash里，孔丙火（微信公众号：孔丙火）认为，可以简化电路设计，应用更加灵活。通用串口参数中数据位，在Modbus-RTU通信中是不需要设置的，因为Modbus协议规范规定，Modbus-RTU的数据位必须为8位。介绍了STM32F103C8T6的flash的组织结构，进一步分析了通信参数在flash中的存储位置，阐述了基于HAL库写flash的方法和通信参数修改的基本流程。]]></description><category></category></item><item><title><![CDATA[单片机程序中，Modbus功能码的回调函数如何编写--FreeModbus从站设计（10）]]></title><link>https://blog.csdn.net/haoseren/article/details/118059803</link><guid>https://blog.csdn.net/haoseren/article/details/118059803</guid><author>haoseren</author><pubDate>Sat, 19 Jun 2021 22:05:02 +0800</pubDate><description><![CDATA[FreeModbus从站设计（10）-Modbus功能码的回调函数如何编写

关键词：FreeModbus CubeMX HAL库 串口 功能码



此系列的前面几篇文章，主要是阐述了用HAL库生成keil工程、如何将FreeModbus的代码加入keil工程、协议栈的初始化、串口和定时器接口函数的修改等内容，并整理了FreeModbus协议栈调与HAL库函数的调用关系，通过以上这些工作，Modbus的通路（串口和定时器）已经通了，下面就是数据的处理部分了。数据处理部分主要是对各个功能码的回调函数的编写.]]></description><category></category></item><item><title><![CDATA[为什么有的PLC需要上电停止功能，能防止PLC变砖，可编程控制器 上电停止 串口通信 梯形图]]></title><link>https://blog.csdn.net/haoseren/article/details/117028152</link><guid>https://blog.csdn.net/haoseren/article/details/117028152</guid><author>haoseren</author><pubDate>Wed, 19 May 2021 14:24:07 +0800</pubDate><description><![CDATA[PLC（可编程控制器）在工业控制中使用非常广泛，型号很多，有一部分PLC有上电停止的功能，它们为什么需要这个功能呢？孔丙火（微信公众号：孔丙火）分析了上电停止的具体用途及实现路径，对于没有启停旋钮、没有专用编程口或编程电缆、通信口即作为编程口又作为通用口、通信口同时支持主站和从站设置的PLC，上电停止功能是需要的。同时，这种设计，对于单片机的串口通信设计，具有很好的借鉴意义。]]></description><category></category></item><item><title><![CDATA[不要小瞧TVS管哦，否则要吃大亏]]></title><link>https://blog.csdn.net/haoseren/article/details/116465166</link><guid>https://blog.csdn.net/haoseren/article/details/116465166</guid><author>haoseren</author><pubDate>Thu, 06 May 2021 22:48:41 +0800</pubDate><description><![CDATA[TVS管是常用的保护器件，但在平时正常环境的测试中，并不能明显地感觉到它的存在，好像有没有TVS管，都一个样。TVS管表示很委屈。TVS管本身就是为了在意外情况（比如瞬间高压串扰）保护电路的，既然是意外，就不会一直存在，平时当然就缺乏存在感了。但在实际应用，尤其是工业应用中，没有它是不行的，分享一个实际项目经历，感受一下TVS管的作用。]]></description><category></category></item><item><title><![CDATA[当RS485隔离遇见Freemodbus，你碰到问题了吗？]]></title><link>https://blog.csdn.net/haoseren/article/details/115902374</link><guid>https://blog.csdn.net/haoseren/article/details/115902374</guid><author>haoseren</author><pubDate>Tue, 20 Apr 2021 12:49:52 +0800</pubDate><description><![CDATA[基于RS485物理接口的Modbus总线在工业控制中广泛应用。Freemodbus是一个免费的实用的协议栈，孔丙火（微信公众号：孔丙火）用它实现了一个从站。串口收发信号和RS485芯片的收发使能信号采用光耦进行了隔离，在测试过程发现了偶尔出现TimeOut的问题，经过查找及分析，发现是光耦信号延时导致的，给出了解决方案，并对问题进行了详细分析。]]></description><category></category></item><item><title><![CDATA[用两张图，详解FreeModbus在单片机串口上的数据收发过程-FreeModbus从站设计（9）]]></title><link>https://blog.csdn.net/haoseren/article/details/115798934</link><guid>https://blog.csdn.net/haoseren/article/details/115798934</guid><author>haoseren</author><pubDate>Sat, 17 Apr 2021 17:48:35 +0800</pubDate><description><![CDATA[用两张图把FreeModbus在单片机串口上数据收发流程进行了梳理，脉络更加清晰。有了这样一个思路，可以更好地理解，移植FreeModbus的时候，为什么需要修改portserial.c和porttimer.c中的函数，和为什么需要修改串口中断的回调函数。从这篇文章中，也可以看出，采用HAL库是比较简单的，像是中断处理这些内容库函数都已经处理好了，很方便，可以提高开发效率。]]></description><category></category></item><item><title><![CDATA[Modbus-RTU的字符时间是发送一个字节数据的时间吗]]></title><link>https://blog.csdn.net/haoseren/article/details/115718734</link><guid>https://blog.csdn.net/haoseren/article/details/115718734</guid><author>haoseren</author><pubDate>Thu, 15 Apr 2021 10:55:30 +0800</pubDate><description><![CDATA[Modbus-RTU协议中有一个字符时间的概念。Modbus-RTU总线是通过时间间隔来判断一帧数据结束的，3.5个字符时间内没有收到新的数据，则认为这一帧数据结束。那这个字符时间到底是多少呢？确切地说，应该是在偶校验的情况下发送一个byte数据的时间。]]></description><category></category></item><item><title><![CDATA[CAN总线和Modbus总线，该如何选择]]></title><link>https://blog.csdn.net/haoseren/article/details/115618261</link><guid>https://blog.csdn.net/haoseren/article/details/115618261</guid><author>haoseren</author><pubDate>Mon, 12 Apr 2021 13:10:51 +0800</pubDate><description><![CDATA[CAN总线和Modbus总线是工控领域常用的两种现场总线，简单的说哪个好哪个不好是没有意义的，要根据不同的应用场景来做选择。CAN总线是无主结构，在通信方式上更加灵活，且是短帧发送，单帧数据消耗的总线带宽更少，但传输大量数据时效率会降低。Modbus总线是主从结构，只有主站能发起通信，但每帧数据的数据量比较大，在传输大量数据时有优势。实时性方面也不能单纯地说哪个高哪个低，还是要看用户的需求。系统集成怎么选、实时语音传输怎么选、传输故障停机信号怎么选，以3个小案例为基础，描述了该如何在CAN总线和Modbus]]></description><category></category></item><item><title><![CDATA[CAN总线是一种基于“先来后到、无损仲裁”机制、多主（无主）结构、具有帧ID、应用数据最多8个字节、采用差分电平的国际标准现场总线]]></title><link>https://blog.csdn.net/haoseren/article/details/115519974</link><guid>https://blog.csdn.net/haoseren/article/details/115519974</guid><author>haoseren</author><pubDate>Thu, 08 Apr 2021 14:47:40 +0800</pubDate><description><![CDATA[用一句话概括CAN总线的基本特征：CAN总线是一种基于“先来后到、无损仲裁”机制、多主（无主）结构、具有帧ID、应用数据最多8个字节、采用差分电平的国际标准现场总线。虽然没有面面俱到，但体现了CAN总线的重点特色，有利于对CAN总线有一个清晰的认识。]]></description><category></category></item><item><title><![CDATA[其实ST的HAL库与FreeModbus移植很配哦--FreeModbus从站设计（8）]]></title><link>https://blog.csdn.net/haoseren/article/details/115056602</link><guid>https://blog.csdn.net/haoseren/article/details/115056602</guid><author>haoseren</author><pubDate>Sun, 21 Mar 2021 21:33:19 +0800</pubDate><description><![CDATA[用HAL库函数理清Modbus的数据收发流程。阐述了HAL库与FreeModbus协议栈接口的基本框架。最初设想是能不能完全用HAL库的函数来实现的FreeModbus移植。基于HAL库实现vMBPortSerialEnable()这个函数。]]></description><category></category></item><item><title><![CDATA[FreeModbus从站设计（7）-如何让RTU的定时器正常工作起来]]></title><link>https://blog.csdn.net/haoseren/article/details/115024888</link><guid>https://blog.csdn.net/haoseren/article/details/115024888</guid><author>haoseren</author><pubDate>Sat, 20 Mar 2021 11:38:01 +0800</pubDate><description><![CDATA[在CubeMX工程配置中，已经将定时器2（TIM2）的时钟周期（可以理解为心跳一下）设为50us，Counter Period（产生中断）暂时设为了35，也就是说50us×35=1750us产生一次中断，这个时间就是判断RTU中帧间隔的标准。但在Freemodbus协议栈（遵循Modbus国标）中，这个时间不是固定的，在波特率小于19200bps时，需要具体计算这个时间，当波特率大于或等于19200bps时，这个时间固定为1750us，如图1所示。因此，孔丙火（微信公众号：孔丙火）认为，把它设为固定值是不方]]></description><category></category></item><item><title><![CDATA[STM32F103、FreeModbus从站设计（6）-让串口和Modbus初始化的参数同步起来]]></title><link>https://blog.csdn.net/haoseren/article/details/114990384</link><guid>https://blog.csdn.net/haoseren/article/details/114990384</guid><author>haoseren</author><pubDate>Thu, 18 Mar 2021 20:55:00 +0800</pubDate><description><![CDATA[FreeModbus从站设计（6）-让串口和Modbus初始化的参数同步起来

关键词：Modbus FreeModbus STM32F103C8T6 CubeMX 移植



1.基本原理

在这一篇文章中，孔丙火（微信公众号：孔丙火）主要介绍协议栈初始化，以及与串口相关的代码修改。串口的初始化函数是CubeMx自动生成的，其波特率等参数最好与freemodbus协议栈初始化参数保持一致，这样方便程序的维护和功能扩展，例如，当需要修改通信的波特率的时候，只需要修改一处就可以了，不用先修改串口的初始化参数.]]></description><category></category></item><item><title><![CDATA[STM32F103、FreeModbus从站设计（5）-如何将FreeModbus代码加入keil工程]]></title><link>https://blog.csdn.net/haoseren/article/details/111737553</link><guid>https://blog.csdn.net/haoseren/article/details/111737553</guid><author>haoseren</author><pubDate>Sat, 26 Dec 2020 13:44:46 +0800</pubDate><description><![CDATA[STM32F103、FreeModbus从站设计（5）-如何将FreeModbus代码加入keil。详细阐述如何获取freemodbus代码，代码的大体结构，如何将freemodbus加入keil工程。讲解了注意事项，全实战演示，实际可用。]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6、FreeModbus从站的设计与测试（4）——定时器、中断初始化（CubeMX配置）]]></title><link>https://blog.csdn.net/haoseren/article/details/110875253</link><guid>https://blog.csdn.net/haoseren/article/details/110875253</guid><author>haoseren</author><pubDate>Tue, 08 Dec 2020 15:58:21 +0800</pubDate><description><![CDATA[关键词：Modbus FreeModbus STM32F103C8T6 CubeMX

1.串口参数设置

我们选择UART2来做RS485接口，UART1作为备用，用来做调试中的串口打印用。串口的参数配置比较简单，不再赘述。注意要启用串口中断，FreeModbus采用中断的方式接受和发送串口数据。

2.定时器参数设置

采用TIM2来作为FreeModbus的定时器，孔丙火（微信公众号：孔丙火）这里主要实现工业控制中常用的Modbus-RTU功能，RTU协议中是靠时间间隔来判断一个数据帧是否结束的，所以]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6、FreeModbus从站的设计与测试（3）——时钟、串口初始化（CubeMX配置）]]></title><link>https://blog.csdn.net/haoseren/article/details/109575387</link><guid>https://blog.csdn.net/haoseren/article/details/109575387</guid><author>haoseren</author><pubDate>Mon, 09 Nov 2020 12:44:58 +0800</pubDate><description><![CDATA[关键词：Modbus FreeModbus STM32F103C8T6 CubeMX

1.开发环境

（1）STM32CubeMX，版本：4.27.0，截止写稿时，最新版本已到6，但孔丙火（微信公众号：孔丙火）实在是用不习惯版本5以后的界面，所以还继续用4版本的。



图1

（2）MDK（Keil），版本：5.17，有部分朋友用的还是4版本的，建议升级到5，在5下装一个兼容包，就可以用5打开4版本的程序。

2.时钟及串口初始化

（1）新建CubeMX工程

孔丙火（微信公众号：孔丙火）认为，这一步]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6、FreeModbus从站的设计与测试（2）——硬件设计]]></title><link>https://blog.csdn.net/haoseren/article/details/109542665</link><guid>https://blog.csdn.net/haoseren/article/details/109542665</guid><author>haoseren</author><pubDate>Sat, 07 Nov 2020 08:56:13 +0800</pubDate><description><![CDATA[单片机采用STM32F103C8T6，从孔丙火（微信公众号：孔丙火）的认知来看，这款单片机是当前比较常用的型号之一。UART1用过ISP下载和串口打印，UART2用于RS485通信，整块板子采用DC5V供电，通过AMIS1117转换成3.3V给单片机供电，RS485采用隔离设计，隔离电源采用IB0505S-W75R3，隔离电压是1500VDC，485信号转换及隔离采用ADM2483BRWZ。]]></description><category></category></item><item><title><![CDATA[STM32F103C8T6、FreeModbus从站的设计与测试（1）——引言]]></title><link>https://blog.csdn.net/haoseren/article/details/109136081</link><guid>https://blog.csdn.net/haoseren/article/details/109136081</guid><author>haoseren</author><pubDate>Sat, 17 Oct 2020 17:46:08 +0800</pubDate><description><![CDATA[用FreeModbus协议栈实现一个基于串口通信的Modbus从站，采用什么单片机呢，这个可以随便选，只要有一个UART接口就可以，那就选一个常用的，意法半导体的STM32F103C8T6，Cortex-M3的内核，片上资源对于Modbus协议来说也足够。]]></description><category></category></item><item><title><![CDATA[关于freemodbus协议中eMBFuncReadHoldingRegister()函数的所谓错误]]></title><link>https://blog.csdn.net/haoseren/article/details/108987715</link><guid>https://blog.csdn.net/haoseren/article/details/108987715</guid><author>haoseren</author><pubDate>Fri, 09 Oct 2020 22:33:11 +0800</pubDate><description><![CDATA[摘要：网上看到有好心的网友提示，freemodbus协议中的mbfuncholding.c 文件中eMBFuncReadHoldingRegister()函数，有一处错误，即：第185行的“usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );”应为“usRegCount |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );”，我认为这不能算是一个错误，且听我]]></description><category></category></item></channel></rss>