baoxh90 发表于 2013-2-25 13:57

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

装置发给上位机的报文有时会在正确报文的基础上多个“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 static/image/common/back.gif
可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据

会是程序哪儿的问题呢?我一个同事说可能是设置的波特率有偏差,但是我不知道看哪儿啊

flyinginred 发表于 2013-2-26 14:09

波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程序多发了一个字节,就是计算字节数没算对。

baoxh90 发表于 2013-2-26 15:07

flyinginred 发表于 2013-2-26 14:09 static/image/common/back.gif
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个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 static/image/common/back.gif
是在程序头出现吗?初始化把电平拉低

是在报文尾出现

baoxh90 发表于 2013-3-13 10:36

chunyang 发表于 2013-2-27 21:23 static/image/common/back.gif
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

弱弱的问一下这个静态偏置怎么加?:)

baoxh90 发表于 2013-3-13 10:38

chunyang 发表于 2013-2-27 21:23 static/image/common/back.gif
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

我这个切换后加延时了

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_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);
                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在通信过程中会存在反射现象,这种反射会引起误码。
页: [1]
查看完整版本: 485通讯 从机发给主机的报文有时会多一个字节