OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3353|回复: 7

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

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-16
在线时间
3 小时
发表于 2019-7-17 13:55:52 | 显示全部楼层 |阅读模式
1金钱
本人小白,写了两个单片机之间相互通信的代码,运行无错误,但连接起来就是不对。
发送板代码如下
#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);
}


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

最佳答案

查看完整内容[请看2#楼]

【战舰V3/精英板子实现两板子间的串口通信测试程序(串口2间的通信)】 http://www.openedv.com/forum.php?mod=viewthread&tid=285874 可以参考下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10567
金钱
10567
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-7-17 13:55:53 | 显示全部楼层
【战舰V3/精英板子实现两板子间的串口通信测试程序(串口2间的通信)】
http://www.openedv.com/forum.php?mod=viewthread&tid=285874
可以参考下
回复

使用道具 举报

26

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2019-6-11
在线时间
52 小时
发表于 2019-7-17 14:20:32 | 显示全部楼层
优先级分组,还有中断的配置没有
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14407
金钱
14407
注册时间
2018-8-3
在线时间
1156 小时
发表于 2019-7-17 15:57:34 | 显示全部楼层
论坛 有很多的 可以参考下:
http://www.openedv.com/forum.php ... d=284685&extra=
啊哈~加油!!
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-16
在线时间
3 小时
 楼主| 发表于 2019-7-17 16:42:55 | 显示全部楼层
lvye 发表于 2019-7-17 14:20
优先级分组,还有中断的配置没有

初始化之后也不行,但还是很谢谢你,我离成功又进了一步
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-16
在线时间
3 小时
 楼主| 发表于 2019-7-17 16:43:17 | 显示全部楼层
翼行园子 发表于 2019-7-17 15:57
论坛 有很多的 可以参考下:
http://www.openedv.com/forum.php?mod=viewthread&tid=284685&extra=

谢谢
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-16
在线时间
3 小时
 楼主| 发表于 2019-7-17 16:43:38 | 显示全部楼层
peng1554 发表于 2019-7-17 15:11
【战舰V3/精英板子实现两板子间的串口通信测试程序(串口2间的通信)】
http://www.openedv.com/forum.php ...

好的,谢谢啦
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2019-7-17
在线时间
48 小时
发表于 2019-7-18 09:22:32 | 显示全部楼层
你好,通过代码,我猜想是这样的,一个 MCU- A 连接按键,识别按键 ,并且将按键通过串口发给 MCU-B 。

挨个排查到底是谁的问题

所以,严谨逻辑来说:
1、首先判断接线有无错,MCU-A 的 TX 连接 MCU-B的 RX ,交错连接
2、MCU-B 是否能够正常接收数据,可通过串口助手加 USB-TTL 硬件工具,连接B串口,进入中断看
3、同理,测试MCU-A 是否真的发送了数据出来,通过上述的助手和硬件工具

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 10:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表