OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 195|回复: 20

串口小问题,请大神不吝赐教

[复制链接]

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
发表于 2018-10-12 11:31:36 | 显示全部楼层 |阅读模式
5金钱
发送了一串十六进制,能够发送到串口助手上显示,却无法接收到我发送的内容,是什么原因?
主函数:
                    while(1)
        {
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次数据的长度
                        printf("\r\n您发送的消息为:\r\n");
                        for(t=0;t<len;t++)
                        {
                                USART1->DR=USART_RX_BUF[t];
                                while((USART1->SR&0X40)==0);//等待数据发送完
                        }
                        printf("\r\n\r\n");//换行
                        USART_RX_STA=0;
                }else
                {
                        times++;
                        if(times%500==0)
                        {
                                printf("\r\n\r\n");
                                CO2START();
                                delay_ms(200);
                               
                        }  
                        if(times%30==0)LED0=!LED0;
                        delay_ms(10);   
                }
        }         
CO2START()函数内容:
        void CO2START(void)
       {
              u8 MH_com[11]={0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79,0x0D,0x0A};
              int i;
              for(i=0; i<11; i++)
             {
                USART1->DR = MH_com[i];
                while((USART1->SR&0X40)==0);
                delay_ms(100);
             }
       }

串口一在发送数据,却没有接收数据,怎么才能是它自动接收我发送的数据?实现如下效果,请大神赐教,非常感谢!!!
例:
        发送的内容为:FF 01 86 00 00 00 00 00  79
        在串口助手上显示
        您发送的消息为:FF 01 86 00 00 00 00 00 79

最佳答案

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

看不懂楼主说的: “发送了一串十六进制,能够发送到串口助手上显示,却无法接收到我发送的内容” 不是矛盾吗? 但是对于楼主所说的: 这个只要电脑端串口设置正确并打开,硬件链路没有问题,单片机串口端只要发送数据,串口助手这里就会接收到。 我实在是看得比较糊涂,猜测楼主怕是在串口助手端设置HEX显示和ASCII显示的时候,要么就只能显示十六进制数,字符也变成了十六进制数来显示(HEX模式),要么就是能够显示 ...
回复

使用道具 举报

  离线 

2

主题

747

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2204
金钱
2204
注册时间
2017-10-24
在线时间
123 小时
发表于 2018-10-12 11:31:37 | 显示全部楼层
看不懂楼主说的:
“发送了一串十六进制,能够发送到串口助手上显示,却无法接收到我发送的内容”
不是矛盾吗?

但是对于楼主所说的:
串口一在发送数据,却没有接收数据,怎么才能是它自动接收我发送的数据?实现如下效果,请大神赐教,非常感谢!!!
例:
        发送的内容为:FF 01 86 00 00 00 00 00  79
        在串口助手上显示
        您发送的消息为:FF 01 86 00 00 00 00 00 79


这个只要电脑端串口设置正确并打开,硬件链路没有问题,单片机串口端只要发送数据,串口助手这里就会接收到。
我实在是看得比较糊涂,猜测楼主怕是在串口助手端设置HEX显示和ASCII显示的时候,要么就只能显示十六进制数,字符也变成了十六进制数来显示(HEX模式),要么就是能够显示中文字符,但是十六进制数却无法显示出来(ASCII模式)(因为这些十六进制数对应的ASCII码估计都是不可显示的控制字符)。

要解决这个问题,请楼主将串口助手端设置为ASCII显示模式,然后正常发送字符串,但是十六进制数不要直接发送到串口,而是转换成为字符后再向串口发。例如可以使用printf重定向到串口,printf("%02x",var),其中var是一个u8型的数据,%x表示将这个数据按照十六进制输出,02表示输出2位,不足的时候前面补0.也可以使用sprintf(buf,"%02x",var),将这个十六进制数转化成为对应的字符串先存放到数组buf中,然后再送到串口显示。这个时候就可以达到楼主的“字符串和十六进制数同时显示”的目的了。
十六进制带我飞。
回复

使用道具 举报

  离线 

19

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2017-4-1
在线时间
135 小时
发表于 2018-10-12 11:47:34 | 显示全部楼层
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 11:54:08 | 显示全部楼层
陈皮皮 发表于 2018-10-12 11:47
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了

调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的
void USART1_IRQHandler(void)
{
        u8 res;       
        if(USART1->SR&(1<<5))//接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重传
                                else USART_RX_STA|=0x8000;        //接收完成
                        }else //还没有收到0x0d

                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }                 
                        }
                }                                                                                                
        }
}
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 11:54:33 | 显示全部楼层
陈皮皮 发表于 2018-10-12 11:47
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了

调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的
void USART1_IRQHandler(void)
{
        u8 res;       
        if(USART1->SR&(1<<5))//接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重传
                                else USART_RX_STA|=0x8000;        //接收完成
                        }else //还没有收到0x0d

                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }                 
                        }
                }                                                                                                
        }
}
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 11:55:14 | 显示全部楼层
陈皮皮 发表于 2018-10-12 11:47
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了

调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的
void USART1_IRQHandler(void)
{
        u8 res;       
        if(USART1->SR&(1<<5))//接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重传
                                else USART_RX_STA|=0x8000;        //接收完成
                        }else //还没有收到0x0d

                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }                 
                        }
                }                                                                                                
        }
}
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 11:55:54 | 显示全部楼层
陈皮皮 发表于 2018-10-12 11:47
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了

