请大家帮忙看看两个单片机之间串口通讯的问题
尽管程序可以正常运行,但总感觉串口通讯不是很可靠, 发偶数好一些, 奇数经常会收错, 不知何故, 请高手指教.
两个机器用的都是89s52, rx和tx 交叉对接.
a机的串口中断函数:
#define num 6
unsigned char point;
unsigned char buffer[12]={"0123456789ab"};
bit com_r=0;
com_interrupt(void) interrupt 4 using 3
{
// 串口中断
unsigned char receivr_buffer;
unsigned char t;
if(ri) // 接收
{
ri=0;
receivr_buffer=sbuf;
if (point==0)
if( receivr_buffer == 0xbb ) // 起始标志
buffer[point++]=receivr_buffer;
else point=0;
else if(point>0 && point<num) buffer[point++]=receivr_buffer;
if ( (point>=num) && (buffer[1]==buffer[2]) )
{point=0;com_r=1; com_work();} // 接收成功,设置收到标志
}
if(ti) // 发送
{
// 由 com_sent 函数发第一个字符,引发中断, 在此仅发后面的字符
for (t=1;t<num;t++)
{
acc=buffer[t];
sbuf=acc;
ti=0; while(ti==0); _nop_();
ti=1;
}
ti=0;
}
}
void com_init(void)
{
// 串口初始化
scon=0x50; // 选择串口工作方式 1 允许接收
pcon=0; // smod=0 速度不加倍
tmod=0x20; // 定时器1 工作在方式2, 定时器0 工作在方式 0
tl1=0xfd;
th1=0xfd; // 传输速率 9600 smod=0
tr1=1; // 启动定时器 1
et1=0; // 禁止定时器 1 中断
es=1; // 允许串口中断
ps=1; // 提高串口中断优先级
ea=1;
}
void com_send(void)
{
//char t;
// 把缓冲区 第1字节 发送出去
buffer[0]=0xaa;
buffer[4]=0;
buffer[5]=0;
dispcom(0); // 显示串口命令
acc=buffer[0];
sbuf=acc;
delayms(20);
}
b机的部分程序:
// 串口相关变量
bit com_r=0;
unsigned char buffer[10];
unsigned char point;
com_interrupt(void) interrupt 4 using 3
{
// 串口中断
unsigned char receivr_buffer;
unsigned char t;
if(ri) // 接收
{
ri=0;
receivr_buffer=sbuf;
if (point==0)
if( receivr_buffer == 0xaa ) // 起始标志
buffer[point++]=receivr_buffer;
else point=0;
else if(point>0 && point<num) buffer[point++]=receivr_buffer;
if (point>=num && (buffer[1]==buffer[2]) )
{
point=0;
if (buffer[3]==0xa0 && buffer[1]==0x00 )
{jdq_1=1; jdq_2=1; jdq_3=1; jdq_4=1; jdq_7=1; jdq_8=1; }
else
{com1=buffer[3]; com2=buffer[1];com_r=1; } // 接收成功,设置收到标志
if (buffer[3]==0xa0 && buffer[1]==0x02 )
start=0;
}
}
if(ti) // 发送
{
// 由 com_sent 函数发第一个字符,引发中断, 在此仅发后面的字符
for (t=1;t<num;t++)
{
acc=buffer[t];
sbuf=acc;
ti=0;
while(ti==0); _nop_();
ti=1;
}
ti=0;
}
}
void com_init(void)
{
// 串口初始化
// 串口初始化
scon=0x50; // 选择串口工作方式 1
pcon=0; // smod=0 速度不加倍
tmod=0x20; // 定时器1 工作在方式2, 定时器0 工作在方式 0
tl1=0xfd;
th1=0xfd; // 传输速率 9600 smod=0
tr1=1; // 启动定时器 1
et1=0; // 允许定时器 1 中断
es=1; // 允许串口中断
ps=1; // 提高串口中断优先级
ea=1;
ren=1; // 允许接收
}