记录5——stm32f411ceu6之串口实现定长数据、不定长数据收发(另附proteus仿真)

编程入门 行业动态 更新时间:2024-09-28 13:21:45

记录5——stm32f411ceu6之串口实现<a href=https://www.elefans.com/category/jswz/34/1759440.html style=定长数据、不定长数据收发(另附proteus仿真)"/>

记录5——stm32f411ceu6之串口实现定长数据、不定长数据收发(另附proteus仿真)

目录

  • 1.定长数据收发
    • 任务
    • 代码实现
    • Proteus 仿真
  • 2.不定长数据收发
    • 任务
    • stm32cubemx配置
    • 代码实现
    • 效果

1.定长数据收发

任务

利用UART实现任意长度数据的发送,单片机接收到数据后再将数据原样发送给电脑

代码实现

/* USER CODE BEGIN PV */
uint8_t RxBuffer[10];//定义接收区缓冲量
/* USER CODE END PV */
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_UART_Receive(&huart2,RxBuffer,5,0xFFFF);HAL_UART_Transmit(&huart2,RxBuffer,5,0xFFFF);}/* USER CODE END 3 */

Proteus 仿真

  • 同样由于proteus的stm32类型有限,此处以f103c6为例,进行proteus模拟仿真,相关配置参照前面的方法利用CubeMX+Keil+Proteus即可。

注意:设置Crystal Frequency时一定要和之前Cube MX 的时钟树中的相同,否则虚拟串口出现的只是乱码

  • 此处使用USANT8 异步通信,PA9为TX(发送),PA10为RX(接收)。

  • 实现效果:
    开始模拟时会跳出虚拟串口窗口;
    当每输入5个字符,窗口会显示一次这5个字符。如图,显示的是hello中5个字符。

2.不定长数据收发

任务

利用UART实现任意长度数据的发送,单片机接收到数据后在末尾加上换行符发送给电脑。

stm32cubemx配置

UART与DMA开启方法在之前的对应部分有介绍
详情请见:
记录2——stm32f411CEU6的LED灯玩UART+DMA通信、外部中断EXIT、定时器中断(另含Proteus仿真)

代码实现

main.c中

/* USER CODE BEGIN PV */
uint8_t RxBuffer[100];//定义接收区缓冲量
/* USER CODE END PV */
/* USER CODE BEGIN PD */
#include "string.h"//为了后面可以使用strcat连接两个数组
/* USER CODE END PD */
/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_DMA(&huart2,RxBuffer,50);//开启接收区的DMA__HAL_UART_ENABLE_IT(&huart2 ,UART_IT_IDLE);//使能空闲中断/* USER CODE END 2 */

stm32f4xx_it.c中
手动添加空闲中断的内容

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern uint8_t RxBuffer[100];//外部声明
/* USER CODE END PV */

(在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用")

void USART2_IRQHandler(void)
{/* USER CODE BEGIN USART2_IRQn 0 */if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET )//获取的空闲中断标志位非0,此时说明触发空闲中断{char str[]="\r\n";//换行用数组包含回车加换行__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除空闲中断标志位HAL_UART_DMAStop(&huart2);//数据已传输结束,停止DMA接收uint8_t len= 50- __HAL_DMA_GET_COUNTER(huart2.hdmarx);//总数-剩余字节数=实际接收字节数strcat((char*)RxBuffer ,str );HAL_UART_Transmit_DMA(&huart2,RxBuffer,len+2);//将接收的字节数重新发送回电脑HAL_UART_Receive_DMA(&huart2,RxBuffer,50);//再次开启DMA接收}/* USER CODE END USART2_IRQn 0 */

补充:
DOS和Windows:需要\r\n才解析为有效的回车换行,否则只有回行首或只有换行。

Unix和Mac OS X:将\n解析为有效的回车换行。

Macintosh/OS 9:将\r解析为有效的回车换行。

\r代表Carriage Return;
\n代表Line Feed。

效果

更多推荐

记录5——stm32f411ceu6之串口实现定长数据、不定长数据收发(另附proteus仿真)

本文发布于:2024-02-28 04:26:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768092.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:定长   数据   串口   收发   proteus

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!