ST意法半导体
直播中

张亮

7年用户 1275经验值
私信 关注
[问答]

在STM32G431上为LPUART使用HAL_UART_Transmit_IT程序,运行时通信非常糟糕怎么解决?

我在 STM32G431 上为 LPUART 使用 HAL_UART_Transmit_IT 程序,以 115200 波特率与 Putty 终端通信。MCU 还运行 ST 电机代码。
我有一些简单的 3 字符命令,可以在代码中设置变量或读回变量。电机未运行时通信相当稳健,但运行时通信非常糟糕。
接口代码在回调 HAL_UART_RxCpltCallback 中一次读取一个字符,并将其放入 Rxbuffer 中。如果字符无效,则清除缓冲区。如果收到 CR,则处理命令并使用 HAL_UART_Transmit_IT 过程将数据传输回 Putty。我可以在传输消息之前中断代码并且数据是正确的,但是当执行 HAL_UART_Transmit_IT 时,返回的数据非常损坏。
这是回调:
  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • {
  •         uint8_t Rx_Char;
  •         uint8_t tmp;
  •         tmp = LPUART1_rxBuffer[0];    // uart receives 1 byte
  •         rx_buffer[Rx_Byte] = tmp;
  •         Rx_Char = tmp;
  •         Rx_Byte++;  // # of accumulated bytes received for current command
  •         if ( (Rx_Char == ESC) || (Rx_Byte > Nbytes))  // clear command state machine immediately
  •         {
  •                 Rx_Byte = 0;
  •         }
  •         else if (Rx_Char == CR) // go process command
  •         {
  •                 Rx_Byte = 0;
  •                 processUserCmnd();
  •         }
  •         else if ( Rx_Char == 0x7F ) // handle backspace
  •         {
  •                 Rx_Byte--;
  •                 Rx_Byte--;
  •                 rx_buffer[Rx_Byte] = 0;
  •         }
  •         HAL_UART_Receive_IT( &hlpuart1, LPUART1_rxBuffer, 1 );  // ready next byte
  • }
processUserCommand 解码 rxBuffer 中的命令并执行命令。例如,解码“SPD”后,它将发回电机速度。
  •                 case 7:                        /* SPD, read speed */
  •                                 /* speed in #SPEED_UNIT's, _001HZ */
  •                                 speed = MC_GetMecSpeedAverageMotor1();
  •                                 sendSPEED(speed);
  •                                 break;
  • void sendSPEED(int16_t spd)
  • {
  •         // send speed in units of 0.001Hz mechanical
  •         if( spd > 32767 ) spd = 32767;
  •         // HZ_001 from ST is 0.01Hz
  •         spd = (spd << 3) +  (spd << 1); // 10x
  •         char msg[15];
  •         sprintf(msg, "speed %5u n", spd);  // convert int16_t to ascii, legal itoa
  •         char v = CR;
  •         strncat(msg, &v, 1);
  •         HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *) msg, 14);
  •         // --- done
  • }
当在第 13 行的 break 处高于 'msg' 的值时会发生什么,但是执行 HAL_UART_Transmit_IT 时,Putty 接收到的数据是错误的。同样,当代码运行电机时,情况更糟,而且我尝试了 9600 波特,这也很糟糕。
我知道我一定缺少一些基本的东西......?请提供一些建议,








回帖(1)

李林

2023-1-11 09:35:45
{
静态字符消息[16];// 执着的
HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)msg, sprintf(msg, “速度 %5u n”, spd));
}
举报

更多回帖

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