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。
- 此次分享就到这里,希望大家多多交流,多多指教!!!
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。
- 此次分享就到这里,希望大家多多交流,多多指教!!!
举报