我在使用圆形DMA进行接收并使用普通模式进行TX接收后,很难使UART发送数据。
在main(void)
HAL_UART_Receive_DMA(&huart2,rx_buff,INCOMING_SETTING_STRING_SIZE);
HAL_UART_Transmit_DMA(&huart2, tx_buff, OUTGOING_SETTING_SIZE);
UART设置
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
RX回叫
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
ProcessSerialSettings();
HAL_UART_Transmit_DMA(&huart2,(uint8_t *)'ACK\n',5);
memset(rx_buff,0,sizeof(rx_buff));
}
我确定我一定会丢失一些东西,因为它似乎太简单了。毫无疑问,每次“ processSerialSettings”函数都会更新一些变量时,数据仍继续进入设备。我想接收一个设置字符串,更新几个变量并返回一个确认。
经过进一步调试后,我现在知道端口的状态正忙,但是当我没有通过TX线路发送任何消息时,怎么办?如果我将TX DMA模式更改为循环模式,则它基本上会向串行端口发送垃圾邮件,直到我的终端窗口崩溃为止。
谢谢!
通过一起删除发送DMA并使用发送来解决:
HAL_UART_Transmit(&huart2,(uint8_t *)'ACK \ n',5);