野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14498|回复: 22

串口发送一次为什么会接收两次

[复制链接]
发表于 2016-1-10 22:02:46 | 显示全部楼层 |阅读模式
以下程序是想发送一次然后接收一次,可结果是发送一次接收两次,该如何判断让它符合要求????????????????


unsigned char recv_char[30];
int i=0;
void UsartReceive(void)
{

        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
        {         
                USART_ClearFlag(USART1, USART_FLAG_RXNE | USART_FLAG_ORE);
          
   recv_char[i]= USART_ReceiveData(USART1);
                i++;
                       
                }
                        if((recv_char[0] == 'F')&&(recv_char[1] == 'E')&&(recv_char[2] == 'F')&&(recv_char[3] == 'D')&&(recv_char[4] == 'A')&&(recv_char[5] == 'A')&&(recv_char[6] == 'A')&&(recv_char[7] == 'A')&&(recv_char[8] == 'A')&&(recv_char[9] == 'A'))
                {  
                       
                        printf("%s\n","FEFDAA0000");
                }
               
                }
回复

使用道具 举报

发表于 2016-1-11 08:34:12 | 显示全部楼层
void UsartReceive(void)
{

        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
        {         
                USART_ClearFlag(USART1, USART_FLAG_RXNE | USART_FLAG_ORE);
         
   recv_char[i]= USART_ReceiveData(USART1);
                i++;
if((recv_char[0] == 'F')&&(recv_char[1] == 'E')&&(recv_char[2] == 'F')&&(recv_char[3] == 'D')&&(recv_char[4] == 'A')&&(recv_char[5] == 'A')&&(recv_char[6] == 'A')&&(recv_char[7] == 'A')&&(recv_char[8] == 'A')&&(recv_char[9] == 'A'))
                {  
                       
                        printf("%s\n","FEFDAA0000");
                }
                       
                }                     
               
                }

