串口1~串口8 通信问题

问题描述:我想打开串口1~8 然后将串口收到的数据原路发回,打开1、2、3、7串口发送和接收都正常,4、5、6串口能收到数据,但是发不出去,8串口收不到也发不出

调试方法:串口转usb工具连接pc,tx和rx按照下方式连接,MounRiver Studio运行程序,串口调试工具打开串口,发送和接收数据

            UART1 TX-->PA9 RX-->PA10
            UART2 TX-->PA2 RX-->PA3
            UART3 TX-->PB10 RX-->PB11
            UART4 TX-->PC10 RX-->PC11
            UART5 TX-->PC12 RX-->PD2
            UART6 TX-->PC0 RX-->PC1 
            UART7 TX-->PC2 RX-->PC3
            UART8 TX-->PC4 RX-->PC5

代码:串口4中断  其他串口也基本是这样 

//串口中断服务程序

__attribute__((interrupt("WCH-Interrupt-fast")))

void UART4_IRQHandler(void)

{

        u8 Res;

        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)

        {

                Res =USART_ReceiveData(UART4);//读取接收到的数据

                USART_SendData(UART4, Res);

        }

}

初始化代码:


void uart_init(void)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART6, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART7, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART8, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO , ENABLE);




    ///初始化串口1-串口8的io UART1~UART8
    /* UART1 TX-->PA9   RX-->PA10 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* UART2 TX-->PA2   RX-->PA3 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* UART3 TX-->PB10  RX-->PB11 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    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_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* UART4 TX-->PC10  RX-->PC11 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* UART5 TX-->PC12  RX-->PD2 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO_InitStructure);


    /* UART6 TX-->PC0  RX-->PC1  |  TX_2-->PE10   RX_2-->PE11 */
//    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//    	GPIO_Init(GPIOC, &GPIO_InitStructure);
//    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
//    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//    	GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    GPIO_PinRemapConfig(GPIO_FullRemap_USART6,ENABLE);

    /* UART7 TX-->PC2  RX-->PC3 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* UART8 TX-->PC4  RX-->PC5 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);


    //USART 初始化设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    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_Rx | USART_Mode_Tx;	//收发模式

    USART_InitStructure.USART_BaudRate = 115200;//串口波特率
    USART_Init(USART1, &USART_InitStructure); //初始化串口1

    USART_Init(USART2, &USART_InitStructure); //初始化串口2

    USART_Init(USART3, &USART_InitStructure); //初始化串口3

    USART_Init(UART4, &USART_InitStructure); //初始化串口4

    USART_Init(UART5, &USART_InitStructure); //初始化串口5

    USART_Init(UART6, &USART_InitStructure); //初始化串口6

    USART_Init(UART7, &USART_InitStructure); //初始化串口7

    USART_Init(UART8, &USART_InitStructure); //初始化串口8

    /*串口--1*/
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//信道抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//信道子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

    /*串口--2*/
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

    /*串口--3*/
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    /*串口--4*/
    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    /*串口--5*/
    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    /*串口--6*/
    NVIC_InitStructure.NVIC_IRQChannel = UART6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    /*串口--7*/
    NVIC_InitStructure.NVIC_IRQChannel = UART7_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    /*串口--8*/
    NVIC_InitStructure.NVIC_IRQChannel = UART8_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
    USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
    USART_ITConfig(UART6,USART_IT_RXNE,ENABLE);
    USART_ITConfig(UART7,USART_IT_RXNE,ENABLE);
    USART_ITConfig(UART8,USART_IT_RXNE,ENABLE);

    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断


    USART_Cmd(USART1, ENABLE);                    //使能串口
    USART_Cmd(USART2, ENABLE);                    //使能串口
    USART_Cmd(USART3, ENABLE);
    USART_Cmd(UART4, ENABLE);
    USART_Cmd(UART5, ENABLE);
    USART_Cmd(UART6, ENABLE);
    USART_Cmd(UART7, ENABLE);
    USART_Cmd(UART8, ENABLE);
}


您好,附件为CH32V307 串口1到8收发例程,可以参考一下

icon_rar.gifCH32V307 串口1-8中断收发.zip



感谢


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