发表于:2005/1/15 22:02:00
#0楼
我采用AT89LS51,外接一个MAX491来进行多机全双工RS485通信。
在调试的时候先采用双机通信,发现从机的总是接收不正确。只能接收0x55,例如0x95,0x20这样的
字节就总是出错。由于没有RS485/RS232适配器,所以不能打到PC串口看数据。
我又一块单片机,采用RS232接口和PC通信,采用相同的程序,使用串口调试精灵调试,发现接收和发送
都是正常的,请问这是怎么回事?谢谢
以下是我的源码:
/***********************************************
主机
***********************************************/
void main (void)
{
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
IE =0x90;
TR1 = 1; /* Timer 1 run */
Rx_en=0; /* RS-485 Rx enable,'0'--enable; '1'--disable */
Tx_en=1; /* RS-485 Tx enable,'1'--enable; '0'--disable */
while(1)
{
SBUF=0x55; //只有0x55可以成功被从机接收
while(TI==0);
TI=0;
delay(100);
LED_blink1(); /* If received a byte ,LED1 will blink */
}
}
void serial () interrupt 4 //接收采用中断,发送不使用中断
{
if(RI)
{
char uart_data;
RI=0;
uart_data=SBUF;
switch(uart_data)
{
case 0x25:
LED_blink2();
break;
default:
break;
}
}
}
/***********************************************
从机
***********************************************/
void main (void)
{
char shakehands;
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
ES = 0; /* Disable serial interrupt */
EA = 0; /* Disable global interrupt */
TR1 = 1; /* Timer 1 run */
Rx_en=0;
Tx_en=1; // RS-485 Tx ,'1'--enable; '0'--disable
while(1)
{
if(RI==1)
{
RI=0;
shakehands=SBUF;
switch(shakehands)
{
case 0x55:
LED_blink1();//收到指定字节就闪LED1
SBUF=0x25; //然后返回0x25
while(TI==0);
TI=0;
break;
default:
LED_blink2();//收到字节,但不是指定字节就闪LED2
break; //每次都闪LED2,所以我判断从机没有
//正确收到主机发送的字节
}
}
}
}
在调试的时候先采用双机通信,发现从机的总是接收不正确。只能接收0x55,例如0x95,0x20这样的
字节就总是出错。由于没有RS485/RS232适配器,所以不能打到PC串口看数据。
我又一块单片机,采用RS232接口和PC通信,采用相同的程序,使用串口调试精灵调试,发现接收和发送
都是正常的,请问这是怎么回事?谢谢
以下是我的源码:
/***********************************************
主机
***********************************************/
void main (void)
{
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
IE =0x90;
TR1 = 1; /* Timer 1 run */
Rx_en=0; /* RS-485 Rx enable,'0'--enable; '1'--disable */
Tx_en=1; /* RS-485 Tx enable,'1'--enable; '0'--disable */
while(1)
{
SBUF=0x55; //只有0x55可以成功被从机接收
while(TI==0);
TI=0;
delay(100);
LED_blink1(); /* If received a byte ,LED1 will blink */
}
}
void serial () interrupt 4 //接收采用中断,发送不使用中断
{
if(RI)
{
char uart_data;
RI=0;
uart_data=SBUF;
switch(uart_data)
{
case 0x25:
LED_blink2();
break;
default:
break;
}
}
}
/***********************************************
从机
***********************************************/
void main (void)
{
char shakehands;
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
ES = 0; /* Disable serial interrupt */
EA = 0; /* Disable global interrupt */
TR1 = 1; /* Timer 1 run */
Rx_en=0;
Tx_en=1; // RS-485 Tx ,'1'--enable; '0'--disable
while(1)
{
if(RI==1)
{
RI=0;
shakehands=SBUF;
switch(shakehands)
{
case 0x55:
LED_blink1();//收到指定字节就闪LED1
SBUF=0x25; //然后返回0x25
while(TI==0);
TI=0;
break;
default:
LED_blink2();//收到字节,但不是指定字节就闪LED2
break; //每次都闪LED2,所以我判断从机没有
//正确收到主机发送的字节
}
}
}
}