OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3856|回复: 2

HAL库串口发送0x00时出现异常,求解决

[复制链接]

10

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
670
金钱
670
注册时间
2014-4-12
在线时间
194 小时
发表于 2022-3-25 19:12:12 | 显示全部楼层 |阅读模式
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的长度即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
670
金钱
670
注册时间
2014-4-12
在线时间
194 小时
 楼主| 发表于 2022-3-25 19:12:13 | 显示全部楼层
已解决。
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的长度即可。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-3-26 00:34:31 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 20:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表