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

2019-07-20 16:46发布

各位大神问一下,串口通讯怎么把我发送的字符一个一个读出来,并且判断。我自己写的程序有个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(" 您发送的消息为: ");
                        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(" ");//插入换行
                        USART_RX_STA=0;
       
                }
        }       
}       



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
幼儿园扛把子
1楼-- · 2019-07-20 17:35
虚无境界 发表于 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(" ");//插入换行”这句上边写。你可以再来个for循环,循环8次,清空数组。
幼儿园扛把子
2楼-- · 2019-07-20 19:17
你发a之前是不是先发了a1啊
虚无境界
3楼-- · 2019-07-20 19:59
 精彩回答 2  元偷偷看……
幼儿园扛把子
4楼-- · 2019-07-20 20:40
 精彩回答 2  元偷偷看……
Adman
5楼-- · 2019-07-20 20:59
假如发送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;
                       
                }
虚无境界
6楼-- · 2019-07-21 01:15
幼儿园扛把子 发表于 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;
                                }
为什么我清空数组,程序还是跟原来一样?

一周热门 更多>