AVR单片机能接收单个字节单不能接收字符串,急急急!!.....
//解析数据包FA 00 11 11 AFvoid 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,单片机也不处理数据,拿来就用,这样可以;但是程序改成上面的接收多个字节就不行了,大牛帮忙看看上面原因 ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2; ParseData()里的状态写的不好,就判断了收尾两个字节,另外Receive_Flag是全局变量吗?Receive_Flag ++还不如写成Receive_Flag=2;把数据解析放到中断函数里不好,推荐中断里收到数据就加入队列,在主循环里做数据解析 没看出问题,把收到的每个数据加1再向串口发送回去看看 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); //开接收中断
}
我收到数据接着返回去上位机只收到最后一个字节 liude2006 发表于 2015-5-4 12:33
//串口中断服务函数
ISR(USART_RXC_vect)
{
那就得好好检查了,先把收与发整通畅再说 是不是单片机太慢了? 每次接收到单个字节的数据,你的接收中断就关闭了,直到数据处理过后,接收中断才开启,所以不能处理字符串! 楼上正解,接收串的过程中不要关闭接收中断。接收和处理应该同时进行,否则你处理完成再开启中断时,就丢数据了。
页:
[1]