liude2006 发表于 2015-3-26 21:25:31

单片机串口中断接收字符串的问题

只发送一次指令,假设5个字符构成的字符串。如果将接收的字符串不放在一个数组中缓存一下,而是直接解析数据,取需要用的,有没有可能前面的字符被后面的字符覆盖???(随便一种单片机)

xzp21st 发表于 2015-3-26 21:31:34

中断里做个简单的状态机 用switch case

gracialee 发表于 2015-3-26 21:39:35

如果不作任何处置直接写缓存的话,后面的肯定把前面的写掉了啊。

liujie14565 发表于 2015-3-26 21:55:38

HalenYU 发表于 2015-3-26 22:09:58

字节接收的,没有缓存怎么玩?

sbk100 发表于 2015-3-26 22:42:28

必须环形队列啊

Hhhhhhhh 发表于 2015-3-27 11:59:57

既然都用中断了为什么不去处理数据?当接收缓存器满了时,数据可能被后来的数据刷新,也有可能不接收溢出的数据。具体看什么串口,像SPI数据交换这种后来溢出的数据就会把前面的数据刷新。

liude2006 发表于 2015-3-27 14:02:40

xzp21st 发表于 2015-3-26 21:31
中断里做个简单的状态机 用switch case

   我是先将数据放在一个数组buf[]中,然后switch,case,,结果我将每一个case中都把这个字符返给上位机,,记过乱七八糟,,
返回每一个buf[]中的数据,,上位机只显示接收了buf[]中最后一个数据,,也就是只显示了字符串中的最后一个字符

xzp21st 发表于 2015-3-27 20:35:25

liude2006 发表于 2015-3-27 14:02
我是先将数据放在一个数组buf[]中,然后switch,case,,结果我将每一个case中都把这个字符返给上位机 ...

把代码贴上来啊

liude2006 发表于 2015-4-20 16:29:02

xzp21st 发表于 2015-3-27 20:35
把代码贴上来啊

        ISR(USART_RXC_vect)
        {
                UCSRB &= ~_BV(RXCIE);                       //关UART接收中断
//                UartTemp = UDR;                               //发送缓冲器UDR
                Receive_Value = UDR;
/*               
                if (i <= 4)
                {
                        rec_uart_buf = Receive_Value;
                        UartSendByte(rec_uart_buf);
                        i++;
                        if(i > 4) i = 0;
                }
*/               
                ParseData();
}

//解析数据包FA 00 11 11 AF
void ParseData(void)
{       
        //UartSendByte(0x82);
        switch (Receive_Flag)
        {
                case 0:
                                if(rec_uart_buf == 0xFA)
                                                Receive_Flag ++;               
                                else         Receive_Flag = 0;
                break;
                case 1:
                                Receive_Flag ++;
                                rec_buf = rec_uart_buf;   //0X00
                break;
                case 2:
                                Receive_Flag ++;
                                rec_buf = rec_uart_buf;   
                                rec_buf = rec_buf ^ rec_buf;   
                break;
                case 3:
                                if(rec_buf == rec_uart_buf)
                                {
                                        UartTemp = rec_buf;
                                        Receive_Flag ++;
                                }
                                else        Receive_Flag = 0;
                                Receive_Flag ++;
                                UartSendByte(Receive_Flag);
                break;
                case 4:
                                if(rec_uart_buf == 0xAF)
                                        Flag_Rece_Uartbuf = 1;
                                Receive_Flag = 0;
                                UartSendByte(Receive_Flag);
                break;
                default: break;
        }       
}
这中情况接收的数据不对;我在中断函数中将ParseData();注释掉,然后
        if (i <= 4)
                {
                        rec_uart_buf = Receive_Value;
                        UartSendByte(rec_uart_buf);
                        i++;
                        if(i > 4) i = 0;
                }
返回的数据始终是最后一个字节
(用的AVR单片机;我用51单片机这样解析数据,就很好,没有这种问题)
页: [1]
查看完整版本: 单片机串口中断接收字符串的问题