485通讯 从机发给主机的报文有时会多一个字节

[复制链接]
 楼主| baoxh90 发表于 2013-2-25 13:57 | 显示全部楼层 |阅读模式
装置发给上位机的报文有时会在正确报文的基础上多个“FF”,软件仿真时发现给出的报文是正确的,没有多余的那个“FF”。不知道这是怎么回事。
flyinginred 发表于 2013-2-25 23:07 | 显示全部楼层
可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据
 楼主| baoxh90 发表于 2013-2-26 12:02 | 显示全部楼层
从仿真看没有多发数据,会不会是硬件给的“FF”?
 楼主| baoxh90 发表于 2013-2-26 12:48 | 显示全部楼层
flyinginred 发表于 2013-2-25 23:07
可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据

会是程序哪儿的问题呢?我一个同事说可能是设置的波特率有偏差,但是我不知道看哪儿啊
flyinginred 发表于 2013-2-26 14:09 | 显示全部楼层
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程序多发了一个字节,就是计算字节数没算对。
 楼主| baoxh90 发表于 2013-2-26 15:07 | 显示全部楼层
flyinginred 发表于 2013-2-26 14:09
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程 ...

程序没有多发,从软件仿真可以看到不多“FF”,冒昧的问一句那个波特率在哪儿算?
yueliangruying 发表于 2013-2-27 15:51 | 显示全部楼层
是在程序头出现吗?初始化把电平拉低
chunyang 发表于 2013-2-27 21:23 | 显示全部楼层
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。
加油吧小鱼儿 发表于 2013-3-8 00:22 | 显示全部楼层
应该程序问题,你应该对应程序查看
 楼主| baoxh90 发表于 2013-3-11 16:49 | 显示全部楼层
yueliangruying 发表于 2013-2-27 15:51
是在程序头出现吗?初始化把电平拉低

是在报文尾出现
 楼主| baoxh90 发表于 2013-3-13 10:36 | 显示全部楼层
chunyang 发表于 2013-2-27 21:23
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

弱弱的问一下这个静态偏置怎么加?:)
 楼主| baoxh90 发表于 2013-3-13 10:38 | 显示全部楼层
chunyang 发表于 2013-2-27 21:23
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

我这个切换后加延时了
 楼主| baoxh90 发表于 2013-3-13 10:40 | 显示全部楼层
我晒一下代码吧  麻烦兄弟们给看看
void RS485_init(void)
{
        rs485_tx_ok=YES;
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);//RTS信号
}

void com485_hnd(void)
{       
        if(rs485_tx_ok==YES)       
        {
                if((USART_GetFlagStatus(USART1, USART_FLAG_RXNE))==SET)
                {       
                        GPIO_ResetBits(GPIOB,GPIO_Pin_5);//RTS信号
                        RxBuffer[USART_MODULE_3][rxcnt1]=USART_ReceiveData(USART1);
                        rxcnt1=(rxcnt1+1) % RxBufferSize;          
                     rx_tm1=0;
             }
        }
        if(((USART_GetFlagStatus(USART1, USART_FLAG_TXE))==SET)&&(tx1_len>0))
        {               
                GPIO_SetBits(GPIOB,GPIO_Pin_5);//RTS信号
                if(rxd_flag==0x55)USART_SendData(USART1, TxBuffer[USART_MODULE_3][txpnt1]);
                txpnt1=(txpnt1+1) % TxBufferSize;
                tx1_len--;
                if (tx1_len==0)
                {
                         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//RTS信号         
                         tx_tm1=TX_TIMEOUT;
                         rs485_tx_ok=0;                 
                 }
     }
        if(tx1_len>0) GPIO_SetBits(GPIOB,GPIO_Pin_12);//通讯灯
        else GPIO_ResetBits(GPIOB,GPIO_Pin_12);       
}
 楼主| baoxh90 发表于 2013-3-13 10:43 | 显示全部楼层
这是5ms里执行的
if (rxcnt1>0){
                        rx_tm1=rx_tm1+5;  ////通讯接收超时时间为80毫秒
                if (rx_tm1>=RX_TIMEOUT) rs485_rx_ok=YES;
            }
            /*检查启动"接收外部数据函数"的条件是否满足*/   
            if (tx_tm1>=5) tx_tm1=tx_tm1-5;
            else rs485_tx_ok=YES;//发送完毕,可以启动接收
 楼主| baoxh90 发表于 2013-3-13 11:43 | 显示全部楼层

目前波特率为1200的时候上位机收到的报文没问题但是4800、9600就不行 后面有时多个FF.
 楼主| baoxh90 发表于 2013-3-14 08:44 | 显示全部楼层
昨天下午看了看确实是延时的问题,发送寄存器里的数据还没发送完的时候就将RTS信号置低了。
dyhalf 发表于 2013-6-4 11:06 | 显示全部楼层
我前天遇到这个问题了、帮我大忙了
vkic007 发表于 2013-6-7 16:41 | 显示全部楼层
呵呵,又来学习一下了
cjzy22 发表于 2013-6-13 10:08 | 显示全部楼层
更换双绞线或者将线的距离变短。
hzieeboy 发表于 2013-6-27 18:57 | 显示全部楼层
假设软件不存在任何问题的前提下,从硬件角度来说,485在通信过程中会存在反射现象,这种反射会引起误码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

20

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部