高级会员

- 积分
- 670
- 金钱
- 670
- 注册时间
- 2014-4-12
- 在线时间
- 194 小时
|
5金钱
各位大佬:
最近在使用G070RBT6,使用官方的HAL库中HAL_UART_Transmit(&huart2, (uint8_t*)usart_txBuff, length,1000)。
根据网上大佬的程序构造了一个USART_PRINTF
void USART2_printf(char *fmt, ...)
{
uint32_t i, length;
va_list ap;
va_start(ap, fmt);
vsprintf(usart_txBuff, fmt, ap);
va_end(ap);
length = strlen((const char*)usart_txBuff);
HAL_UART_Transmit(&huart2, (uint8_t*)usart_txBuff, length,1000);
memset((char *)usart_txBuff, 0, (COUNTOF(usart_txBuff) - 2));
}
应用的时候我构造的字符串
TX_DATA[0] = 0xC9; TX_DATA[1] = 0x03; TX_DATA[2] = 0x00; TX_DATA[3] = 0x00; TX_DATA[4] = 0x00; TX_DATA[5] = 0x00; TX_DATA[6] = 0x00;TX_DATA[7] = 0x03;TX_DATA[8] = 0xE8;
然后使用USART2_printf("%s", TX_DATA);进行发送,每次都只能接收到0xC9和0x03两个字符和一串乱码,尝试将所有的0x00修改为0x01后,发送正常。
尝试修改HAL_UART_Transmit函数中
while (huart->TxXferCount > 0U)
{
if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
if (pdata8bits == NULL)
{
huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
pdata16bits++;
}
else
{
huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
pdata8bits++;
}
huart->TxXferCount--;
}
修改为:
while (huart->TxXferCount > 0U)
{
if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
pdata16bits++;
huart->TxXferCount--;
}
问题依旧
尝试重写函数USART2_TRANS
void USART2_TRANS(char *fmt, ...)
{
uint32_t i, length;
va_list ap;
va_start(ap, fmt);
vsprintf(usart_txBuff, fmt, ap);
va_end(ap);
i=0;
length = strlen((const char*)usart_txBuff);
while(length>0)
{
while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) != SET); //等待发送空
USART2->TDR = usart_txBuff[i];
i++;
length--;
}
}
问题依旧出现。
求助大佬应该怎样改写程序。
|
最佳答案
查看完整内容[请看2#楼]
已解决。
length = strlen((const char*)usart_txBuff);参照 http://www.openedv.com/forum.php ... 1420&extra=page%3D1 ,strlen计算的时到第一个0x00的长度,导致一直以来数据长度都不够,后面的不能发送,因此不能调用USART2_printf,直接调用HAL_UART_Transmit(&huart2, (uint8_t*)TX_DATA,8,1000);length为TX_DATA的长度即可。
|