关于51串口通信的问题
代码如下很简单
uchar code table[]="I AM OK ";
uchar num,a,n;
void delay(uint i);
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main()
{
TMOD=0x20; //用定时器设置串口波特率T1计时器模式2 8位重装,0010 0000
TH1=0xFd; //串口1模式,波特率9600TL1=0xFd; //定时器启动
TR1=1;
REN=1; //串口允许接收
SM0=0;//方式1
SM1=1;
//SM2=1;
EA=1; //开启总中断
ES=1;// 开启串口中断
while(1)
{
if(num==1) //判断是否有串口数据的传送
{
ES=0;
num=0;
for(n=0;n<8;n++)
{
SBUF=table[n];
while(!TI);
TI=0;
}
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
P2_0=RB8;
P1=SBUF;//接收数据SBUF,即将计算机的数据接收。
a=SBUF;
num=1;
}
有如下问题请高手解决谢谢
1,发送数据必须要先等到接收到数据才可以是吧!但是for中是连续发了八个字符呀,而且程序是接收一个字符时发了8个字符;接收2两个字符时发了两次8个字符;接收9个字符时,发三次8个字符,请问这是为什么?
2,关于校验位的如何使用,就是TM2=1吗,是自己编写校验程序吗?最好有实例??
[解决办法]
关于问题1:
就你自己写的程序而言,不是必须发完数据才能进行收。因为你收数据是在中断处理的,所以应该来说收数据优先发数据。 就是说你在发数据8个byte还没有发完,可能收的数据到了,他就是中断发而先去处理收中断。
所以你想得到1收一个byte发8个byte这样写程序本来就是错的。如果要达到你想要的效果,需要先缓存串口收到数据然后再做处理。
关于问题2:
我自己从来没有写过串口的奇偶校验位,但是从51寄存器来说因该不是判断TM2=1。因为如果有校验位,那么应该通过TB8和RB8这个寄存器来操作。具体怎么操作你自己做做实验应该可以得到。我估计串口应该是在传送9位模式的时候会用到TB8和RB8这2个寄存器。
[解决办法]
2,关于校验位的如何使用,就是TM2=1吗,是自己编写校验程序吗?最好有实例??
加和校验,异或和校验和CRC等都是非常实用的
[解决办法]
void ser() interrupt 4
{
RI=0;
P2_0=RB8;
P1=SBUF; //接收数据SBUF,即将计算机的数据接收。
a=SBUF;
num=1;
}
中断里要区分是接收中断还是发送中断