OpenEdv-开源电子网

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

hal库串口发送进入HardFault_Handler

[复制链接]

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
发表于 2020-12-17 19:19:56 | 显示全部楼层 |阅读模式
1金钱
在HAL_UART_Transmit中串口忙。

uint8_t RS485_TX_BUFF[512];//发送缓冲区


  uint8_t i;
  RegNum= ((RS485_RX_BUFF[4])<<8)+RS485_RX_BUFF[5];//获取寄存器数量
  if((startRegAddr+RegNum)<1000)//寄存器地址+数量在范围内
  {
    RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
    RS485_TX_BUFF[1]=RS485_RX_BUFF[1];
    RS485_TX_BUFF[2]=RegNum*2;
    for(i=0;i<RegNum;i++)
    {
      RS485_TX_BUFF[4+i*2]=*Modbus_HoldReg[startRegAddr+i]&0xFF;//先发送高字节
      RS485_TX_BUFF[3+i*2]=(*Modbus_HoldReg[startRegAddr+i]>>8)&0xFF; //后发送低字节
    }
    calCRC=CRC_Compute(RS485_TX_BUFF,RegNum*2+3);
    RS485_TX_BUFF[RegNum*2+3]=calCRC&0xFF;
    RS485_TX_BUFF[RegNum*2+4]=(calCRC>>8)&0xFF;
    RS485_SendData(RS485_TX_BUFF,RegNum*2+5);
  }



void RS485_SendData(uint8_t *buff,uint8_t len)
{
  RS485_TX_EN=1;//切换为发送模式
        while(len--)
        {
                        HAL_UART_Transmit(&huart1, (uint8_t *)(buff++), 1,0xFFFF);       
        }

}





HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  uint8_t  *pdata8bits;
  uint16_t *pdata16bits;
  uint32_t tickstart;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return  HAL_ERROR;
    }

    /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter
       should be aligned on a u16 frontier, as data to be filled into TDR will be
       handled through a u16 cast. */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      if ((((uint32_t)pData) & 1U) != 0U)
      {
        return  HAL_ERROR;
      }
    }

    __HAL_LOCK(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Init tickstart for timeout management */
    tickstart = HAL_GetTick();

    huart->TxXferSize  = Size;
    huart->TxXferCount = Size;

    /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits  = NULL;
      pdata16bits = (uint16_t *) pData;
    }
    else
    {
      pdata8bits  = pData;
      pdata16bits = NULL;
    }

    __HAL_UNLOCK(huart);

    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--;
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
 楼主| 发表于 2020-12-17 19:21:52 | 显示全部楼层
仿真调试发现的结果,但是原因不知道
微信图片_20201217191839.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-12-18 01:33:59 | 显示全部楼层
chen312aa 发表于 2020-12-17 19:21
仿真调试发现的结果,但是原因不知道

串口接收数据溢出?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
 楼主| 发表于 2020-12-18 08:31:58 | 显示全部楼层
正点原子 发表于 2020-12-18 01:33
串口接收数据溢出?

1. 我现在有两块板,另外一块一直通信都不会。
2. 在发送前我看了数据的长度,才100+,小于512.
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-18 09:39:00 | 显示全部楼层
  1. void BSP_MODBUS_HostSend01H(uint8_t addr, uint16_t reg, uint16_t num), ModbusSendFuncPtr ModbusSend)
  2. {
  3.         uint8_t txBuf[256], m = 0;
  4.         txBuf[m++] = addr;                /* 从站地址 */
  5.         txBuf[m++] = 0x01;                /* 功能码 */       
  6.         txBuf[m++] = reg >> 8;        /* 寄存器编号 高字节 */
  7.         txBuf[m++] = reg;                /* 寄存器编号 低字节 */
  8.         txBuf[m++] = num >> 8;        /* 寄存器个数 高字节 */
  9.         txBuf[m++] = num;                /* 寄存器个数 低字节 */
  10.         uint16_t crc = ModbusCRC(txBuf, m);
  11.         txBuf[m++] = crc >> 8;
  12.         txBuf[m++] = crc;
  13.         ModbusSend(txBuf, m);
  14. }
复制代码


HAL库的多字节发送不是一个函数搞定,为啥你要一个个发呢,浪费时间

HAL_UART_Transmit(&huart1, buff, len,0xFFFF);

发送函数没啥问题,你的485缓冲区是不是有问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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