ST意法半导体
直播中

江左盟

9年用户 1498经验值
擅长:电源/新能源
私信 关注
[问答]

如何使用STM32F205和UART实现一个简单的应用程序?

如果 /r 或 /n 被检测到,我希望打印“收到的字符串”
否则我希望打印“Error”。问题是在检测到第一个字符串后我收到一个输出“String Received”,之后我也收到错误消息。我怀疑我是否已正确实施 __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE) 并启用 HAL_UART_IRQ 处理程序,
在 CubeMx 中初始化所有已配置的外围设备后,我使用了 __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE) 函数
<
/* 用户代码开始 PV */
uint8_t g_rx_receive_complete=0;
  uint8_t g_rx_received_bytes=0;
  char g_rx_buffer [10]={0};
  char rx_buffer [10]={0};
/* 用户代码结束 PV */
/* 用户代码开始 PFP */
作废支票(作废)
{
        
g_rx_buffer[g_rx_received_bytes]=(uint8_t)USART3->DR;
  如果((g_rx_buffer[g_rx_received_bytes]=='n')||(g_rx_buffer[g_rx_received_bytes]=='r'))
   {
     g_rx_buffer[g_rx_received_bytes]=='';
     g_rx_receive_complete= 1;
   }
  别的
   {
    如果(g_rx_received_bytes<10)
    g_rx_received_bytes++;
   }
}
/* 用户代码结束 PFP */
而 (1)
{
  
如果(g_rx_receive_complete)
   {
   memcpy(rx_buffer, g_rx_buffer,sizeof(rx_buffer));
   g_rx_receive_complete=0;
   运行命令(rx_buffer);
/* 用户代码结束 */  
   }
>
STM32f2xx_it.c 中我调用了检查函数
<
void USART3_IRQHandler(void)
{
/* 用户代码开始 USART3_IRQn 0 */
查看();
/* 用户代码结束 USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* 用户代码开始 USART3_IRQn 1 */
/* 用户代码结束 USART3_IRQn 1 */
}
>





回帖(1)

刘涛

2023-1-12 10:31:23
> “如果 /r 或 /n 被检测到,我希望打印“收到的字符串”
否则我希望打印“错误”。”  
“否则”是什么意思?一般超时?已经收到一些字节超时?在预定的字节数之后?
如果收到 r 并且这不是数据包的最后一个字节怎么办?
在编写代码之前,必须回答这些问题以及更多问题
您发布的代码存在 TDK 提到的问题。
此外,代码读取 DR 寄存器,HAL_UART_IRQHandler 稍后再次读取它。
丢失了第一次后再次开始接收的代码。
宏 __HAL_UART_ENABLE_IT 仅启用中断,如果您调用 HAL_UART_Receive_IT(...),则无需调用它。
要启动RX,有3个函数HAL_UART_Receive、HAL_UART_Receive_IT、HAL_UART_Receive_DMA。每次你想接收时就给其中一个打电话。
在您的用户文件夹内的 MXCube 存储库中有可用的 UART 示例。IMO 是研究串行通信的良好起点。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分