USART中断无法按预期工作

2019-07-14 17:41发布

有人可以解释为什么我只能收到带有USART中断的13个字符吗?我使用' n'来检测字符串的结尾。
1.png
  1. #define BUFFER_SIZE 100

  2. char receive_buffer[BUFFER_SIZE];
  3. char receive_data;
  4. int receive_index = NULL;
  5. int data_ready_index = NULL;

  6. void USART2_receive(void const * argument){
  7.          for(;;){
  8.                 if(data_ready_index == 1){
  9.                 HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Received data: ", strlen("Received data: "));
  10.                 HAL_Delay(50);
  11.                 HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer, strlen(receive_buffer));
  12.                 memset(receive_buffer, NULL, sizeof(receive_buffer));
  13.                 HAL_Delay(50);
  14.                 HAL_UART_Transmit_IT(&huart2, (uint8_t *)" ", strlen(" "));
  15.                 data_ready_index = NULL;
  16.                 }
  17.          }
  18.      }

  19.     void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

  20.         if (huart->Instance == USART2){
  21.             if (receive_data != 13){
  22.                 receive_buffer[receive_index++]=receive_data;
  23.             }else{
  24.                     receive_index = NULL;
  25.                     data_ready_index = 1;                                                               
  26.                     // Received data ready to be processed
  27.             }
  28.       }
  29.     }

  30.     void USART2_IRQHandler(void){

  31.       HAL_UART_IRQHandler(&huart2);
  32.       HAL_UART_Receive_IT(&huart2, (uint8_t *) &receive_data, 1);
  33.     }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
四哥201311
1楼-- · 2019-07-14 22:07
你说你检查 但是你的代码正在检查 哪个是13并且你只处理13个字节,但是为什么strlen给出超过13个并且用它们发送一些0x00字节(<0>) - 你得到的消息是传输消息的长度,只是最后3个字节的内容是错误的。
fhdgxfvx
2楼-- · 2019-07-15 00:29
如果我发送较小的块(少于14),一切正常。如果我发送没有CR,它根本不会出现。
四哥201311
3楼-- · 2019-07-15 02:32
 精彩回答 2  元偷偷看……
fhdgxfvx
4楼-- · 2019-07-15 04:43
我发现了问题。在void USART2_receive(void const * argument)函数中,我将延迟从50增加到100,然后一切正常。正如@MITURAJ所提到的,这可能是由缓冲区溢出引起的。
  1. void USART2_receive(void const * argument){
  2.     for(;;){
  3.         if(data_ready_index == 1){
  4.             HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Received data: ",
  5.             strlen("Received data: "));
  6.             HAL_Delay(100);
  7.             HAL_UART_Transmit_IT(&huart2, (uint8_t *)receive_buffer,
  8.             strlen(receive_buffer));
  9.             HAL_Delay(100);
  10.             HAL_UART_Transmit_IT(&huart2, (uint8_t *)" ", strlen(" "));
  11.             data_ready_index = NULL;
  12.             memset(receive_buffer, NULL, sizeof(receive_buffer));
  13.         }
  14.     }
  15. }
复制代码
bleupealike
5楼-- · 2019-07-15 05:26
延迟的目的是什么,为什么增加它会解决问题?
jhhfhgj
6楼-- · 2019-07-15 07:52
发现你需要更长的延迟应该让你知道你没有等待Tx实际完成。HAL_UART_Transmit_IT使用中断发送字节(它是非阻塞的)。你基本上是在传输完成之前告诉它传输,等待一点,然后再将数据塞进缓冲区!
相反,我建议你监视回调到HAL_UART_TxCpltCallback,一旦发生这种情况就设置一些标志。在USART2_receive函数中,在要求它再次发送之前等待标志设置。记得在等待它再次设置之前清除标志

一周热门 更多>