本帖最后由 LiuDW091 于 2025-7-17 21:08 编辑
#有奖活动# #申请原创# #每日话题# #申请开发板#
上篇串口通讯只是打印叔数据,这篇更进一步,将串口发送什么,就打印什么出来
一、查看原理图,确定自己需要的串口信息
还是一样的串口1
二、开始配置软件
上面基础配置结束之后,增加DMA以及NVIC配置
时钟可以根据自己情况,去调整,也可以默认。
到此配置结束,开始生成代码
三、代码调试
1、usart.c中增加如下代码
#include <stdio.h>
/* USER CODE BEGIN 1 */
#ifdef _GNUC_ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印
return ch;
}
/* USER CODE END 1 */
2、main.c中增加如下代码
#include <stdio.h>
#define RXBUFFERSIZE 256 //最大接收字节数 char RxBuffer[RXBUFFERSIZE]; //接收数据
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart8_Rx_Cnt = 0; //接收缓冲计数 /* USER CODE END Includes */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //启动串口中断
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* 防止未使用的参数编译警告 */
UNUSED(huart);
/* 注意: 需要回调时,不应修改该函数、
可在用户文件中实现 HAL_UART_TxCpltCallback */
if(Uart8_Rx_Cnt >= 255) //溢出判断
{
Uart8_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart8_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart8_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart8_Rx_Cnt-2] == 0x0D)) //判断结束位
{
printf("USART1收到的数据:\n\r");
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart8_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart8_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
/* USER CODE END 0 */
四、运行效果
将程序下载demo板后,打开串口软件,查看效果
后续继续努力,争取早日完成测评 代码:
代码Core.zip
(22.88 KB)
|