OpenEdv-开源电子网

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

求助,stm32串口通讯发送全是0

[复制链接]

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
发表于 2022-4-19 11:31:52 | 显示全部楼层 |阅读模式
6金钱
如题,我使用stm32F103与tb买的电能采集模块IM1253B进行串口通信,发现一直出毛病。无论怎么调试,都接受不到任何返回信息,尝试用串口调试助手监测串口发送,发现发出的全是0,但我用屏幕显示发送缓存区的数据是正常的。求教,附上发送部分的以及串口初始化的代码。

//与IM233b串口的通信  发送数据缓存区Tx_Buffer[8]  接受数据缓存区 RX_Buffer[40]
        while(1)
        {
                if(KEY_Scan(0)==2)   r
                ead_enable =1;                                                //按下KEY1进行检测
                if(read_enable==1)                        //抄读指令传送  向模块传输指令
                {
                        int i=0;
                        read();
                        while(i<8)                                                        //数据发送完毕跳出循环
                        {
                                if(USART1->SR &0x80)               //若TXE为1,则向DR中传输数据,并进行发送
                                {
                                        USART1->DR =Tx_Buffer;
                                        OLED_ShowNum(0,0,Tx_Buffer,3,24);
                                        OLED_Refresh();
                                        i++;
                                        LED2=~LED2;
                                        while((USART1->SR&0x40)==0);        //若TC不等于1则继续等待
                                }
                                delay_ms(50);
                        }
                        read_enable=0;                        //抄读指令传送完毕,置0
                }


//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
    mantissa<<=4;
        mantissa+=fraction;
        RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
        RCC->APB2ENR|=1<<14;  //使能串口时钟
        GPIOA->CRH&=0XFFFFF00F;//IO状态设置
        GPIOA->CRH|=0X000008B0;//IO状态设置          
        RCC->APB2RSTR|=1<<14;   //复位串口1
        RCC->APB2RSTR&=~(1<<14);//停止复位                     
        //波特率设置
        USART1->BRR=mantissa; // 波特率设置         
        USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX                  //如果使能了接收
        //使能接收中断
//        USART1->CR1|=1<<8;    //PE中断使能
        USART1->CR1|=1<<5;    //接收缓冲区非空中断使能                   
        MY_NVIC_Init(1,1,USART1_IRQn,1);//组1,最高优先级
#endif
}


最佳答案

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

已经解决啦,我重写了发送程序,谢谢大家了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 11:31:53 | 显示全部楼层
聚东风 发表于 2022-4-20 08:19
USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX                  //如果使能了接收
   ...

已经解决啦,我重写了发送程序,谢谢大家了
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-4-19 11:55:55 | 显示全部楼层
先用串口调试助手测试好然后再接上模块
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 12:03:43 | 显示全部楼层
huanan 发表于 2022-4-19 11:55
先用串口调试助手测试好然后再接上模块

目前就是不知道为什么发送的全是0000,Tx_Buffer[]l里面的值在显示器上显示都是对的
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2017-3-7
在线时间
1687 小时
发表于 2022-4-19 12:59:21 | 显示全部楼层
长夜渔火 发表于 2022-4-19 12:03
目前就是不知道为什么发送的全是0000,Tx_Buffer[]l里面的值在显示器上显示都是对的

可能是模块拉低的,所以人家建议先确认本身发送有没有问题,再加负载
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-4-19 13:18:00 | 显示全部楼层
有示波器就上示波器,没示波器建议买个原子的
1.用电脑串口软件监视串口,直接在仿真界面串口的寄存器里直接手工写入数据,确定电脑能否接收到.
能接收到,则硬件 没问题,重点关注软件.
不能接收,就找硬件连接的问题,或者配置的问题.有示波器则示波器看下是不是有数据出来,数据读取下对不对,有解码就更容易了.
2.关注下,串口的TX是不是跟另一个RX相连的.可以尝试交换下
3.你串口使能了吗?怎么没看到CR1的BIT0置一啊
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 13:21:52 | 显示全部楼层
a5820736 发表于 2022-4-19 12:59
可能是模块拉低的,所以人家建议先确认本身发送有没有问题,再加负载

我用XCOM测试的时候没有加负,串口通讯打印出来都是0
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-4-19 14:13:32 | 显示全部楼层
让单片机发送0XAA,用示波器看TXD引脚波形就行了。
专治疑难杂症
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 14:24:04 | 显示全部楼层
聚东风 发表于 2022-4-19 13:18
有示波器就上示波器,没示波器建议买个原子的
1.用电脑串口软件监视串口,直接在仿真界面串口的寄存器里直接 ...

能接受的到,串口使能了,CR1&0x200C置位了UIE,而且我刚才用DAP在线仿真调试了一下,一步一步的调试,发现DR寄存器一直写不进去值,在窗口里看始终为0,我手动输入其他数给DR,串口打印出来还是0,这是为什么呢?
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 14:24:32 | 显示全部楼层
LcwSwust 发表于 2022-4-19 14:13
让单片机发送0XAA,用示波器看TXD引脚波形就行了。

。。。我就是手里头没有示波器,所以很难受
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-4-19 14:44:42 | 显示全部楼层
长夜渔火 发表于 2022-4-19 14:24
。。。我就是手里头没有示波器,所以很难受

要不先用原子的串口例子程序试试。
专治疑难杂症
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 15:55:47 | 显示全部楼层
LcwSwust 发表于 2022-4-19 14:44
要不先用原子的串口例子程序试试。

试了一下,发现例程也不对了,打印出来的是乱码
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2017-3-7
在线时间
1687 小时
发表于 2022-4-19 16:07:28 | 显示全部楼层
长夜渔火 发表于 2022-4-19 15:55
试了一下,发现例程也不对了,打印出来的是乱码

如果串口工具这边设置没有问题的话,大概率是硬件问题了,还是得有示波器,逻辑分析仪来分析
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 16:07:41 | 显示全部楼层
我尝试拿原子的串口通信那一块的例程运行了一下,发现打印出来都是乱码了。。。。
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-4-19 16:17:11 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-4-19 16:22 编辑
长夜渔火 发表于 2022-4-19 15:55
试了一下,发现例程也不对了,打印出来的是乱码

DS100你值得拥有。
不是办法的办法:再确认一下波特率,比如9600波特率发一字节约耗时1ms,按下面的流程:
while(1)
{
  for(i=0;i<1000;i++)
    发送一字节;
LED翻转;
}
然后,一边盯着秒表,一边看着LED,看LED是不是一秒翻转一次。

还有别的办法:比如用软件模拟串口,
将TXD脚配置为普通输出脚,输出低电平104us,然后置为高电平1s,看串口助手(9600波特率)收到数据是不是0xFF,
然后将低电平时间改为208us再看看串口助手收到是不是0xFE。
专治疑难杂症
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 16:19:39 | 显示全部楼层
a5820736 发表于 2022-4-19 16:07
如果串口工具这边设置没有问题的话,大概率是硬件问题了,还是得有示波器,逻辑分析仪来分析

我用库函数和寄存器两种例程都测试了一下,发现打印出来的都不对,本来按照教程上打印的是中文,但实际上周期性打印的是数字。
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-4-19 16:36:41 | 显示全部楼层
长夜渔火 发表于 2022-4-19 14:24
能接受的到,串口使能了,CR1&0x200C置位了UIE,而且我刚才用DAP在线仿真调试了一下,一步一步的调试,发 ...

UIE是啥?UIE是串口中断,不是串口使能
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 16:38:24 | 显示全部楼层
LcwSwust 发表于 2022-4-19 16:17
DS100你值得拥有。
不是办法的办法:再确认一下波特率,比如9600波特率发一字节约耗时1ms,按下面的流程 ...

不好意思,刚才弄错了,我设置成了16进制显示,所以例程显示成了数字,实际上是正确的。
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-4-19 16:41:26 | 显示全部楼层
长夜渔火 发表于 2022-4-19 16:38
不好意思,刚才弄错了,我设置成了16进制显示,所以例程显示成了数字,实际上是正确的。

哦,继续加油。
专治疑难杂症
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2017-3-7
在线时间
1687 小时
发表于 2022-4-19 16:43:07 | 显示全部楼层
长夜渔火 发表于 2022-4-19 16:38
不好意思,刚才弄错了,我设置成了16进制显示,所以例程显示成了数字,实际上是正确的。

那说明硬件没问题,只有可能是你程序问题了
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 16:56:42 | 显示全部楼层
聚东风 发表于 2022-4-19 16:36
UIE是啥?UIE是串口中断,不是串口使能

写错了,是UE,使能串口,初始化我是按照原子的例程改的,应该没问题。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-19 21:04:23 | 显示全部楼层
最新战报,我修改了一下代码,使用串口调试助手向单片机传输数据,但无论传的数据是什么,DR寄存器显示的都是0xff或者0xfd。总感觉这个DR有点问题,但代码我是根据例程改的,初始化应该是没有问题,下午测试例程硬件也无问题。
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-4-20 08:19:57 | 显示全部楼层
长夜渔火 发表于 2022-4-19 16:56
写错了,是UE,使能串口,初始化我是按照原子的例程改的,应该没问题。

USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX                  //如果使能了接收
        //使能接收中断
//        USART1->CR1|=1<<8;    //PE中断使能
        USART1->CR1|=1<<5;    //接收缓冲区非空中断使能   



哪个使能了UE?     
USART1->CR1|=0X200C;  //1位停止,无校验位.
C是12啊,不涉及BIT0的设置,你还哪里设置了?

因为系统启动期间是很容易出现全是0的数据,或者全是1,你没示波器是很麻烦的.不确定线上是不是有数据
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-28 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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