485通讯 从机发给主机的报文有时会多一个字节
装置发给上位机的报文有时会在正确报文的基础上多个“FF”,软件仿真时发现给出的报文是正确的,没有多余的那个“FF”。不知道这是怎么回事。 可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据 从仿真看没有多发数据,会不会是硬件给的“FF”? flyinginred 发表于 2013-2-25 23:07 static/image/common/back.gif可能是一个帧错误 也有可能是程序问题,多发了一个字节的数据
会是程序哪儿的问题呢?我一个同事说可能是设置的波特率有偏差,但是我不知道看哪儿啊 波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程序多发了一个字节,就是计算字节数没算对。 flyinginred 发表于 2013-2-26 14:09 static/image/common/back.gif
波特率 可以计算 看看误差在多少?
你可以使用示波器,测试是否真的发出一个FF
比较怀疑,你发送的时候,程 ...
程序没有多发,从软件仿真可以看到不多“FF”,冒昧的问一句那个波特率在哪儿算? 是在程序头出现吗?初始化把电平拉低 多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 应该程序问题,你应该对应程序查看 yueliangruying 发表于 2013-2-27 15:51 static/image/common/back.gif
是在程序头出现吗?初始化把电平拉低
是在报文尾出现 chunyang 发表于 2013-2-27 21:23 static/image/common/back.gif
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...
弱弱的问一下这个静态偏置怎么加?:) chunyang 发表于 2013-2-27 21:23 static/image/common/back.gif
多半是程序问题,注意要在收发切换后加点适当延时,总线如果存在浮空态则应加静态偏置。 ...
我这个切换后加延时了 我晒一下代码吧麻烦兄弟们给看看
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);
} 这是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;//发送完毕,可以启动接收
目前波特率为1200的时候上位机收到的报文没问题但是4800、9600就不行 后面有时多个FF. 昨天下午看了看确实是延时的问题,发送寄存器里的数据还没发送完的时候就将RTS信号置低了。 我前天遇到这个问题了、帮我大忙了 呵呵,又来学习一下了 更换双绞线或者将线的距离变短。 假设软件不存在任何问题的前提下,从硬件角度来说,485在通信过程中会存在反射现象,这种反射会引起误码。
页:
[1]