whj19860123 发表于 2009-10-27 13:29:55

RS485通信遇到怪现象

在调试RS485通讯时,单片机向计算机串口软件发送 0x99 ,但是串口软件上收到并显示的却是0x99,0x00;如果连续发送多位数据,串口软件接收到的数据总是多一字节(0x00),,哪位高手指导下啊。我使用的单片机是恩智普的51增强型系列里的P89LPC936

whj19860123 发表于 2009-10-27 13:36:18

接收正常,发送总是多发送了一个0x00

heky 发表于 2009-10-27 13:39:14

发送脚没有拉高,示波器检查检查

whj19860123 发表于 2009-10-27 13:50:32

发送脚TXD是高电平,还有其它什么原因没有

miraclelife 发表于 2009-10-27 14:02:40

AB两条线的上下拉电阻没有加上吧

tidsp 发表于 2009-10-27 14:03:00

估计是发送中断处理问题

whj19860123 发表于 2009-10-27 14:20:40

#include"RS485.h"
/////////////////////管脚定义及常数定义
sbit uart_txd=P1^0;
sbit uart_rxd=P1^1;
sbit uart_485=P0^7;//确定485通信三个引脚
extern void uart_485_init(void); //485初始化函数

#include"RS485.h"
extern unsigned char address,BRG;//定义从机地址以及波特率
void uart_485_init(void)   //485初始化函数
{
        P1M1&=0xFC;
        P1M2&=0xFC;//P1.0 、P1.1设为通用准双向I/O
        P0M1&=0x7F;
        P0M2&=0x7F;//P0.7 设为通用准双向I/O
//        uart_txd=1;
//        uart_rxd=1;//停止位为1,即总线空闲时为高电平
        uart_485=0;//接口默认状态为允许接收

        SSTAT=0x60;//CIDIS=1;RX与TX中断各自独立
        SCON=0x50;//设置为模式1 ,使能串口接收


        BRGCON=0x00;//写入波特率发生器时,BRGEN一定要等于0
        BRGR1=0x04;
        BRGR0=0x70;//默认状态为9600;
        BRGCON=0x03;//设置波特率CCLK/((BRGR1,BRGR0)+16)

        //SADDR=0x01;
        //SADEN=0xFF;//装从机地址,//将数据与校准值一起保存在EEPROM中
        EA=1;//开总中断
        ES=1;//开串口接收中断
        //REN=1;
}


void main (void)
{
unsigned char i=0,max,min;       

      uart_485_init();
           IT1=1;
        EX1=1;        //开外中断
                led4dat=tab;//**********************LED显示
                  led0dat=tab;
                  led1dat=tab;
                  led2dat=tab;
                  led3dat=tab;
                        CH452_Write(CH452_SYSON2)      ;   
              CH452_Write(CH452_NO_BCD)      ;
                        CH452_Write(CH452_TWINKLE |0 );
                CH452_Write(CH452_DIG4 |led4dat );       
                CH452_Write(CH452_DIG0 |led0dat );          
              CH452_Write(CH452_DIG1 |led1dat );       
                CH452_Write(CH452_DIG2 |led2dat );          
                CH452_Write(CH452_DIG3 |led3dat );         //**********************LED显示
                while(1) ;

               
}

void rs485_receiver        (void)        interrupt 4// 串口接收中断
{
                       
                     rs=SBUF;        接收
                  led4dat=tab;//***************************************
                          led0dat=tab;
                        led1dat=tab;
                        led2dat=tab[(rs/10)%10];
                        led3dat=tab;
                        CH452_Write(CH452_SYSON2)      ;//这部分是在数码管上显示出来   
              CH452_Write(CH452_NO_BCD)      ;
                CH452_Write(CH452_DIG4 |led4dat );       
                CH452_Write(CH452_DIG0 |led0dat );          
              CH452_Write(CH452_DIG1 |led1dat );       
                CH452_Write(CH452_DIG2 |led2dat );          
                CH452_Write(CH452_DIG3 |led3dat ); //****************************
                          RI=0                        ;//清中断标志
               
}

void key (void) interrupt 2   //用按键中断(串口发送程序)发送数据到计算机,
{                     
                  uart_485=1;//允许发送
              SBUF= 0xC4;
                  TI=0                        ;       
              while(!TI)    ;
               uart_txd=1;
               uart_rxd=1;//停止位为1,即总线空闲时为高电平
             uart_485=0;//接口默认状态为允许接收
}

whj19860123 发表于 2009-10-27 14:24:35

以上是程序,发现每次复位,串口软件业总收到一字节(0x00)

whj19860123 发表于 2009-10-27 15:10:08

怎么没有人回答啊

mickeyye 发表于 2009-10-27 15:34:57

上电初始化时TXD有没有保持高电平?

whj19860123 发表于 2009-10-27 16:15:19

有啊,哪位大侠帮帮忙,分析下

cl716 发表于 2009-10-30 10:57:50

你也在做485吗?我最近在做485通信模块 原理图和PCB已画好 望指教 还有需要完善的地方吗?
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_497569.jpg
(原文件名:485.jpg)

thxl_kis 发表于 2009-10-30 13:34:27

单片机的RX,TX看是否还接到其它的电路上

haolaishi 发表于 2011-8-30 10:49:08

MARK

lichking 发表于 2011-8-30 11:14:50

把12M 换成11.0592 在修正波特率看看

xue2003265029 发表于 2011-10-22 21:57:48

回复【10楼】whj19860123
-----------------------------------------------------------------------
(1)光耦的发光二极管导通压降一般在1.2V左右,而导通电流也在7mA-10mA左右。
如果VCC为5V的话,本人经常将接光耦1脚的电阻的阻值为定470欧姆左右;接光耦4脚的电阻的阻值设为4.7K(或10K)。一直用着没有问题。像这样完全的情况完全可以用PC410替代。

(2)U5光耦的接法,感觉有点问题,当P1.0为低电平时,REDE的电平无法确定(跟流过发光二极管电流以及光耦的电流传输系数比有关)楼主这种接法估计是想达到REDE与P1.0反相的效果。其实不需要反相,P1.0和REDE(接485芯片的2、3脚)可以同相,这样P1.0=1时,表明485芯片发送,反之,表明485芯片接收。

(3)485芯片的A、B输出要加TVS管以及GDT管,防雷或防静电。

(4)在复位电路的电阻R2并联一个IN1418。

就这些了,图看不清,也不知道这电路也是干啥的。原理图对了,还得看PCB布局布线呢。

woshixiaozhou 发表于 2013-5-13 13:36:13

我也遇到了这种情况,我把匹配电阻去掉就好使了,但是不知道是什么原因……

zwg0106 发表于 2013-5-13 14:36:49

Mark 学习

tianyaxtutianya 发表于 2013-5-18 15:53:18

你这是多了个一个数据,我的是出现了丢数据的现象,也不知道怎么搞的,明明发送了5个数据,接收的时候只有三个数据被收到了

yuxuefly 发表于 2013-8-13 14:06:48

楼主这个问题解决没呀,求赐教!

luoshanmao 发表于 2013-8-13 14:57:44

A上拉,B下拉了吗?

popo_new 发表于 2013-8-13 16:07:10

我也碰到过,每次发完,加一个1~2m秒的延时,再转入到接收模式

firstzys 发表于 2013-9-14 10:16:27

出现过这个问题,换了根485转USB的线就好了,可能是硬件上的问题
页: [1]
查看完整版本: RS485通信遇到怪现象