这样改试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 09:16:59 | 显示全部楼层
亽亼 发表于 2016-1-11 08:34
void UsartReceive(void)
{

不行,我试了,还是两次
回复 支持 反对

使用道具 举报

发表于 2016-1-11 09:30:01 | 显示全部楼层
你把串口截屏上来看看
QQ截图20160111092812.png
参考例程,测试过就一次


回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 10:27:14 | 显示全部楼层
亽亼 发表于 2016-1-11 09:30
你把串口截屏上来看看

参考例程,测试过就一次

例程我试了,可是增加了判断后再输出就不可以了   ,发送显示发出10字节,接收区是22字节,应该加了换行符            不知道上传的图片可能看到
回复 支持 反对

使用道具 举报

发表于 2016-1-11 11:00:22 | 显示全部楼层
个人觉得你是程序逻辑有些问题,DEBUG_USART_IRQHandler中断是每接收一个字符就会进入一次的,比如你发“FEFD”它会进入中断4次,并不会只进入一次
QQ截图20160111105811.png
回复 支持 反对

使用道具 举报

发表于 2016-1-11 11:00:58 | 显示全部楼层
另外你上传的图是看不到的,不知你是什么格式的图
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 11:23:50 | 显示全部楼层
亽亼 发表于 2016-1-11 11:00
另外你上传的图是看不到的,不知你是什么格式的图

我上传的是QQ截图的,后缀是png,我程序没加J时出现的结果是:
FEFDAA0000
FEFDAA0000
是这样的结果,那是说明有两次中断吗??????
可是我不知道这逻辑咋错了啊。我怎么感觉是对的啊???????你能告诉我哪错了吗????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 11:26:38 | 显示全部楼层
亽亼 发表于 2016-1-11 11:00
另外你上传的图是看不到的,不知你是什么格式的图

还有个问题,我用单片机调试助手,发送的不是FEFDAAAAAA,接收区没收到任何信息,可是野火串口助手怎么还是照样可以接收到FEFDAA0000????????
回复 支持 反对

使用道具 举报

发表于 2016-1-11 11:50:51 | 显示全部楼层
j变量是我加的,本来想帮你理解,你好好分析我截图程序和对应的效果
DEBUG_USART_IRQHandler中断是每接收一个字符就会进入一次的,比如你发“FEFD”它会进入中断4次,并不会只进入一次这句话理解非常重要
回复 支持 反对

使用道具 举报

发表于 2016-1-11 11:53:44 | 显示全部楼层
QQ截图20160111115210.png
QQ截图20160111115330.png
回复 支持 反对

使用道具 举报

发表于 2016-1-11 12:44:23 | 显示全部楼层
Vicky 发表于 2016-1-11 10:27
例程我试了,可是增加了判断后再输出就不可以了   ,发送显示发出10字节,接收区是22字节,应该加了换行 ...

你可以把截图保存成Jpg格式的啊。不要用PNG格式的。那个是默认的格式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 14:15:09 | 显示全部楼层
亽亼 发表于 2016-1-11 11:50
j变量是我加的,本来想帮你理解,你好好分析我截图程序和对应的效果
DEBUG_USART_IRQHandler中断是每接收 ...

是因为我是一个字节一个字节发送的,所以每发一个字节就进入一次中断是吧????
可是我看了串口说就是一个字节一个字节发送的,那又该在办呢,怎么转换成是字符串发送呢??????
我之前定义一个字符串str,可是判断字符串if(str=="FEFDAAAAAA")总显示错误,我现在都不知道从哪下手了??????????????????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 14:17:56 | 显示全部楼层
亽亼 发表于 2016-1-11 11:50
j变量是我加的,本来想帮你理解,你好好分析我截图程序和对应的效果
DEBUG_USART_IRQHandler中断是每接收 ...

是因为我是一个字节一个字节发送的,所以每发一个字节就进入一次中断是吧????
可是我看了串口说就是一个字节一个字节发送的,那又该在办呢,怎么转换成是字符串发送呢??????
我之前定义一个字符串str,可是判断字符串if(str=="FEFDAAAAAA")总显示错误,我现在都不知道从哪下手了??????????????????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 14:18:26 | 显示全部楼层
亽亼 发表于 2016-1-11 11:50
j变量是我加的,本来想帮你理解,你好好分析我截图程序和对应的效果
DEBUG_USART_IRQHandler中断是每接收 ...

是因为我是一个字节一个字节发送的,所以每发一个字节就进入一次中断是吧????
可是我看了串口说就是一个字节一个字节发送的,那又该在办呢,怎么转换成是字符串发送呢??????
我之前定义一个字符串str,可是判断字符串if(str=="FEFDAAAAAA")总显示错误,我现在都不知道从哪下手了??????????????????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 14:36:37 | 显示全部楼层

第一幅图是之前的,,,后两幅是刚运行的,可是我按照你写的运行怎么结果和你的不一样啊?????????? QQ图片20160111143201.png QQ图片20160111143127.jpg QQ图片20160111143149.png
回复 支持 反对

使用道具 举报

发表于 2016-1-11 14:37:43 | 显示全部楼层
是因为我是一个字节一个字节发送的,所以每发一个字节就进入一次中断是吧????不是你发送的问题,STM32接收本来就是一个字节就自动进入中断一次的
要字符串发送一般是添加一个结束标准字符,比如当STM32收到一个回车就认为电脑端字符串发送完成
if(str=="FEFDAAAAAA")没有这样的写法,
若是字符串,则需要使用字符串函数了,strcmp
char s1[]="abc",s2[]="xyz";
if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 14:50:10 | 显示全部楼层
亽亼 发表于 2016-1-11 14:37
是因为我是一个字节一个字节发送的,所以每发一个字节就进入一次中断是吧????不是你发送的问题,STM32 ...

大神,我还是不知道要从哪方面修改,请指导下!!!!!!!!!!!
还有为什么我添加了变量J之后,串口接收区就只有J变化的值????????
回复 支持 反对

使用道具 举报

发表于 2016-1-11 15:03:07 | 显示全部楼层
hold不住了
你先看文档说明吧,虽然是F4的但F1还是有很多通用的
http://pan.baidu.com/s/1pKt88C7
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 15:27:41 | 显示全部楼层
亽亼 发表于 2016-1-11 15:03
hold不住了
你先看文档说明吧,虽然是F4的但F1还是有很多通用的
http://pan.baidu.com/s/1pKt88C7

好的,谢谢,现在是不是很少用F1的了啊?
回复 支持 反对

使用道具 举报

发表于 2016-1-11 15:37:45 | 显示全部楼层
不是少用,每个型号芯片都有它的优势
我们目前出F4教程,写好后马上会修改到F1的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 15:54:18 | 显示全部楼层
亽亼 发表于 2016-1-11 15:37
不是少用,每个型号芯片都有它的优势
我们目前出F4教程,写好后马上会修改到F1的

这样啊,你刚给我的链接说原始文件不存在了。
回复 支持 反对

使用道具 举报

发表于 2016-1-11 16:04:55 | 显示全部楼层
http://pan.baidu.com/s/1pKt88C7
如果不行无解了
QQ截图20160111160411.png
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 01:39 , Processed in 0.040073 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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