/********************************************************************* 
* 函 数 名: uart_init 
* 函数说明: 初始化串口通讯引脚 ,串口配置初始化,中断优先级配置 
* 输 入:           bound 串口通讯波特率 
* 返 回:    无   
***********************************************************************/ 
void uart_init(u32 bound) 
{ 
     //GPIO端口设置 
     GPIO_InitTypeDef GPIO_InitStructure; 
         USART_InitTypeDef USART_InitStructure; 
         NVIC_InitTypeDef NVIC_InitStructure; 
         
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //使能 USART3 时钟 
         USART_DeInit(USART3);  //复位串口3 
 
         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12;          //PB12 max485 R/W Enable 
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //复用推挽输出 
         GPIO_Init(GPIOB, &GPIO_InitStructure);  
 
        //USART3_TX   PB10 
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出 
         GPIO_Init(GPIOB, &GPIO_InitStructure);  
 
         //USART3_RX          PB11 
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 
         GPIO_Init(GPIOB, &GPIO_InitStructure); 
 
     //USART 初始化设置 
         USART_InitStructure.USART_BaudRate = bound;//一般设置为4800; 
         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_Tx;        //发模式 
     USART_Init(USART3, &USART_InitStructure); //初始化串口 
          
     //Usart1 NVIC 配置 
     NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; 
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2 
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级0 
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能 
         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器 
 
     USART_Cmd(USART3, ENABLE);  //使能串口  
} 
 
 
/********************************************************************* 
* 函 数 名: USARTSendData 
* 函数说明: 串口数据发送函数,在发送完数据后,再发送CRC校验码的高低字节 
* 输 入:           USARTx 串口号   prSendData 发送数据的数组名   leng 长度 
* 返 回:    无   
***********************************************************************/ 
void USARTSendData(USART_TypeDef* USARTx,u8 prSendData[],u8 leng) 
{ 
        u8 tempcrcH,tempcrcL; //存储CRC校验码的高低字节 
        u8 i; 
        tempcrcH= (u8)((usMBCRC16(prSendData,leng)&0xff00)>>8) ; 
        tempcrcL= (u8)(usMBCRC16(prSendData, leng)&0x00ff) ; 
        for(i=0;i<leng;i++) 
        { 
          USART_SendData(USARTx, prSendData); 
           while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束            
       } 
        USART_SendData(USARTx,tempcrcL);//计算发送数据的校验码低字节 
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束         
        USART_SendData(USARTx,tempcrcH);//计算发送数据的校验码高字节 
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束 
} 
 
 
main() 
{ 
      while(1) 
      { 
                GPIO_ResetBits(GPIOB,GPIO_Pin_12); //485设为发送 
                delay_ms(5); 
                USART_Cmd(USART3, ENABLE); 
                USARTSendData( USART3,SendDataBuf2,4);   //SendDataBuf2[4]={0x7c,0x00,0x00,0x00} 
                USART_Cmd(USART3, DISABLE); 
                USART3->DR=0; 
                 GPIO_SetBits(GPIOB,GPIO_Pin_12); //485设为接收 
                delay_ms(5); 
      } 
}
 |