gluebi 发表于 2013-5-13 09:24

485一主多从误码率问题

现在系统是一个主机两个从机,但是从机返回数据总是有误码,大概发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 static/image/common/back.gif
不正常,检查一下使能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);

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;
    while(TI==0); // 等待发送完成
}
TI = 0;
COMM = 0;//这里预置初始化为接收状态
}

gluebi 发表于 2013-5-14 12:23

fp123123 发表于 2013-5-14 11:23 static/image/common/back.gif
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...

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

gluebi 发表于 2013-5-14 12:24

fp123123 发表于 2013-5-14 11:23 static/image/common/back.gif
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的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;
    while(TI==0); // 等待发送完成
}
TI = 0;
COMM = 0;//这里预置初始化为接收状态
}

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

gluebi 发表于 2013-5-14 12:29

fp123123 发表于 2013-5-14 11:23 static/image/common/back.gif
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...

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

fp123123 发表于 2013-5-14 14:10

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

hjhand 发表于 2013-5-17 15:22

路过学习!!!

laixuel 发表于 2013-5-26 17:32

你的延时等待是不严格的,应该采纳楼上的建议!
页: [1]
查看完整版本: 485一主多从误码率问题