OpenEdv-开源电子网

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

STM32F103ZET6串口2可以串口3收到的是乱码

[复制链接]

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
发表于 2017-5-8 10:33:05 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 zzq11986 于 2017-5-8 10:36 编辑

各位路过大侠请指点:
下面为串口代码:串口2正常接收
void USART2_Init(void)
{
           GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
        
        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //推挽输出-TX
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX
    GPIO_Init(GPIOA, &GPIO_InitStructure);

          /*串口2参数初始化*/

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
                USART_Init(USART2,&USART_InitStructure);
        
          //USART_DeInit(USART2);//复位串口2
        
        
          USART_Cmd(USART2,ENABLE);/*使能串口2*/
        
          USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启串口2接收中断,用到时开启
        
          NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
          NVIC_Init(&NVIC_InitStructure);//中断初始化
}

void USART2_IRQHandler(void) //中断请求处理函数
{
  u8 res;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
           res= USART_ReceiveData(USART2); //接收串口2数据
     USART_SendData(USART2,res);     //将res发送给USART2
        }
}

int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断优先级设置为组2
USART2_Init();
while(1);
}


下面为串口3代码、电路板连接图片和串口软件图片,串口发出来的数据,电脑接收为乱码
void USART3_Init(void)
{
           GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
        
        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //推挽输出-TX
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX
    GPIO_Init(GPIOB, &GPIO_InitStructure);

          /*串口3参数初始化*/

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
                USART_Init(USART3,&USART_InitStructure);
        
          //USART_DeInit(USART2);//复位串口3
        
        
          USART_Cmd(USART3,ENABLE);/*使能串口3*/
        
          USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启串口3接收中断,用到时开启
        
          NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
          NVIC_Init(&NVIC_InitStructure);//中断初始化
}

void USART3_IRQHandler(void) //中断请求处理函数
{
  u8 res;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
                {
                         res= USART_ReceiveData(USART3); //接收串口3数据
                         USART_SendData(USART3,res);     //将res发送给USART3
                }
        
}

int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断优先级设置为组2
USART3_Init();
while(1);

4.png 5.png

电脑收到的乱码

电脑收到的乱码


请各位高手帮帮忙,小弟在这先谢谢了!!!

串口3开关位置

串口3开关位置

短路位置

短路位置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-8 20:55:07 | 显示全部楼层
是不是你代码波特率设置有问题啊?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-8 20:55:27 | 显示全部楼层
短接COM3_TX和COM3_RX,做一下自发自收实验,看看是否OK?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-8 20:55:50 | 显示全部楼层
看了你的图片,发现你的开关打错了!!!要打到RS232位置
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-8-27
在线时间
21 小时
发表于 2017-5-8 22:39:14 | 显示全部楼层
波特率一开始9600,改为跟程序一样的115200,就没问题了
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-9 08:30:06 | 显示全部楼层
正点原子 发表于 2017-5-8 20:55
短接COM3_TX和COM3_RX,做一下自发自收实验,看看是否OK?

我把P11、p10接到COM2_TX和COM2_RX,通过COM2(DB9接口)连接到电脑上是可以正常接收的
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-9 08:31:59 | 显示全部楼层
正点原子 发表于 2017-5-8 20:55
是不是你代码波特率设置有问题啊?

115200及以下我全部试验了,都不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-10 01:26:18 | 显示全部楼层
zzq11986 发表于 2017-5-9 08:30
我把P11、p10接到COM2_TX和COM2_RX,通过COM2(DB9接口)连接到电脑上是可以正常接收的

那基本可以肯定是你代码bug了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-10 08:08:32 | 显示全部楼层
正点原子 发表于 2017-5-10 01:26
那基本可以肯定是你代码bug了

你好,我感觉应该不是代码的问题啊,如果是代码的问题,那我换个DB9接口应该也不行啊,请原子哥祥解
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-12 01:12:52 | 显示全部楼层
zzq11986 发表于 2017-5-10 08:08
你好,我感觉应该不是代码的问题啊,如果是代码的问题,那我换个DB9接口应该也不行啊,请原子哥祥解

开发板上的2个RS232,一个可以,一个不行?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-12 08:03:22 | 显示全部楼层
16进制显示没选择
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-12 10:06:07 | 显示全部楼层
正点原子 发表于 2017-5-12 01:12
开发板上的2个RS232,一个可以,一个不行?

是的,用COM2的DB9连接到PB10 PB11就可以,用COM3的DB9就不可以
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-12 10:07:15 | 显示全部楼层
沧海 发表于 2017-5-12 08:03
16进制显示没选择

即便我选择了16进制和我发送的不一样
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-12 10:07:25 | 显示全部楼层
沧海 发表于 2017-5-12 08:03
16进制显示没选择

即便我选择了16进制和我发送的不一样
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
 楼主| 发表于 2017-5-12 10:07:58 | 显示全部楼层
沧海 发表于 2017-5-12 08:03
16进制显示没选择

即便是选择了,显示的和我发的不一样
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-12 10:44:20 | 显示全部楼层
zzq11986 发表于 2017-5-12 10:07
即便我选择了16进制和我发送的不一样

16进制发送也选择啊。
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-5-12 10:50:41 | 显示全部楼层
检查波特率,你可以用逻辑分析仪分析一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 10:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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