一组数据,共有多少字节? 20 个?
根据字节数,设定一个数组。
收到一个,存放一个。
收到 20 个后,判断:
if (recbuf[16] == 'm' recbuf[17] == 'b' recbuf[18] == 'a' recbuf[19] == 'r')
满足条件,就把其前面的,变换成数:
//recbuf[1] = '.';
x = (recbuf[0] - 48) + (recbuf[2] - 48) * 0.1 + (recbuf[3] - 48) * 0.01;
//recbuf[4] = ' ' //recbuf[7] = '.'
n = (recbuf[5] - 48) * 10 + (recbuf[6] - 48) + (recbuf[8] - 48) * 0.1;
//recbuf[9] = ' ' //recbuf[13] = '.'
p = (recbuf[10] - 48) * 100 + (recbuf[11] - 48) * 10 + (recbuf[12] - 48)
+ (recbuf[14] - 48) * 0.1 + (recbuf[15] - 48) * 0.01;
……你自己把逻辑锁死了。收到一回4字节序列后,flag1置位,之后发送数据。可是在发送数据的时候又会进入中断的,由于接收缓冲区中还是那4字节的序列,于是flag1再次被置位……于是乎进入永不停歇的死循环。
你的串口中断应当判断一下是发送还是接收……
收/发一个数据会了,那收/多个的方法也相同。接收最好用中断方式,不影响其它程序执行。发送时,采用查询方式比较方便好写。发送多个,可用for循环控制,循环体内就是发送一个数据的程序,只是循环发送了。在循环发送前,把串口中断关了,ES=0;发送结束再打开中断,ES=1;
你没有利用串口中断,未定义串口中断处理函数,所以不应当开放 ES =1;
置 ES=0; 使之不产生串口中断事件,但并不等于不会置串口发生标志 TI
程序有几个可疑的位置 ,
1.你用uchar * 来指向uchar code* 这个可能有问题
2.设ES = 1; 会在TI被置1时CPU控制权会跳到串口向量,但你未定义串口中断函数
3.程序就算能发送,也只在单片机开机那一小会,你看不到很正常,应当改成由开关按据触发,按一次,发一回,这样,你就可以有时间来监测有没有发生串口信号了。
这样做会丢失数据的。并且你将一个死循环放到中断里面也有很大问题。
void Uart() interrupt 4 using 1
{
statick unsigned char i;
if (RI)
{
RI = 0; //清除RI位
receive[i++]=SBUF; //P0显示串口数据
P22 = RB8; //P2.2显示校验位
SBUF=receive[i++];
while(TI==0);
TI=0;
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
} }
你先看看串口线有没问题:
将串口的2、3脚两根针短接,用键盘在串口调试输入字符,如果串口调试接收区能够显示输入的字符,说明串口工作正常
等我再看看程序
我觉得这儿有问题 JBC TI,SEND
JBC在T1为0的时候,会顺序执行,然后就end了 ,这里我觉得应该改为等待发送结束的指令
JNB T1, $
stc单片机串口3接收的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:stc单片机串口3接收