ch32v307串口4读取GPS数据乱码

ch32v307使用串口4中断方式读取GPS数据乱码。

声明:

//void USART4_IRQHandler(void) __attribute__((interrupt())); // 串口4不工作
void UART4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

初始化:

void uart4_init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};
    USART_InitTypeDef USART_InitStructure = {0};
    NVIC_InitTypeDef  NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

    USART_DeInit(UART4);
    /* UART4 TX-->B.1  RX-->B.0 */
    GPIO_PinRemapConfig(GPIO_PartialRemap_USART4, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(UART4, &USART_InitStructure);

    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_Cmd(UART4, ENABLE);
}

中断处理函数:

void UART4_IRQHandler(void)
{
    //u8 recv_buf; // 存储接收的内容
    if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(UART4, USART_IT_RXNE); // 清除中断标志

        u8 recv_buf = USART_ReceiveData(UART4);   // 存储接收内容
        printf("%c(%d) ", recv_buf, recv_buf);
    }
}

打印出的GPS数据:

y(121) ?(189) ?(221) =(61) ?(157) ?(155) ?(159) ?(167) ?(157) }(125) g(103) W(87) [(91) ?(143) ?(157) ?(171) ?(149) ?(235) ?(183) w(119) O(79) ?(167) ?(155) ?(159) ?(159) ?(167) c(99) A(65) _(95) c(99) w(119) ?(167) }(125) ?(235) {(123) q(113) }(125) ?(159) ?(145) ?(145) ?(153) ?(147) ?(167) ?(167) ?(167) ?(159) ?(167) e(101) ?(167) ?(167) ?(147) ?(229) ?(183) w(119) e(101) ?(167) ?(151) ?(157) ?(163) ?(141) ?(167) ?(167) ?(167) ?(167) ?(155) ?(159) ?(155) ?(167) ?(157) u(117) c(99) S(83) ?(151) ?(229) (0) ?(219) ?(221) ?(197) ?(157) ?(159) ?(145) ?(145) ?(143) ?(147) ?(167) ?(167) ?(167) ?(159) ?(167) e(101) ?(167) ?(167) ?(147) ?(229) ?(183) w(119) e(101) ?(159) ?(151) ?(157) ?(163) ?(141) ?(167)


已确定GPS波特率为115200,串口4的PB0和PB1引脚初始化时交换也为相同乱码。

目前看来串口4一直没有正常工作。

您好,邮件已回复你,打印异常注意加换行符试一下


感谢回复!

实际测试发现为硬件问题,并非串口4问题。


只有登录才能回复,可以选择微信账号登录