共2条
1/1 1 跳转至页
51,RS485 51机RS485通信问题请教!
问
我采用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,所以我判断从机没有
//正确主机发送的字节
}
}
}
} 答 1: 很可能是485总线冲突了检查是否有多个输出连在同一个总线中了。
这是经常性错误。 答 2: 谢谢回复 我没有完全明白你的意思。
我本是想做多机通信的,现在先用双机调程序。所以总线上只有2个设备啊。 答 3: 是否是485收发切换的时间不够 答 4: to xrb3115 我使用的是MAX491,采用的是全双工485方式,输入和输出是独立的通道,
虽然各有使能,但我一上电把他们都使能了。
我认为既然是全双工,就没有收发切换的问题了吧? 答 5: 输入和输出是独立通道的全双工485方式?直接说422不就得了。你的发送程序或发送电路需要改进,关键的问题是你总在占用总线。
我看你是可以用PC来调试的,动下脑筋吧。 答 6: 我也一直在做这个,能否交流呢是不是延时的时间太少了? delay(100);
答 7: 谢谢楼上的 我起初是用PC调试的,用的就是RS232和PC通信,PC端用串口调试精灵。
RS485是RS422的改进,有2线和4线两种连接方式的。
我使用的是MAX491芯片,Datasheet上说明是应用于full-duplex RS485 network,应该是指全双工RS485网络吧,我也是第一次用这个片子。
后来发现硬件设计时,MAX491的VCC为5V的,但是接成3.3V了(不是俺设计的啊,冤的很),应该是这个问题导致误码的吧! 答 8: 不是你设计的,你就没责任了吗?!为什么不好好检查!哈,说玩乐的啦,别介意。如果早些用示波器看一下波形就不用走弯路了。
RS485和RS422还是看下标准再说吧,在此不做深究了。
MAX某些IC都是按非标设计的,当然有些是超标的啦。 答 9: 呵呵,是啊,说的对 我是对我们的硬件设计的确很放心。没想到出岔子出在VCC上,我闷着脑袋
搞了半天通信协议,都是有问题啊,真是ft了。 答 10: 芯片是全双工,但联网就不是全双工的了起码众多从机的发送都是连接在一起的,从机为了避免总线冲突,必须是先收后发,而且不该自己发的时候不能发,更不能在任意时刻主动发起通信。
这样看,还是全双工吗?当然在一主一从的时候是可以全双工的。
我采用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,所以我判断从机没有
//正确主机发送的字节
}
}
}
} 答 1: 很可能是485总线冲突了检查是否有多个输出连在同一个总线中了。
这是经常性错误。 答 2: 谢谢回复 我没有完全明白你的意思。
我本是想做多机通信的,现在先用双机调程序。所以总线上只有2个设备啊。 答 3: 是否是485收发切换的时间不够 答 4: to xrb3115 我使用的是MAX491,采用的是全双工485方式,输入和输出是独立的通道,
虽然各有使能,但我一上电把他们都使能了。
我认为既然是全双工,就没有收发切换的问题了吧? 答 5: 输入和输出是独立通道的全双工485方式?直接说422不就得了。你的发送程序或发送电路需要改进,关键的问题是你总在占用总线。
我看你是可以用PC来调试的,动下脑筋吧。 答 6: 我也一直在做这个,能否交流呢是不是延时的时间太少了? delay(100);
答 7: 谢谢楼上的 我起初是用PC调试的,用的就是RS232和PC通信,PC端用串口调试精灵。
RS485是RS422的改进,有2线和4线两种连接方式的。
我使用的是MAX491芯片,Datasheet上说明是应用于full-duplex RS485 network,应该是指全双工RS485网络吧,我也是第一次用这个片子。
后来发现硬件设计时,MAX491的VCC为5V的,但是接成3.3V了(不是俺设计的啊,冤的很),应该是这个问题导致误码的吧! 答 8: 不是你设计的,你就没责任了吗?!为什么不好好检查!哈,说玩乐的啦,别介意。如果早些用示波器看一下波形就不用走弯路了。
RS485和RS422还是看下标准再说吧,在此不做深究了。
MAX某些IC都是按非标设计的,当然有些是超标的啦。 答 9: 呵呵,是啊,说的对 我是对我们的硬件设计的确很放心。没想到出岔子出在VCC上,我闷着脑袋
搞了半天通信协议,都是有问题啊,真是ft了。 答 10: 芯片是全双工,但联网就不是全双工的了起码众多从机的发送都是连接在一起的,从机为了避免总线冲突,必须是先收后发,而且不该自己发的时候不能发,更不能在任意时刻主动发起通信。
这样看,还是全双工吗?当然在一主一从的时候是可以全双工的。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |