21ic问答首页 - GD32F103串口问题
GD32F103串口问题
无名人1232021-06-04
串口初始化时,校验位为偶校验,数据位8时,单片机发出来的数据是乱码,后来问了一下芯片厂家,他们说设置校验位的时候数据位要设置成9,但是发出来的数据还是部分是乱码。重点来了:我设置无校验,数据位8时,跟上位机通信,无论串口组手有没有校验位(奇偶或者无校验)都能通信成功,且数据正常,这谁能给解释一下原因。串口相关代码如下:
void CIOControl::USART_Config(void)
{
rcu_periph_clock_enable(RCU_USART2);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
/* USART configure */
usart_deinit(USART2);
usart_baudrate_set(USART2, 2400);
usart_word_length_set(USART2, USART_WL_8BIT);
usart_stop_bit_set(USART2, USART_STB_1BIT);
usart_parity_config(USART2, USART_PM_NONE);
usart_hardware_flow_rts_config(USART2, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART2, USART_CTS_DISABLE);
usart_receive_config(USART2, USART_RECEIVE_ENABLE);
usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
usart_enable(USART2);
usart_interrupt_enable(USART2, USART_INT_RBNE);
nvic_irq_enable(USART2_IRQn, 1, 0);
}
INT8U CUART::SendData(INT8U *DataBuf, INT16U DataLen)
{
INT8U j;
for(INT16U i = 0; i < DataLen; i++)
{
usart_data_transmit(m_UARTNum, DataBuf[i]);
Delay_ms(1);
for(j = 0; j < 200; j++)
{
if(usart_flag_get(m_UARTNum, USART_FLAG_TC) != RESET)
{
usart_flag_clear(m_UARTNum, USART_FLAG_TC);
break;
}
Delay_us(100);
}
if(j == 200) //20ms没有发送成功,则认为发送失败
{
return FALSE;
}
}
return TRUE;
}
void CIOControl::USART_Config(void)
{
rcu_periph_clock_enable(RCU_USART2);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
/* USART configure */
usart_deinit(USART2);
usart_baudrate_set(USART2, 2400);
usart_word_length_set(USART2, USART_WL_8BIT);
usart_stop_bit_set(USART2, USART_STB_1BIT);
usart_parity_config(USART2, USART_PM_NONE);
usart_hardware_flow_rts_config(USART2, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART2, USART_CTS_DISABLE);
usart_receive_config(USART2, USART_RECEIVE_ENABLE);
usart_transmit_config(USART2, USART_TRANSMIT_ENABLE);
usart_enable(USART2);
usart_interrupt_enable(USART2, USART_INT_RBNE);
nvic_irq_enable(USART2_IRQn, 1, 0);
}
INT8U CUART::SendData(INT8U *DataBuf, INT16U DataLen)
{
INT8U j;
for(INT16U i = 0; i < DataLen; i++)
{
usart_data_transmit(m_UARTNum, DataBuf[i]);
Delay_ms(1);
for(j = 0; j < 200; j++)
{
if(usart_flag_get(m_UARTNum, USART_FLAG_TC) != RESET)
{
usart_flag_clear(m_UARTNum, USART_FLAG_TC);
break;
}
Delay_us(100);
}
if(j == 200) //20ms没有发送成功,则认为发送失败
{
return FALSE;
}
}
return TRUE;
}
您需要登录后才可以回复 登录 | 注册