以下程序是较为通用的串口收发例程,开辟一个16字节的缓冲区,两个指针,一个存数指针,一个取数指针,两指针相等,证明没有新的接收数据。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr
void uart_isr() interrupt 4
{
if(RI)
{
RI=0
buf[putptr]=SBUF
putptr++
putptr&=0x0f
}
}
main()
{
TMOD=0x20
SCON=0x50
TH1=TL1=0xfd
TR1=1
ES=1
EA=1
putptr=0
getptr=0
while(1)
{
if(getptr!=putptr) //取数指针和存数指针如果不等
{
SBUF=buf[getptr]
getptr++
getptr&=0x0f
while(!TI)
TI=0
}
}
}
波特率是115200并不是说串口就一直在接收和发送数据,10ms不一定能够接收到123个字符的,所以这个计算时间的方式是不对的。这里应该每隔10ms主动去读取一次串口缓冲区,而不管缓冲区存放了多少字节。可以有很多方法,用线程或者定时器,间隔10ms就去读串口,读到数据之后自己怎么处理都行了。
PolicyPktRecv(unsigned char *buf, unsigned int uLen ){
struct Data_t *data1
data1 = (struct Data_t *)buf
RotateSpeed[count] = data1->RotateRate
Electricity[count] = data1->Electricity
Acceleration[count] = data1->Acceleration
count++
}
其中count、RotateSpeed[]、Electricity[]、Acceleration[]分别是全局变量和数组。count初始化为0.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)