打印

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

[复制链接]
3297|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baoxh90|  楼主 | 2013-2-25 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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
可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据

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

使用特权

评论回复
5
flyinginred| | 2013-2-26 14:09 | 只看该作者
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程序多发了一个字节,就是计算字节数没算对。

使用特权

评论回复
6
baoxh90|  楼主 | 2013-2-26 15:07 | 只看该作者
flyinginred 发表于 2013-2-26 14:09
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程 ...

程序没有多发,从软件仿真可以看到不多“FF”,冒昧的问一句那个波特率在哪儿算?

使用特权

评论回复
7
yueliangruying| | 2013-2-27 15:51 | 只看该作者
是在程序头出现吗?初始化把电平拉低

使用特权

评论回复
8
chunyang| | 2013-2-27 21:23 | 只看该作者
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。

使用特权

评论回复
9
加油吧小鱼儿| | 2013-3-8 00:22 | 只看该作者
应该程序问题,你应该对应程序查看

使用特权

评论回复
10
baoxh90|  楼主 | 2013-3-11 16:49 | 只看该作者
yueliangruying 发表于 2013-2-27 15:51
是在程序头出现吗?初始化把电平拉低

是在报文尾出现

使用特权

评论回复
11
baoxh90|  楼主 | 2013-3-13 10:36 | 只看该作者
chunyang 发表于 2013-2-27 21:23
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

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

使用特权

评论回复
12
baoxh90|  楼主 | 2013-3-13 10:38 | 只看该作者
chunyang 发表于 2013-2-27 21:23
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...

我这个切换后加延时了

使用特权

评论回复
13
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);       
}

使用特权

评论回复
14
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;//发送完毕,可以启动接收

使用特权

评论回复
15
baoxh90|  楼主 | 2013-3-13 11:43 | 只看该作者

目前波特率为1200的时候上位机收到的报文没问题但是4800、9600就不行 后面有时多个FF.

使用特权

评论回复
16
baoxh90|  楼主 | 2013-3-14 08:44 | 只看该作者
昨天下午看了看确实是延时的问题,发送寄存器里的数据还没发送完的时候就将RTS信号置低了。

使用特权

评论回复
17
dyhalf| | 2013-6-4 11:06 | 只看该作者
我前天遇到这个问题了、帮我大忙了

使用特权

评论回复
18
vkic007| | 2013-6-7 16:41 | 只看该作者
呵呵,又来学习一下了

使用特权

评论回复
19
cjzy22| | 2013-6-13 10:08 | 只看该作者
更换双绞线或者将线的距离变短。

使用特权

评论回复
20
hzieeboy| | 2013-6-27 18:57 | 只看该作者
假设软件不存在任何问题的前提下,从硬件角度来说,485在通信过程中会存在反射现象,这种反射会引起误码。

使用特权

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

本版积分规则

3

主题

20

帖子

1

粉丝