这代码哪里错了?求两个单片机之间串口通信的代码,给出详细步骤也行

2019-07-20 00:33发布

本人小白,写了两个单片机之间相互通信的代码,运行无错误,但连接起来就是不对。
发送板代码如下
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"

u8 asd=0;
int main(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        delay_init(168);  //初始化延时函数
        LED_Init();                                //初始化LED端口
        KEY_Init();       //初始化与按键连接的硬件接口
        LED0=0;                                          //先点亮红灯
       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口(外设)的时钟使能
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//io口使能
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//io口的复用
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//io口的复用

       
        //GPIO初始化,模式选择复用模式
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //GPIO初始化结束
       
       
        //串口初始化,串口的波特率,停止位,奇偶校验位,数据位(字长)都要和串口调试助手的参数一致
        USART_InitStructure.USART_BaudRate=115200;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx; //全双工模式
        USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验一般不需要
        USART_InitStructure.USART_StopBits=USART_StopBits_1;//默认停止位为一个
        USART_InitStructure.USART_WordLength=USART_WordLength_8b; //因为奇偶校验没有,所以8位
        USART_Init(USART1,&USART_InitStructure);
        //串口初始化结束
        USART_Cmd(USART1,ENABLE);
       
             while(1)
                                {
                                       
                                        asd=KEY_Scan(1);                //得到键值
                                        USART_SendData(USART1,asd);//向串口寄存器写入一个数据
                                       
                                        delay_ms(30);
                          }
}



接收板代码如下
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"


//ALIENTEK 探索者STM32F407开发板 实验3
//按键输入实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司   
//作者:正点原子 @alientek


  u8 key;    //保存键值

int main(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        delay_init(168);  //初始化延时函数
        LED_Init();                                //初始化LED端口
        BEEP_Init();      //初始化蜂鸣器端口
        KEY_Init();       //初始化与按键连接的硬件接口
       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口(外设)的时钟使能
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//io口使能
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//io口的复用
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//io口的复用

       
        //GPIO初始化,模式选择复用模式
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //GPIO初始化结束
       
       
        //串口初始化,串口的波特率,停止位,奇偶校验位,数据位(字长)都要和串口调试助手的参数一致
        USART_InitStructure.USART_BaudRate=115200;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx; //全双工模式
        USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验一般不需要
        USART_InitStructure.USART_StopBits=USART_StopBits_1;//默认停止位为一个
        USART_InitStructure.USART_WordLength=USART_WordLength_8b; //因为奇偶校验没有,所以8位
        USART_Init(USART1,&USART_InitStructure);
        //串口初始化结束
       
        USART_Cmd(USART1,ENABLE);
       
        LED1=0;
       
        while(1);
       
}

void USART1_IRQHandler(void)                        //串口1中断服务程序
{

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
          key=USART_ReceiveData(USART1);//STM32读取串口1中的数据
                        switch(key)
                        {                                 
                                case 1:        //控制蜂鸣器
                                        BEEP=!BEEP;
                                        break;
                                case 2:        //控制LED0翻转
                                        LED0=!LED0;
                                        break;
                                case 3:        //控制LED1翻转         
                                        LED1=!LED1;
                                        break;
                                case 4:        //同时控制LED0,LED1翻转
                                        LED0=!LED0;
                                        LED1=!LED1;
                                        break;
                        }
  }
        USART_ClearFlag(USART1,USART_FLAG_RXNE);
}


不知道哪里错啦,希望有大佬指出。或者希望各方大佬能告诉我这种两个单片机之间串口通信的详细步骤,救救孩子吧!!!!!!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。