串口发送和接收消息

单片机端:

stm32F4开发板搭载一个USB串口,2个RS232串口,博客内容介绍USB串口和电脑通信

步骤:

1、串口和IO口使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

2、设置引脚复用功能

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

3、GPIO初始化

    GPIO_InitStru.GPIO_Mode=GPIO_Mode_AF;
    GPIO_InitStru.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStru.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
    GPIO_InitStru.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_InitStru.GPIO_Speed=GPIO_High_Speed;
    GPIO_Init(GPIOA,&GPIO_InitStru);

4、串口初始化(设置波特率,字长,停止位,奇偶校验位)

    USART_InitTypeStru.USART_BaudRate=bound;
    USART_InitTypeStru.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitTypeStru.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_InitTypeStru.USART_Parity=USART_Parity_No;
    USART_InitTypeStru.USART_StopBits=USART_StopBits_1;
    USART_InitTypeStru.USART_WordLength=USART_WordLength_8b;
    USART_Init(USART1,&USART_InitTypeStru);

5、使能串口(若使用到中断,则需开启中断并初始化NVIC)

    开启中断并初始化NVIC

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断  串口的接收中断
    NVIC_InitTypeStru.NVIC_IRQChannel=USART1_IRQn;
    NVIC_InitTypeStru.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitTypeStru.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
    NVIC_InitTypeStru.NVIC_IRQChannelSubPriority=2;//响应优先级
    NVIC_Init(&NVIC_InitTypeStru);

    //使能串口
    USART_Cmd(USART1,ENABLE);

6、串口1的中断函数

void USART1_IRQHandler();//在文件stm32 startup XXx.s中,然后再重写

通过USART_RX_STA作为状态寄存器判断是否接收到数据。每次接收一个字节的数据,判断数据是否以回车换行结束(0X0D/0X0A),若是0X0D 0X0A结束则传送完成,若未结束,则将数据保存到USART_RX_BUFFER(200)中。

实现功能: 上位机控制LED灯亮与灭,上位机发送命令0,LED1灭,发送命令1,LED1亮

int main()
{
    u8 t,i,len;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组
    delay_init(168);
    uart_init(115200);//初始化串口波特率为115200
    LED_Init();
    LED0=0;//先点亮红灯
    while(1)
    {
        if(USART_RX_STA&0x8000)
        {
            len=USART_RX_STA&0x3FFF;//得到此次接受数据的长度
            printf("\r\n发送的数据为:\r\n");
            for(t=0;t             {
                USART1->DR=USART_RX_BUF[t];
                while((USART1->SR&0X40)==0);//等待发送结束
            }
            printf("\r\n");
            printf("接收数据的值1为:%d  ",USART_RX_BUF[0]);
            printf("接收数据的值2为:%d  ",USART_RX_BUF[1]);
            printf("接收数据的值3为:%d  ",USART_RX_BUF[2]);
            if(USART_RX_BUF[0]=='0')
            {
                LED1=1;
            }else if(USART_RX_BUF[0]=='1')
            {
                LED1=0;
            }
            for(i=0;i             {
                USART_RX_BUF[i]=0;
            }
            USART_RX_STA=0;
        }
        //else
        //{
        //    delay_ms(1000);
        //    printf("\r\n上位机还未发送数据到单片机\r\n");
        //}    
    }
}

 

 

接下来实现:单片机定时发送数据到上位机功能

 

你可能感兴趣的:(串口发送和接收消息)