发信人: ule(ule), 信区: C
标 题: 串口读取问题
发信站: 饮水思源 (2014年07月03日00:32:58 星期四)

用的C8051F310,发现串口接收后如果不发送下就不能继续接收新的数据,发送后就行了,求大侠帮忙看下。用串口助手输入3个字节,如果开头是0x34则发送 03 00,否则发送ff,可以不断输入和响应。可else那块被注释掉后一旦发送了开头不是34的串口就无法继续接收了。

#include "initial.h"
#include <string.h>
typedef unsigned char byte;

byte send[20]; //用于存放发送的数据
byte receive[20]; //用于存放接收的数据
byte rec_ptr; //用于给接收到的数据编号
byte rec_flag; //rec_flag=1时表示已接收到一帧数据,对数据帧解析完
//rec_flag被置为0
byte rec_bytes; //接收的字节数

main(void)
{
byte i;
byte *ssd;
rec_ptr = 0;
rec_flag = 0;
PCA0MD &= ~0x40; // 关闭看门狗
Init();//单片机初始化
EA=1; //允许所有中断

while(1)
{ //等待中断接受完3个字节rec_flag置1
while (rec_flag==1)
{
send[0]= rec_bytes;
send[1]= 0x00;
ssd = send;
if(receive[0] == 0x34)
{
for(i=0;i<2;++i)
{
SBUF0=*ssd++; //待发送字节传给发送寄存器
while(TI0==0);//TI0是发送标志位,发送一字节后自动置1,须软件
//清零
TI0=0;
}
}
/* else
{
SBUF0=0xff;
while(TI0==0);
TI0=0;
} */
rec_flag=0;
}
}
}

void uart0(void) interrupt 4
{
if(RI0)
{
RI0=0;
receive[rec_ptr++] = SBUF0; //rec_ptr初始值为0,每接受一个数据便自增1

if (rec_ptr==3 )
{
rec_bytes = rec_ptr;
rec_ptr = 0;
rec_flag = 1;
}
}
}
--

※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 219.228.126.214]

※ 修改:·ule 于 2014年07月03日00:39:50 修改本文·[FROM: 219.228.126.214]

※ 修改:·ule 于 2014年07月03日00:44:00 修改本文·[FROM: 219.228.126.214]