liude2006 发表于 2015-5-4 09:39:22

AVR单片机能接收单个字节单不能接收字符串,急急急!!.....

//解析数据包FA 00 11 11 AF
void ParseData(void)
{       
        switch (Receive_Flag)
        {
                case 0:
                                if(Receive_Data == 0xFA)
                                                Receive_Flag ++;               
                                else         Receive_Flag = 0;
                break;
                case 1:
                                Receive_Flag ++;
                                rec_buf = Receive_Data;   //0X00
                break;
                case 2:
                                Receive_Flag ++;
                                rec_buf = Receive_Data;   
                                rec_buf = rec_buf ^ rec_buf;   
                break;
                case 3:
                                if(rec_buf == Receive_Data)
                                {
                                        UartTemp = rec_buf;
                                        Receive_Flag ++;
                                }
                                else        Receive_Flag = 0;
                break;
                case 4:
                                if(Receive_Data == 0xAF)
                                        Flag_Rece_Uartbuf = 1;
                                Receive_Flag = 0;
                break;
                default: break;
        }       
}
//串口中断服务函数
ISR(USART_RXC_vect)
        {
                UCSRB &= ~_BV(RXCIE);                       //关UART接收中断

                Receive_Data = UDR;       
                ParseData();
               
                UCSRB |= _BV(RXCIE);   //开接收中断               
        }
只要Flag_Rece_Uartbuf = 1;就开始其他操作
如果上位机发送单个字节如:11,单片机也不处理数据,拿来就用,这样可以;但是程序改成上面的接收多个字节就不行了,大牛帮忙看看上面原因

sbk100 发表于 2015-5-4 10:56:51

ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2;

sbk100 发表于 2015-5-4 10:57:32

ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2;把数据解析放到中断函数里不好,推荐中断里收到数据就加入队列,在主循环里做数据解析

lcw_swust 发表于 2015-5-4 11:15:52

没看出问题,把收到的每个数据加1再向串口发送回去看看

liude2006 发表于 2015-5-4 12:33:42

lcw_swust 发表于 2015-5-4 11:15
没看出问题,把收到的每个数据加1再向串口发送回去看看

//串口中断服务函数
ISR(USART_RXC_vect)
        {
                UCSRB &= ~_BV(RXCIE);                       //关UART接收中断

                Receive_Data = UDR;               
                UartSendByte(Receive_Data);
               
                UCSRB |= _BV(RXCIE);   //开接收中断               
        }

我收到数据接着返回去上位机只收到最后一个字节

lcw_swust 发表于 2015-5-4 16:01:09

liude2006 发表于 2015-5-4 12:33
//串口中断服务函数
ISR(USART_RXC_vect)
        {


那就得好好检查了,先把收与发整通畅再说

richyhuang 发表于 2015-5-5 09:05:22

是不是单片机太慢了?

哈士奇的语言 发表于 2015-5-5 19:04:57

每次接收到单个字节的数据,你的接收中断就关闭了,直到数据处理过后,接收中断才开启,所以不能处理字符串!

MiniCat 发表于 2015-5-6 20:12:45

楼上正解,接收串的过程中不要关闭接收中断。接收和处理应该同时进行,否则你处理完成再开启中断时,就丢数据了。
页: [1]
查看完整版本: AVR单片机能接收单个字节单不能接收字符串,急急急!!.....