搜索
bottom↓
回复: 22

RS485通信遇到怪现象

[复制链接]

出0入0汤圆

发表于 2009-10-27 13:29:55 | 显示全部楼层 |阅读模式
在调试RS485通讯时,单片机向计算机串口软件发送 0x99 ,但是串口软件上收到并显示的却是0x99,0x00;如果连续发送多位数据,串口软件接收到的数据总是多一字节(0x00),,哪位高手指导下啊。我使用的单片机是恩智普的51增强型系列里的P89LPC936

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-10-27 13:36:18 | 显示全部楼层
接收正常,发送总是多发送了一个0x00

出0入0汤圆

发表于 2009-10-27 13:39:14 | 显示全部楼层
发送脚没有拉高,示波器检查检查

出0入0汤圆

 楼主| 发表于 2009-10-27 13:50:32 | 显示全部楼层
发送脚TXD是高电平,还有其它什么原因没有

出0入0汤圆

发表于 2009-10-27 14:02:40 | 显示全部楼层
AB两条线的上下拉电阻没有加上吧

出0入0汤圆

发表于 2009-10-27 14:03:00 | 显示全部楼层
估计是发送中断处理问题

出0入0汤圆

 楼主| 发表于 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[1];//**********************LED显示
                    led0dat=tab[0];
                    led1dat=tab[0];
                    led2dat=tab[0];
                    led3dat=tab[1];
                        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[0];//***************************************
                          led0dat=tab[0];
                        led1dat=tab[rs/100];
                        led2dat=tab[(rs/10)%10];
                        led3dat=tab[rs%10];
                        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;//接口默认状态为允许接收
}

出0入0汤圆

 楼主| 发表于 2009-10-27 14:24:35 | 显示全部楼层
以上是程序,发现每次复位,串口软件业总收到一字节(0x00)

出0入0汤圆

 楼主| 发表于 2009-10-27 15:10:08 | 显示全部楼层
怎么没有人回答啊

出0入0汤圆

发表于 2009-10-27 15:34:57 | 显示全部楼层
上电初始化时TXD有没有保持高电平?

出0入0汤圆

 楼主| 发表于 2009-10-27 16:15:19 | 显示全部楼层
有啊,哪位大侠帮帮忙,分析下

出0入0汤圆

发表于 2009-10-30 10:57:50 | 显示全部楼层
你也在做485吗?我最近在做485通信模块 原理图和PCB已画好 望指教 还有需要完善的地方吗?

(原文件名:485.jpg)

出0入0汤圆

发表于 2009-10-30 13:34:27 | 显示全部楼层
单片机的RX,TX看是否还接到其它的电路上

出0入0汤圆

发表于 2011-8-30 10:49:08 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-30 11:14:50 | 显示全部楼层
把12M 换成11.0592 在修正波特率看看

出0入0汤圆

发表于 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布局布线呢。

出0入0汤圆

发表于 2013-5-13 13:36:13 | 显示全部楼层
我也遇到了这种情况,我把匹配电阻去掉就好使了,但是不知道是什么原因……

出0入0汤圆

发表于 2013-5-13 14:36:49 | 显示全部楼层
Mark 学习

出0入0汤圆

发表于 2013-5-18 15:53:18 | 显示全部楼层
你这是多了个一个数据,我的是出现了丢数据的现象,也不知道怎么搞的,明明发送了5个数据,接收的时候只有三个数据被收到了

出0入0汤圆

发表于 2013-8-13 14:06:48 | 显示全部楼层
楼主  这个问题解决没呀,求赐教!

出0入0汤圆

发表于 2013-8-13 14:57:44 来自手机 | 显示全部楼层
A上拉,B下拉了吗?

出0入0汤圆

发表于 2013-8-13 16:07:10 | 显示全部楼层
我也碰到过,每次发完,加一个1~2m秒的延时,再转入到接收模式

出0入0汤圆

发表于 2013-9-14 10:16:27 | 显示全部楼层
出现过这个问题,换了根485转USB的线就好了,可能是硬件上的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表