搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2015-3-26 21:25:31 | 显示全部楼层 |阅读模式
只发送一次指令,假设5个字符构成的字符串。如果将接收的字符串不放在一个数组中缓存一下,而是直接解析数据,取需要用的,有没有可能前面的字符被后面的字符覆盖???(随便一种单片机)

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

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

出0入0汤圆

发表于 2015-3-26 21:31:34 | 显示全部楼层
中断里做个简单的状态机 用switch case

出0入0汤圆

发表于 2015-3-26 21:39:35 | 显示全部楼层
如果不作任何处置直接写缓存的话,后面的肯定把前面的写掉了啊。
头像被屏蔽

出0入0汤圆

发表于 2015-3-26 21:55:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2015-3-26 22:09:58 | 显示全部楼层
字节接收的,没有缓存怎么玩?

出0入0汤圆

发表于 2015-3-26 22:42:28 来自手机 | 显示全部楼层
必须环形队列啊

出0入0汤圆

发表于 2015-3-27 11:59:57 | 显示全部楼层
既然都用中断了为什么不去处理数据?当接收缓存器满了时,数据可能被后来的数据刷新,也有可能不接收溢出的数据。具体看什么串口,像SPI数据交换这种后来溢出的数据就会把前面的数据刷新。

出0入0汤圆

 楼主| 发表于 2015-3-27 14:02:40 | 显示全部楼层
xzp21st 发表于 2015-3-26 21:31
中断里做个简单的状态机 用switch case

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

出0入0汤圆

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

把代码贴上来啊

出0入0汤圆

 楼主| 发表于 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[0] == 0xFA)
                                                Receive_Flag ++;               
                                else         Receive_Flag = 0;
                break;
                case 1:
                                Receive_Flag ++;
                                rec_buf[0] = rec_uart_buf[1];     //0X00
                break;
                case 2:
                                Receive_Flag ++;
                                rec_buf[1] = rec_uart_buf[2];     
                                rec_buf[2] = rec_buf[0] ^ rec_buf[1];   
                break;
                case 3:
                                if(rec_buf[2] == rec_uart_buf[3])
                                {
                                        UartTemp = rec_buf[1];
                                        Receive_Flag ++;
                                }
                                else        Receive_Flag = 0;
                                Receive_Flag ++;
                                UartSendByte(Receive_Flag);
                break;
                case 4:
                                if(rec_uart_buf[4] == 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单片机这样解析数据,就很好,没有这种问题)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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

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