打印
[STM32F4]

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

[复制链接]
1103|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
虚~无|  楼主 | 2017-2-19 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神问一下,串口通讯怎么把我发送的字符一个一个读出来,并且判断。我自己写的程序有个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;
       
                }
        }       
}       

沙发
qq4988| | 2017-2-19 13:16 | 只看该作者
你的接收部分程序在哪里,也贴出来看看

使用特权

评论回复
板凳
qq4988| | 2017-2-19 13:17 | 只看该作者
if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
                                {
                                        LED1=!LED1;
                                        delay_ms(100);
                                       
                                }   
这个程序能运行,条件只有一个,就是同时满足,你可以仿真一下,看看

使用特权

评论回复
地板
虚~无|  楼主 | 2017-2-19 14:11 | 只看该作者
qq4988 发表于 2017-2-19 13:16
你的接收部分程序在哪里,也贴出来看看

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
                Res =USART_ReceiveData(USART1);//(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;//接收数据错误,重新开始接收          
                                }                 
                        }
                }                    
  }


接收部分程序

使用特权

评论回复
5
虚~无|  楼主 | 2017-2-19 14:13 | 只看该作者
qq4988 发表于 2017-2-19 13:17
if(Tx_Buf[0]=='a'&&Tx_Buf[1]=='1')
                                {
                               ...

程序是可以运行,但是我发送第一个字符a,它也能执行下面的程序,我要的是满足两个条件才能运行下个程序

使用特权

评论回复
6
icecut| | 2017-2-19 17:01 | 只看该作者
注意优先级....

使用特权

评论回复
7
1988020566| | 2017-2-19 17:13 | 只看该作者
使用数组保存,然后校验。

使用特权

评论回复
8
1988020566| | 2017-2-19 17:15 | 只看该作者
接收程序试试使用移位的数组。

使用特权

评论回复
9
虚~无|  楼主 | 2017-2-19 19:14 | 只看该作者

那这个该怎么写?

使用特权

评论回复
10
虚~无|  楼主 | 2017-2-19 20:05 | 只看该作者
1988020566 发表于 2017-2-19 17:15
接收程序试试使用移位的数组。

                        if(Tx_Buf[0]=='a')
                                {
                                        for(t=1;t<8;t++)
                                        {
                                                Tx_Buf[t-1]=Tx_Buf[t];
                                                if(Tx_Buf[0]=='1')
                                                {
                                                        for(t=2;t<8;t++)
                                                        {
                                                                Tx_Buf[t-2]=Tx_Buf[t];
                                                                if(Tx_Buf[1]=='2')
                                                                {
                                                                LED1=!LED1;
                                                                }
                                                        }
                                                }
                                        }
                                }       
                       
为什么我编的移位数组,怎么到了第三位程序就不对了?

使用特权

评论回复
11
qq4988| | 2017-2-20 07:46 | 只看该作者
虚~无 发表于 2017-2-19 14:13
程序是可以运行,但是我发送第一个字符a,它也能执行下面的程序,我要的是满足两个条件才能运行下个程序
...

很可能是第一次进入后,没有清那个数组,第二次就又进来了,你可以做个实验,进入那个程序后,把数组都清了,再看看

使用特权

评论回复
12
cailantu| | 2017-2-20 11:41 | 只看该作者
11楼的分析应该是对的~赞

使用特权

评论回复
13
虚~无|  楼主 | 2017-2-20 17:59 | 只看该作者
qq4988 发表于 2017-2-20 07:46
很可能是第一次进入后,没有清那个数组,第二次就又进来了,你可以做个实验,进入那个程序后,把数组都清 ...

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

使用特权

评论回复
14
qq4988| | 2017-2-21 12:07 | 只看该作者
虚~无 发表于 2017-2-20 17:59
if(Tx_Buf[0]=='a'&Tx_Buf[1]=='1')
                                {
                                                LED1=!LED1;

你这哪是清空数组啊,这不只清了一个字节吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