这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 51,RS485 51机RS485通信问题请教!

共2条 1/1 1 跳转至

51,RS485 51机RS485通信问题请教!

院士
2006-09-17 18:14:16     打赏
51,RS485 51机RS485通信问题请教!



关键词: RS485     通信     问题     请教    

院士
2006-12-22 22:43:00     打赏
2楼

   我采用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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]