调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的
void USART1_IRQHandler(void)
{
        u8 res;       
        if(USART1->SR&(1<<5))//接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重传
                                else USART_RX_STA|=0x8000;        //接收完成
                        }else //还没有收到0x0d

                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }                 
                        }
                }                                                                                                
        }
}
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 11:56:50 | 显示全部楼层
本帖最后由 scx2006114 于 2018-10-12 12:00 编辑
陈皮皮 发表于 2018-10-12 11:47
把你的中断服务函数贴出来,或者你自己仿真调试看看就知道有没有收到了

调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的,添加到上面了,回复发多了,还请大家多多见谅!!!
回复

使用道具 举报

  离线 

19

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2017-4-1
在线时间
135 小时
发表于 2018-10-12 12:43:54 | 显示全部楼层
scx2006114 发表于 2018-10-12 11:56
调试发现没有接收到数据,中断服务函数是原子哥那串口实验例程中的,添加到上面了,回复发多了,还请大家 ...

没有办法一句一句去看代码,只能给你建议,在中断服务函数设置断点,有没有进中断!仿真查看缓存数组USART_RX_BUF的缓存值,如果没有就是没接收到数据,有就是你解析问题!
回复

使用道具 举报

  离线 

1

主题

174

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
353
金钱
353
注册时间
2018-8-28
在线时间
56 小时
发表于 2018-10-12 13:10:35 | 显示全部楼层
你把别的屏蔽了。就留下个接收函数。串口中断可以照着原子哥的例程来。或者你先测试你的硬件有没有问题。直接用原子哥的例程试试。保证你硬件没问题
回复

使用道具 举报

  离线 

12

主题

308

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1989
金钱
1989
注册时间
2016-3-6
在线时间
313 小时
发表于 2018-10-12 13:22:52 | 显示全部楼层
主函数:串口发送数据不在else里面吧,应该在if下发的数据
路漫漫其修远兮,吾将上下而求索。
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 14:17:13 | 显示全部楼层
陈皮皮 发表于 2018-10-12 12:43
没有办法一句一句去看代码,只能给你建议,在中断服务函数设置断点,有没有进中断!仿真查看缓存数组USAR ...

嗯嗯,谢谢啦
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 14:18:32 | 显示全部楼层
douxiaolingyun 发表于 2018-10-12 13:10
你把别的屏蔽了。就留下个接收函数。串口中断可以照着原子哥的例程来。或者你先测试你的硬件有没有问题。直 ...

使用串口助手发送数据没问题,硬件也没有问题,通过程序发送数据就有问题了
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 14:21:25 | 显示全部楼层
18811707971 发表于 2018-10-12 13:22
主函数:串口发送数据不在else里面吧,应该在if下发的数据

if下面是接收到数据之后的执行程序,else是发送数据,如果没有收到数据,if下的程序不会执行。
回复

使用道具 举报

  离线 

12

主题

308

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1989
金钱
1989
注册时间
2016-3-6
在线时间
313 小时
发表于 2018-10-12 14:28:55 | 显示全部楼层
scx2006114 发表于 2018-10-12 14:21
if下面是接收到数据之后的执行程序,else是发送数据,如果没有收到数据,if下的程序不会执行。

哦哦,记错了
路漫漫其修远兮,吾将上下而求索。
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 14:38:22 | 显示全部楼层

嗯嗯,没事
回复

使用道具 举报

  离线 

15

主题

153

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2016-9-3
在线时间
101 小时
发表于 2018-10-12 17:14:53 | 显示全部楼层
你的问题我都没看明白,你是说单片机接收不到串口发下来的数据还是怎么回事啊?
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 17:16:09 | 显示全部楼层
找到问题所在,没有触发串口中断,我数据已经传到DR寄存器里面了,却没有触发中断是什么问题?SR的第7位=1,到达触发中断的条件,为啥没有进入中断,中断配置均是按照原子哥的程序写的,没有变动!
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 2018-10-12 17:54:29 | 显示全部楼层
午夜狼嚎 发表于 2018-10-12 17:14
你的问题我都没看明白,你是说单片机接收不到串口发下来的数据还是怎么回事啊?

单片机向串口助手发送数据,串口助手可以显示,但无法把发送的数据接收到在再一次显示在串口助手上,而通过串口助手软件发送信息,单片机能接收到。简单点说,单片机发送的信息单片机自己接收不到,只能发送,而串口助手发送的信息,单片机能接收到。。。
回复

使用道具 举报

  离线 

15

主题

153

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2016-9-3
在线时间
101 小时
发表于 7 天前 | 显示全部楼层
你要单片机自己能接受自己发送的信息,那你需要把单片机的TX和RX引脚接在一起啊
回复

使用道具 举报

  离线 

15

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-3-29
在线时间
84 小时
 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 scx2006114 于 2018-10-13 20:10 编辑
DreamWaterPro 发表于 2018-10-13 10:06
看不懂楼主说的:
“发送了一串十六进制,能够发送到串口助手上显示,却无法接收到我发送的内容”
不是矛 ...

嗯嗯,懂您意思了,是我没有说清楚,谢谢您!
回复

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-20 15:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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