485一主多从误码率问题
现在系统是一个主机两个从机,但是从机返回数据总是有误码,大概发4组正确的数据以后,有一组乱码的数据,因为系统很小,应该不是干扰的问题,然后现在也没有加屏蔽电阻。我想问下,20%的乱码率是否正常,是否需要加屏蔽电阻,还是软件方面延时的问题? 不正常,检查一下使能485发送的地方,确保发送完成再取消使能,大部分带硬件串口单片机把要发送的字节放到寄存器后就返回,这时数据还在发送 要么是电路有问题,要么是波特率误差过大。 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: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;//这里预置初始化为接收状态
}
fp123123 发表于 2013-5-14 11:23 static/image/common/back.gif
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...
额,问题找到了,是因为原程序判断是否发送部分的问题,导致同一时间有两台从机处于发送状态,从而产生了乱码,与你说的是否延时无关,我用的单片机是C8051F410的,485芯片是MAX485,程序里面的延时是必须的,如果没有延时的话,什么东西都发不出去。。。 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;//这里预置初始化为接收状态
}
你给我的这段参考代码我之前试过类似的,也是没有延时的,结果根本无法完成通信,一定要加一定时间的延时才可以 fp123123 发表于 2013-5-14 11:23 static/image/common/back.gif
恭喜你,原因找到了,你这样的发送速度太低了,你程序里的delay一个都不需要,查一下单片机串口状态寄存器 ...
STC的51单片机晶振有多少?我用的8051内部晶振24.5MHZ 10M左右的,我的程序里连接120个485从机,不需要延时的,就是这个代码。如果使用标准485接线方式,TI的判断是必须的,否则最后一个字节会发送错误。如果使用简化方式就不用,由硬件完成。我看你的程序里有485使能的代码,应该是标准接法的 路过学习!!! 你的延时等待是不严格的,应该采纳楼上的建议!
页:
[1]