STM32
直播中

刘慧

7年用户 1679经验值
私信 关注
[问答]

如何利用stm32的hal库uart发送9位数数据呢

如何用串口的mark去校验数据呢?

如何利用STM32的hal库uart发送9位数数据呢?

回帖(1)

李聪聪

2021-12-6 10:05:02
stm32hal库uart发送9位数数据




  • 近日搞一个项目,要用到串口的mark校验数据,也就是发送9位数据,串口发送数据需要校验位为mark校验,就是校验位固定设置成1,就需要8位数据位,1位校验位,1位停止位。串口设置为以下设置。


void MX_UART7_Init(void)
{
  huart7.Instance = UART7;
  huart7.Init.BaudRate = 9600;
  huart7.Init.WordLength = UART_WORDLENGTH_9B; //数据位宽为9位
  huart7.Init.StopBits = UART_STOPBITS_1;
  huart7.Init.Parity = UART_PARITY_NONE;       //既不选择奇校验,也不选择偶校验
  huart7.Init.Mode = UART_MODE_TX_RX;
  huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart7.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart7) != HAL_OK)
  {
    Error_Handler();
  }
}

  • 如以上代码设置,可以发送9位数据。下面介绍如何发送9位数据,并且把校验位设置成固定的1。首先说明如何把校验位设置成固定的1。修改hal库串口发送函数。


HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
   ………
   //以上代码没做修改
   if (huart->Init.WordLength == UART_WORDLENGTH_9B) //数据位宽为9位进入此函数
   {
     if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
     {
       return HAL_TIMEOUT;
     }
     tmp = (uint16_t *) pData;  
     *tmp |= 0x0100;  //在此处加入这行语句,设置校验位为1。
     huart->Instance->DR = (*tmp & (uint16_t)0x01FF);
     if (huart->Init.Parity == UART_PARITY_NONE)
     {
       pData += 2U;  //数据位为9位并且没有设置奇偶校验,条件判断会进入此处,指向数组的指针要加2。
     }
     else
     {
       pData += 1U;
     }
   }
   //以下代码也不需要修改
   ………
}

  • 分析以上代码,如果要正常发送数据,在发送数据的时候,要用16位数组,再在传入发送函数时,强转为8位地址,传入发送函数。如以下代码。


void Usart7Tx(uint8_t* buff,uint16_t length)
{
          HAL_UART_Transmit(&huart7, buff, length, 0xff);
}
void SearchSetI(uint8_t addr)
{
        uint16_t buff[8];
        buff[0] = addr;
        buff[1] = 0x04;
        buff[2] = 0x00;
        buff[3] = 0x08;
        buff[4] = 0x00;
        buff[5] = 0x01;
        buff[6] = 0xff;
        buff[7] = 0xff;
    Usart7Tx((uint8_t *)buff,8); //重要的是在这强转数组地址。
}

  • 如以上代码,可以正常发送9位数据,并且把校验位设置成固定1。
  • 此次分享就到这里,希望大家多多交流,多多指教!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分