新手上路 
 
	- 积分
 - 25
 
        - 金钱
 - 25 
 
       - 注册时间
 - 2020-12-23
 
      - 在线时间
 - 5 小时
 
 
 
 | 
 
5金钱 
这是我的初始化代码。其中通过UART4和串口迪文屏通信(485通信),在调试过程中发现单片机向迪文屏发送数据正常 但是接收不到迪文屏发送过来的数据 
串口的初始化: 
void USART2_Screen_Config(void ) 
{   
    GPIO_InitTypeDef GPIO_InitStruct; 
       USART_InitTypeDef USART_InitStruct; 
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOA,D时钟 
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟,并不需要 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//使能USART2时钟 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;                 //PD7端口配置 
     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;           
     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
     GPIO_Init(GPIOA, &GPIO_InitStruct); 
    GPIO_SetBits(GPIOA,GPIO_Pin_1);//进入发送模式 
     
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; 
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOC,&GPIO_InitStruct);     
     
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    GPIO_Init(GPIOC,&GPIO_InitStruct);         
     
    USART_InitStruct.USART_BaudRate    = 115200; 
    USART_InitStruct.USART_WordLength = USART_WordLength_8b; 
    USART_InitStruct.USART_StopBits = USART_StopBits_1; 
    USART_InitStruct.USART_Parity = USART_Parity_No; 
    USART_InitStruct.USART_Mode = USART_Mode_Tx |USART_Mode_Rx;  
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    USART_Init(UART4,&USART_InitStruct); 
    USART_Cmd(UART4,ENABLE); 
    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE); 
    USART_ITConfig(UART4, USART_IT_ERR, ENABLE); 
    // 如下语句解决第1个字节无法正确发送出去的问题     
    USART_ClearFlag(UART4, USART_FLAG_TC);     // 清标志 
} 
串口发送函数: 
void USART2_Send_Screen_Cmd(uint8_t *table,uint8_t counter) 
{ 
    u8 i = 0; 
    GPIO_SetBits(GPIOA,GPIO_Pin_1); //进入发送模式。 
    for(i = 0;i <= counter ;i++) 
    { 
        Uart2_send_buff[i] = table[i];     
    }     
 
    /***串口中断发送一定长度的数据***/ 
    Uart2_send_counter = counter+1;//一共多少个字节,好好计算下,这里要8+1.以后考虑一下。 
    Uart2_send_pointer = Uart2_send_buff; 
    USART_SendData(UART4, *Uart2_send_pointer++); 
    // 这里的话如果发的命令是 0x83类型的 那迪文屏就会返回需要的数据(通过中断) 
    // 这玩意通过中断发的? 
    USART_ITConfig(UART4, USART_IT_TXE, ENABLE);  
} 
串口中断处理函数: 
void UART4_IRQHandler(void) 
{ 
    // 这里的话因为串口2的收发挺频繁的 所以USART_GetFlagStatus(USART2, USART_FLAG_ORE)不能完全解决问题 
    // 要不然你调试会发现 卡死在内个ORE的判断里了 
    if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) != RESET) 
    { 
        LED1=0; 
        USART_ReceiveData(UART4); 
        USART_ClearFlag(UART4, USART_FLAG_ORE); 
    } 
    if (USART_GetFlagStatus(UART4, USART_FLAG_FE) != RESET)  
    { 
        USART_ReceiveData(UART4);  
        USART_ClearFlag(UART4, USART_FLAG_FE); 
    }     // 
    if(USART_GetFlagStatus(UART4, USART_FLAG_PE) != RESET)          
    {    
        USART_ReceiveData(UART4);   
        USART_ClearFlag(UART4, USART_FLAG_PE);                 
    } 
    if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET) 
    { 
        USART_ClearITPendingBit(UART4,USART_IT_RXNE); 
        Uart2_rev_buff[Uart2_rev_count++]= USART_ReceiveData(UART4); 
        if(USART_ReceiveData(UART4) == 0xff)//偶尔出现0xff情况 
        { 
            Uart2_rev_count = 0; 
        } 
         
        if((Uart2_rev_buff[0] == 0x5A)&&(Uart2_rev_buff[1] == 0xA5))//接收到屏幕的指令 
        { 
            if(Uart2_rev_count >= 9) 
            { 
                //USART1_Send_Cmd(Uart2_rev_buff,8); 
                Uart2_rev_count = 0; 
                Uart2_rev_screen_comflag = 1;//屏幕接收完成 
            } 
        } 
        // 收到的消息不对 直接就不看了 
        if(Uart2_rev_count >=9) 
        { 
            Uart2_rev_count = 0; 
        } 
        //GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)));         
    } 
    if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET) 
    {    
        Uart2_send_counter--;  
        if(Uart2_send_counter>0)  
        { 
              USART_SendData(UART4, *Uart2_send_pointer++); 
        } 
        else 
        { 
            unsigned char i = 0 ; 
            USART_ITConfig(UART4, USART_IT_TXE, DISABLE); 
                    GPIO_ResetBits(GPIOA,GPIO_Pin_1); //进入接收模式 
            for(i = 0;i <10; i++)  
            {  
                Uart2_send_buff[i] = 0;  
            }  
        } 
      } 
} 
 
 
 
 |   
 
 
 
 
 
 |