OpenEdv-开源电子网

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

F4串口通讯怎么把收到的字符一个一个读出来,并且判断

[复制链接]

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2016-11-4
在线时间
74 小时
发表于 2017-2-19 10:56:17 | 显示全部楼层 |阅读模式
1金钱
各位大神问一下,串口通讯怎么把我发送的字符一个一个读出来,并且判断。我自己写的程序有个bug,就是单独发送第一个字符,也是可以执行程序,而不是一定要验证两个字符才能执行程序。比如下面的程序,我发送a1,程序可以执行,但我发送a,程序也是可以执行的,这个怎么解决?

int main(void)
{
       
        u8 Tx_Buf[8];   //要发送的数据
        u8 t;
        u16 len;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                //延时初始化
        uart_init(115200);        //串口初始化波特率为115200
        LED_Init();                                  //初始化与LED连接的硬件接口  
        while(1)
        {
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                       
                        printf("\r\n您发送的消息为:\r\n");
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);         //向串口1发送数据
                                Tx_Buf[t]=USART_RX_BUF[t];
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                        }
                       
                        if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
                                {
                                        LED1=!LED1;
                                        delay_ms(100);
                                       
                                }       
                               
                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
       
                }
        }       
}       



最佳答案

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

首先你的if内条件少个&,其次你这样做并没有清空数组,按你的程序假设先发的a1,执行完for循环后,进入if,你的Tx_Buf[t]的值并不是Tx_Buf[1],而且你仅将数组中的一个单元清零了,其他的都没管,一旦你输入的多于两个了,你又会出现新的BUG。最后我上次说的在if语句下指的是if这个花括号外,也就是在你的那个“printf("\r\n\r\n");//插入换行”这句上边写。你可以再来个for循环,循环8次,清空数组。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-2-9
在线时间
52 小时
发表于 2017-2-19 10:56:18 | 显示全部楼层
虚无境界 发表于 2017-2-20 18:23
if(Tx_Buf[0]=='a'&Tx_Buf[1]=='1')
                                {   
                                                LED1=!LED1;

首先你的if内条件少个&,其次你这样做并没有清空数组,按你的程序假设先发的a1,执行完for循环后,进入if,你的Tx_Buf[t]的值并不是Tx_Buf[1],而且你仅将数组中的一个单元清零了,其他的都没管,一旦你输入的多于两个了,你又会出现新的BUG。最后我上次说的在if语句下指的是if这个花括号外,也就是在你的那个“printf("\r\n\r\n");//插入换行”这句上边写。你可以再来个for循环,循环8次,清空数组。
回复

使用道具 举报

6

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-2-9
在线时间
52 小时
发表于 2017-2-19 22:13:01 | 显示全部楼层
你发a之前是不是先发了a1啊
回复

使用道具 举报

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2016-11-4
在线时间
74 小时
 楼主| 发表于 2017-2-20 10:04:05 | 显示全部楼层
幼儿园扛把子 发表于 2017-2-19 22:13
你发a之前是不是先发了a1啊

是的,如果我第一次发a程序不会执行,但如果我第一次发a1,然后发a,程序也是会执行的,这个该怎么改?
回复

使用道具 举报

6

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-2-9
在线时间
52 小时
发表于 2017-2-20 10:12:30 | 显示全部楼层
虚无境界 发表于 2017-2-20 10:04
是的,如果我第一次发a程序不会执行,但如果我第一次发a1,然后发a,程序也是会执行的,这个该怎么改?

if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
                                {
                                        LED1=!LED1;
                                        delay_ms(100);
                                       
                                }        
你的bug在于第一次发完后你的Tx_Buf[1]始终是'1',没有改变过,修补的话,在上述if语句下边将Tx_Buf这个数组所有值清零,最好写入'\0',直接写数值0也可以。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-2-16
在线时间
6 小时
发表于 2017-2-20 16:14:39 | 显示全部楼层
假如发送21,这样就可以取出来    a1 取得就是发的第一位,以此类推

    a=USART_RX_BUF[0];
     a1=a-48;
     b=USART_RX_BUF[1];
     b1=b-48;  
     d=a1*10+b1;
    if(d==21)
                {
                LED0=!LED0;
                       
                }
回复

使用道具 举报

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2016-11-4
在线时间
74 小时
 楼主| 发表于 2017-2-20 18:23:12 | 显示全部楼层
幼儿园扛把子 发表于 2017-2-20 10:12
if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
                                {
                            ...

                        if(Tx_Buf[0]=='a'&Tx_Buf[1]=='1')
                                {   
                                                LED1=!LED1;
                                                delay_ms(100);
                                                Tx_Buf[t]=0;
                                }
为什么我清空数组,程序还是跟原来一样?
回复

使用道具 举报

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2016-11-4
在线时间
74 小时
 楼主| 发表于 2017-2-20 18:27:20 | 显示全部楼层
Adman 发表于 2017-2-20 16:14
假如发送21,这样就可以取出来    a1 取得就是发的第一位,以此类推

    a=USART_RX_BUF[0];

为什么我发送2他都可以亮灯?
回复

使用道具 举报

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2016-11-4
在线时间
74 小时
 楼主| 发表于 2017-2-20 22:48:05 | 显示全部楼层
幼儿园扛把子 发表于 2017-2-20 19:42
首先你的if内条件少个&,其次你这样做并没有清空数组,按你的程序假设先发的a1,执行完for循环后,进入if ...

非常感谢您的耐心回答,谢谢!
回复

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2020-10-3
在线时间
8 小时
发表于 2020-10-3 22:52:28 | 显示全部楼层
Adman 发表于 2017-2-20 16:14
假如发送21,这样就可以取出来    a1 取得就是发的第一位,以此类推

    a=USART_RX_BUF[0];

b=USART_RX_BUF[1];
     b1=b-47;  
这里是不是应该是-47?
因为RX_BUF[1]算进了一位
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 03:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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