1.RT-Thread 串口框架的串口串口理解系列---(2)DMA接收与发送
2.[边缘智能开发-反客科技STM32H743IIT6]-UART串口通讯与重定向-轮询/中断/DMA不定长多模式驱动文件编写
3.串口轮训的轮训是什么意思
RT-Thread 串口框架的理解系列---(2)DMA接收与发送
在 RT-Thread 串口驱动框架中,DMA(直接内存访问)的轮询轮询配置是继中断和轮询方式后的重要环节。首先,源码通过在代码库中查找,模式如在`stm_uart_get_config`中启用DMA的串口串口宏,可以获取到相关的轮询轮询快递对接源码配置信息,如UART1_DMA_RX_CONFIG和UART1_DMA_TX_CONFIG,源码这些宏在`dma_config.h`文件中定义。模式接着,串口串口`stm_control`模块会调用`stm_dma_config`函数,轮询轮询进行DMA的源码具体配置,包括确定DMA模式(如接收时为DMA_CIRCULAR,模式插件源码发送时为DMA_NORMAL),串口串口设置DMA方向等。轮询轮询
DMA的源码初始化紧接着进行,通过`HAL_UART_Receive_DMA`和`HAL_UART_Transmit_DMA`函数开始非阻塞的数据接收和发送,同时配置接收和发送中断,如DMA接收满中断、半满中断以及UART空闲中断。当这些中断发生时,会调用`dma_recv_isr`或`dma_send_isr`处理函数,其中会根据中断条件计算接收或发送的数据量,并在数据量不为零时通知上层,金源码完成接收事件或发送完成事件。
在DMA发送中断中,`stm_transmit`函数会调用`HAL_UART_Transmit_DMA`,并通过设置的中断回调函数处理发送完成或半完成状态。发送完成后,会向上层发送`RT_SERIAL_EVENT_TX_DMADONE`事件以告知发送任务已完成。
总之,RT-Thread串口框架中的DMA配置和中断处理机制确保了高效的数据传输,提高了串口通信的性能。
[边缘智能开发-反客科技STMHIIT6]-UART串口通讯与重定向-轮询/中断/DMA不定长多模式驱动文件编写
本文记录了使用反客科技 STMHIIT开发板,结合CUBEMX配置和KEIL编程进行边缘智能开发的免源码全过程,重点讲解了UART串口通讯与重定向驱动文件的编写。特别关注了轮询、中断和DMA三种模式下的驱动文件编写,旨在提供一种实用的串口通讯解决方案。首先,建议读者熟悉STMCUBEMX软件与KEIL的安装环境,以便后续操作。以下是对各部分的详细解释和步骤:
### 前置配置
使用STMCUBEMX进行项目基本配置,可参考已有的配置项目或直接复制配置文件中的ioc部分。设置USART1作为串口接口,并将PA9配置为TX端口,号源码PA配置为RX端口。
### 硬件电路
电路设计中,PA9作为串口发送端,PA作为串口接收端。在CUBEMX中设置相应的引脚。
### CUBEMX配置
配置复杂程度从轮询模式、中断模式到DMA模式递进,选择需要的模式进行配置。基本配置适用于轮询、中断和DMA模式,中断配置需要启用全局中断并设置中断优先级,确保符合功能需求。DMA配置则需在USART界面启用DMA,并设置通道,注意接收端不设为循环模式避免消息回显问题。完成配置后,生成代码并打开KEIL进行项目编译。
### 重定向printf和scanf函数
C语言中,通过重定向底层库中的printf和scanf函数,将其与单片机的串口输入输出进行关联,实现与上位机或其它设备的通讯。实现方式是通过在main.c文件中定义自定义区间,重写fputc和fgetc函数指针,以实现重定向。注意在生成目标设置中勾选MicroLib选项。
### 驱动文件框架准备
为了提高代码的可移植性和组织性,创建iusart.h和iusart.c文件分别作为头文件和源文件,用于管理驱动的相关定义、参数和函数。
### 通讯模式详解
#### 轮询模式通讯
轮询模式是单片机主动查询相关寄存器的状态,进行串口信息收发。该模式较为传统,但在高频率数据处理中效率较低,不推荐使用。
#### 中断模式通讯
中断模式类似于用户在看电视时突然接收到厨房水开的提醒,从而中断当前活动并处理该事件。对于串口通讯,信息输入和输出都可以通过中断实现,提高效率。
#### DAM模式通讯(IDLE不定长)
DAM模式,即直接存储访问,通过DMA控制器在存储器和外设之间高效传输数据,无需CPU介入,尤其适用于大容量数据传输。接收数据时,配合串口空闲中断(IDLE)实现不定长数据的输入。
### 完整代码与驱动文件
驱动文件的代码注释提供了详细的实现逻辑。iusart.h文件定义了驱动的接口和参数,iusart.c文件实现了相关函数。main.c文件包含主程序和初始化部分,与驱动文件协同工作。
### 结语
通过本文的介绍,您可以完成串口通讯驱动的独立配置,适用于边缘智能开发中的UART串口通讯需求。如果您使用的是类似CUBEMX的配置环境,以上文件可直接应用于项目中。欢迎关注个人GitHub和博客,获取更多相关资源。
串口轮训的轮训是什么意思
应该是 串口轮询
我这里有一个设备,该设备能够提供rs-通讯,这个设备是用被动的模式实现rs-通讯的.通讯协议我有.需要有一套软件对该设备(可能是个)进行轮询,而后捕获各个数据反馈数据采集到以后需要存储到数据库中.
轮询的算法写不出来,请大家看看我的代码,帮忙提提建议,谢谢!
我的想法是: 用定时器每5分钟轮询一次,每个周期需要从5台设备query数据.
在一个轮询周期中,主机需要分别发一个命令给每个设备,收到设备回答后,方可继续query下一个设备. 依次查询,5台都查完之后, 等到下一个轮询周期到来.再分别发命令给5台设备.
我的困难是不知道如何实现上面的算法:
我在OnTimer 里面发命令给设备,COM1口如果有数据,即触发MSCOMM控件的OnCommMscomm1事件.在这个事件处理函数中,如果数
据包没结束,则先KillTimer(暂停定时器,即下一个命令不能发), 如数据包接收完整,则再次SetTimer.
可是我的代码只能应对一台设备, 5台设备怎么办呢? 在OnTimer函数中for循环好像不行吧.
我要的是: 主机与一台设备对话时, 不能再发下一个命令, 直到收到当前设备回应. 收到后立马再与下一个设备通话, 5台全部通讯完, 停止等待下一个query周期的到来.