共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |