单片机串口中断接收字符串的问题
只发送一次指令,假设5个字符构成的字符串。如果将接收的字符串不放在一个数组中缓存一下,而是直接解析数据,取需要用的,有没有可能前面的字符被后面的字符覆盖???(随便一种单片机) 中断里做个简单的状态机 用switch case 如果不作任何处置直接写缓存的话,后面的肯定把前面的写掉了啊。 字节接收的,没有缓存怎么玩? 必须环形队列啊 既然都用中断了为什么不去处理数据?当接收缓存器满了时,数据可能被后来的数据刷新,也有可能不接收溢出的数据。具体看什么串口,像SPI数据交换这种后来溢出的数据就会把前面的数据刷新。 xzp21st 发表于 2015-3-26 21:31中断里做个简单的状态机 用switch case
我是先将数据放在一个数组buf[]中,然后switch,case,,结果我将每一个case中都把这个字符返给上位机,,记过乱七八糟,,
返回每一个buf[]中的数据,,上位机只显示接收了buf[]中最后一个数据,,也就是只显示了字符串中的最后一个字符 liude2006 发表于 2015-3-27 14:02
我是先将数据放在一个数组buf[]中,然后switch,case,,结果我将每一个case中都把这个字符返给上位机 ...
把代码贴上来啊 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]