内容概要:本文详细介绍了三菱FX3U PLC的底层源码及其高级功能,涵盖RUN中下载程序、脉冲输出与定位指令以及自适应波特率等功能的具体实现方法和技术细节。文章首先展示了通信协议的基本结构,接着深入探讨了RUN中下载程序的技术要点,包括硬件中断处理和热更新机制。随后,文章讲解了脉冲输出指令(如PLSY和PLSV)的使用技巧,强调了加减速时间和脉冲堆积的问题。此外,还讨论了自适应波特率的实现方式,包括波特率自动侦测和通信帧结构。最后,文章提到了注释读写的实用性和注意事项。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉三菱PLC系统的用户。 使用场景及目标:帮助工程师更好地理解和利用三菱FX3U PLC的高级功能,提高现场调试效率,优化设备性能,确保稳定可靠的通信和控制。 其他说明:文中提供了大量代码示例和具体的操作步骤,便于读者快速上手并应用于实际项目中。
2025-07-17 17:09:07 603KB PLC 通信协议 自适应波特率
1
STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制 STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率。 STM32 中一般的 DMA 传输方向有内存->内存、外设->内存、内存->外设。通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),在嵌入式开发中一般称为串口,通常用于中、低速通信场景,波特率低有 6400 bps,高能达到 4~5 Mbps。 在 STM32 中使用 DMA 收发数据,可以节约可观的 CPU 处理时间。特别是在高速、大数据量的场景中,DMA 是必须的,而双缓冲区、空闲中断以及 FIFO 数据缓冲区也是非常重要的成分。 在本文中,我们将使用 STM32CubeMX 配置串口,首先使能高速外部时钟,然后设置时钟树。接下来配置串口,选择一个串口,设置模式为 Asynchronous,设置波特率、帧长度、奇偶校验以及停止位长度。然后添加接收和发送的 DMA 配置,注意在 RX 中将 DMA 模式改为 Circular,这样 DMA 接收只用开启一次,缓冲区满后 DMA 会自动重置到缓冲区起始位置,不再需要每次接收完成后重新开启 DMA。 在串口收到数据之后,DMA 会逐字节搬运到 RX_Buf 中。当搬运到一定的数量时,就会产生中断(空闲中断、半满中断、全满中断),程序会进入回调函数以处理数据。全满中断和半满中断都很好理解,就是串口 DMA 的缓冲区填充了一半和填满时产生的中断。而空闲中断是串口在上一帧数据接收完成之后在一个字节的时间内没有接收到数据时产生的中断,即总线进入了空闲状态。 现在网络上大部分教程都使用了全满中断加空闲中断的方式来接收数据,不过这存在了一定的风险:DMA 可以独立于 CPU 传输数据,这意味着 CPU 和 DMA 有可能同时访问缓冲区,导致 CPU 处理其中的数据到中途时 DMA 继续传输数据把之前的缓冲区覆盖掉,造成了数据丢失。所以更合理的做法是借助半满中断实现乒乓缓存。 乒乓缓存是指一个缓存写入数据时,设备从另一个缓存读取数据进行处理;数据写入完成后,两边交换缓存,再分别写入和读取数据。这样给设备留足了处理数据的时间,避免缓冲区中旧数据还没读取完又被新数据覆盖掉的情况。 但是出现了一个小问题,就是 STM32 大部分型号的串口 DMA 只有一个缓冲区,要怎么实现乒乓缓存呢?没错,半满中断。现在,一个缓冲区能拆成两个来用了。看这图我们再来理解一下上面提到的三个中断:接受缓冲区的前半段填满后触发半满中断,后半段填满后触发全满中断;而这两个中断都没有触发,但是数据包已经结束且后续没有数据时,触发空闲中断。 举个例子:向这个缓冲区大小为 20 的程序传送一个大小为 25 的数据包,它会产生三次中断,如下图所示。程序实现原理介绍完成,感谢 ST 提供了 HAL 库,接下来再使用 C 语言实现它们就很简单了。首先开启串口 DMA 接收。 #define RX_BUF_SIZE 20 uint8_t USAR_RX_Buf[RX_BUF_SIZE]; 在上面的例子中,我们定义了一个大小为 20 的缓冲区 USAR_RX_Buf,並将其设置为串口 DMA 的接收缓冲区。然后,我们可以使用 HAL 库提供的函数来开启串口 DMA 接收。 HAL_UART_Receive_DMA(&huart1, USAR_RX_Buf, RX_BUF_SIZE); 在串口收到数据之后,DMA 会逐字节搬运到 RX_Buf 中。当搬运到一定的数量时,就会产生中断(空闲中断、半满中断、全满中断),程序会进入回调函数以处理数据。在回调函数中,我们可以将数据写入 FIFO 中供应用读取。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 将数据写入 FIFO 中 FIFO_Put(USAR_RX_Buf, RX_BUF_SIZE); } 在上面的例子中,我们使用 HAL 库提供的回调函数 HAL_UART_RxCpltCallback 来处理数据。在这个函数中,我们将数据写入 FIFO 中供应用读取。这样,我们就可以轻松地实现高速的串口收发机制。 使用 STM32 HAL 库可以轻松地实现高速的串口收发机制,轻松跑上 2M 波特率。同时,我们还可以使用乒乓缓存和空闲中断来避免数据丢失和提高系统的可靠性。
2025-04-04 19:14:28 1.22MB stm32
1
001实验是在正点原子串口实验(库函数)基础上实现串口修改波特率 发送字符a或b或c或d实现波特率的切换 002实验是在modbus-rtu协议基础之上增加串口2修改波特率函数通过06功能码实现串口波特率的修改 可以使用modbus poll软件模拟主机设备,实现波特率的快速修改 003实验是一个简单的modbus协议实现串口波特率的修改 使用串口助手分别发送一下数据指令(十六进制发送) aa 01 00 55 打开led灯和修改波特率为4800 aa 01 00 55 关闭led灯和修改波特率为9600
2024-03-06 17:02:23 12.19MB stm32modbus
1
使用说明: CAN波特率计算器(ARM): 适用型号: 1.PCI-5010-U PCI-5020-U USBCAN-E-U USBCAN-2E-U Clock:36000KHZ 2.CANET-100T CANET-200T Clock:32000KHZ 3.CANBridge CANHub-AS4 CANHub-AF1S1 CANHub-AF2S2:16000KHZ 4.CANBridge+ 60000KHZ CAN波特率计算器(SJA1000): 适用型号: PCI-9810I PCI-9820 PCI-9820I CPCI-9820I PCI-9840I PCIe-9221 USBCAN-I USBCAN-I+ USBCAN-II USBCAN-II+ Clock:16000KHZ 最佳计算配置为 SJW=4,16分频,采样点75%
2024-01-15 10:51:40 368KB arm can
1
Windows串口调试软件高速版+适用于高波特率串口通讯
2023-11-28 13:58:32 1.79MB windows 串口
1
导航工具集,非常重要,万能导航路径分辨率端口波特率检测工具,通过这个工具可以检测导航的各项参数。
2023-10-01 08:13:53 2.59MB daohang
1
此工具非常好用,波特率可以随意修改。可以随便测试通讯仪器的好坏
2023-06-12 09:17:43 207KB 串口调试助手
1
时间就是金钱,时间就是生命,在效率的社会,时间最重要
2023-04-19 13:36:23 5KB r
1
STC单片机UART通信波特率误差容忍范围研究
2023-04-08 21:52:33 360KB stc 单片机 uart 通信
1
一款用于计算MSP430波特率的工具,指定输入频率与波特率可以计算出寄存器的参数与误差值
2023-04-06 23:09:26 252KB MSP430 单片机 波特率 串口
1