我在
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 波特,这也很糟糕。
我知道我一定缺少一些基本的东西......?请提供一些建议,