搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2015-5-4 09:39:22 | 显示全部楼层 |阅读模式
//解析数据包  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[0] = Receive_Data;     //0X00
                break;
                case 2:
                                Receive_Flag ++;
                                rec_buf[1] = Receive_Data;     
                                rec_buf[2] = rec_buf[0] ^ rec_buf[1];   
                break;
                case 3:
                                if(rec_buf[2] == Receive_Data)
                                {
                                        UartTemp = rec_buf[1];
                                        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,单片机也不处理数据,拿来就用,这样可以;但是程序改成上面的接收多个字节就不行了,大牛帮忙看看上面原因

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-5-4 10:56:51 | 显示全部楼层
ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2;

出0入0汤圆

发表于 2015-5-4 10:57:32 | 显示全部楼层
ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2;把数据解析放到中断函数里不好,推荐中断里收到数据就加入队列,在主循环里做数据解析

出0入0汤圆

发表于 2015-5-4 11:15:52 | 显示全部楼层
没看出问题,把收到的每个数据加1再向串口发送回去看看

出0入0汤圆

 楼主| 发表于 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);   //开接收中断               
        }

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

出0入0汤圆

发表于 2015-5-4 16:01:09 | 显示全部楼层
liude2006 发表于 2015-5-4 12:33
//串口中断服务函数
ISR(USART_RXC_vect)
        {

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

出0入0汤圆

发表于 2015-5-5 09:05:22 | 显示全部楼层
是不是单片机太慢了?

出0入0汤圆

发表于 2015-5-5 19:04:57 | 显示全部楼层
每次接收到单个字节的数据,你的接收中断就关闭了,直到数据处理过后,接收中断才开启,所以不能处理字符串!

出0入0汤圆

发表于 2015-5-6 20:12:45 | 显示全部楼层
楼上正解,接收串的过程中不要关闭接收中断。接收和处理应该同时进行,否则你处理完成再开启中断时,就丢数据了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 15:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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