打印

485一主多从误码率问题

[复制链接]
3840|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gluebi|  楼主 | 2013-5-13 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在系统是一个主机两个从机,但是从机返回数据总是有误码,大概发4组正确的数据以后,有一组乱码的数据,因为系统很小,应该不是干扰的问题,然后现在也没有加屏蔽电阻。
我想问下,20%的乱码率是否正常,是否需要加屏蔽电阻,还是软件方面延时的问题?

相关帖子

沙发
fp123123| | 2013-5-13 12:58 | 只看该作者
不正常,检查一下使能485发送的地方,确保发送完成再取消使能,大部分带硬件串口单片机把要发送的字节放到寄存器后就返回,这时数据还在发送

使用特权

评论回复
板凳
chunyang| | 2013-5-13 20:18 | 只看该作者
要么是电路有问题,要么是波特率误差过大。

使用特权

评论回复
地板
gluebi|  楼主 | 2013-5-14 11:01 | 只看该作者
fp123123 发表于 2013-5-13 12:58
不正常,检查一下使能485发送的地方,确保发送完成再取消使能,大部分带硬件串口单片机把要发送的字节放到 ...

我修改了下程序之后确实如你所说,单片机把要发送的字节放到寄存器就返回了
这段的代码如下:       
                        checkCOMM();
                        COMM=1; //控制发送方向的端口,1为发送,0为接收
                        for (i=0; i<sendCount; i++)
                        {
                                delay(1600);
                                SBUF0=sendBuf;                                 
                        }
                        delay(1600);//如果不加上这里的延时,N位报文的前N-1个字节可以完整无误的发送,就是到了最后一个字节无法发送,增加了这个延时后,就会出现乱码,有的时候发对有的时候发错
                        sendCount=0;
                        receCount = 0;
                }
                COMM=0;//这里预置初始化为接收状态
                delay(1600);

使用特权

评论回复
5
fp123123| | 2013-5-14 11:23 | 只看该作者
本帖最后由 fp123123 于 2013-5-14 11:32 编辑

恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器的说明,有一个位是表示SBUF0里面的数据已经发送完成的,你只要把delay改为一个等待循环:while(!发送完);就可以了

如果是用STC的51,参考下面的代码

void UART_Send(unsigned char *sendBuf, unsigned char sendCount)
{
  COMM = 1; //控制发送方向的端口,1为发送,0为接收
  for(unsigned char c=0; c<sendCount; c++)
  {
    TI = 0;
    SBUF = sendBuf[c];
    while(TI==0); // 等待发送完成
  }
  TI = 0;  
  COMM = 0;//这里预置初始化为接收状态
}

使用特权

评论回复
6
gluebi|  楼主 | 2013-5-14 12:23 | 只看该作者
fp123123 发表于 2013-5-14 11:23
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...

额,问题找到了,是因为原程序判断是否发送部分的问题,导致同一时间有两台从机处于发送状态,从而产生了乱码,与你说的是否延时无关,我用的单片机是C8051F410的,485芯片是MAX485,程序里面的延时是必须的,如果没有延时的话,什么东西都发不出去。。。

使用特权

评论回复
7
gluebi|  楼主 | 2013-5-14 12:24 | 只看该作者
fp123123 发表于 2013-5-14 11:23
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...

void UART_Send(unsigned char *sendBuf, unsigned char sendCount)
{
  COMM = 1; //控制发送方向的端口,1为发送,0为接收
  for(unsigned char c=0; c<sendCount; c++)
  {
    TI = 0;
    SBUF = sendBuf[c];
    while(TI==0); // 等待发送完成
  }
  TI = 0;  
  COMM = 0;//这里预置初始化为接收状态
}

你给我的这段参考代码我之前试过类似的,也是没有延时的,结果根本无法完成通信,一定要加一定时间的延时才可以

使用特权

评论回复
8
gluebi|  楼主 | 2013-5-14 12:29 | 只看该作者
fp123123 发表于 2013-5-14 11:23
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...

STC的51单片机晶振有多少?我用的8051内部晶振24.5MHZ

使用特权

评论回复
9
fp123123| | 2013-5-14 14:10 | 只看该作者
10M左右的,我的程序里连接120个485从机,不需要延时的,就是这个代码。如果使用标准485接线方式,TI的判断是必须的,否则最后一个字节会发送错误。如果使用简化方式就不用,由硬件完成。我看你的程序里有485使能的代码,应该是标准接法的

使用特权

评论回复
10
hjhand| | 2013-5-17 15:22 | 只看该作者
路过学习!!!

使用特权

评论回复
11
laixuel| | 2013-5-26 17:32 | 只看该作者
你的延时等待是不严格的,应该采纳楼上的建议!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

39

帖子

1

粉丝