蓝桥杯——USART \ UART _TX

本文探讨了如何在Cubemx中配置异步和同步模式的UART/USART通信,并重点介绍了HAL库的使用。遇到的问题如串口延迟问题和printf换行符调整得到解答。关键词包括UART、USART、HAL库、printf重写、异步/同步模式。

cubemx配置

可以选异步模式,但是他给你配置的却是uart的引脚(PC4,5)!!!函数都是!!!

所以如果要用的话就要写

HAL_UART_Transmit( &husart1 , (uint8_t *)"hello DISCO\r\n" , sizeof("hello DISCO\r\n"), 0xFFFF);

如果你选择了同步模式,那么他给你配置的是usart的引脚(PC4,5)!!!但是引脚PA9,10也要记得换!!!

HAL_USART_Transmit( &husart1 , (uint8_t *)"hello DISCO\r\n" , sizeof("hello DISCO\r\n"), 0xFFFF);

代码编写

uart中文传输

1.配置语言

 

 2.把main.c配置成ANSI格式

 这样就不会乱码了

但是我测试了好像不用改都没事,先放着,出问题就记得可以这样解决

printf重写

目的:重写printf,使这函数能够自动发送串口。

这里写图片描述

 上面这个十分重要!!!

错误疑问

1.不知道为啥Delay(1)可以正常运行,但是delay100就发现串口一开始不会发送,但是后面就会成堆发送,不能按照程序来运行,我也不知道为什么,我还试过for循环来延时,也是一样的错误效果。可能是板子问题把。

2.printf的时候如果直接用换行符 \n 可能会失败,需要 \r\n 才行

希望有大佬解答我疑惑

define UART_INDEX (DEBUG_UART_INDEX ) // 默认 UART_0 #define UART_BAUDRATE (DEBUG_UART_BAUDRATE) // 默认 115200 #define UART_TX_PIN (DEBUG_UART_TX_PIN ) // 默认 UART0_TX_P14_0 #define UART_RX_PIN (DEBUG_UART_RX_PIN ) // 默认 UART0_RX_P14_1 #define LED1 P20_9 uint8 uart_get_data[64]; // 串口接收数据缓冲区 uint8 fifo_get_data[64]; // fifo 输出读出缓冲区 uint8 get_data = 0; // 接收数据变量 uint32 fifo_data_count = 0; // fifo 数据个数 fifo_struct uart_data_fifo; int core0_main(void) { clock_init(); // 获取时钟频率<务必保留> debug_init(); // 初始化默认调试串口 // 此处编写用户代码 例如外设初始化代码等 fifo_init(&uart_data_fifo, FIFO_DATA_8BIT, uart_get_data, 64); // 初始化 fifo 挂载缓冲区 gpio_init(LED1, GPO, GPIO_HIGH, GPO_OPEN_DTAIN); uart_rx_interrupt(UART_INDEX, 1); // 开启 UART_INDEX 的接收中断 cpu_wait_event_ready(); // 等待所有核心初始化完毕 while (TRUE) { // 此处编写需要循环执行的代码 } } _Bool checkCmd(uint8_t* str) { //仅作举例 CNBR:A392:200202120000 蓝桥杯误入 if((str[0] == 'C' || str[0] == 'V') && str[1] == 'N' && str[2] == 'B' && str[3] == 'R' && str[4] == ':' && str[9] == ':') { uint8_t i; for(i = 10; i < 22; i++) { if(str[i] > '9' || str[i] < '0') return 0; } return 1; } else { memset(fifo_get_data,0,22); return 0; } } //------------------------------------------------------------------------------------------------------------------- // 函数简介 UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用 // 参数说明 void // 返回参数 void // 使用示例 uart_rx_interrupt_handler(); //------------------------------------------------------------------------------------------------------------------- void uart_rx_interrupt_handler (void) { // get_data = uart_read_byte(UART_INDEX); // 接收数据 while 等待式 不建议在中断使用 uart_query_byte(UART_INDEX, &get_data); // 接收数据 查询式 有数据会返回 TRUE 没有数据会返回 FALSE fifo_write_buffer(&uart_data_fifo, &get_data, 1); // 将数据写入 fifo 中 fifo_data_count = fifo_used(&uart_data_fifo); // 查询数组当前数据个数 if(fifo_data_count == 22) //读到指定数目后开始解析 { fifo_read_buffer(&uart_data_fifo, fifo_get_data, &fifo_data_count, FIFO_READ_AND_CLEAN); // 将 fifo 中数据读出并清空 fifo 挂载的缓冲 //一些格式判断语句,防止有数据丢失导致格式错误 if(checkCmd(fifo_get_data)) { gpio_toggle_level(LED1); //usart_analysis(); 串口解析函数,需要自己编写 memset(fifo_get_data,0,fifo_data_count); } } } IFX_INTERRUPT(uart0_rx_isr, 0, UART0_RX_INT_PRIO) { interrupt_global_enable(0); // 开启中断嵌套 IfxAsclin_Asc_isrReceive(&uart0_handle); uart_rx_interrupt_handler(); // 串口接收处理 } AI写代码 cpp 运行 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.youkuaiyun.com/weixin_55024277/article/details/128692383不用fifo怎么写
最新发布
09-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值