当前位置: 代码迷 >> 单片机 >> 485通信误码率高
  详细解决方案

485通信误码率高

热度:93   发布时间:2016-04-28 15:42:09.0
485通讯误码率高
两块板子双工通讯,波特率9600,现在看不出来是发送的问题还是接收的问题,但两块板子通讯的时候总是出现传输错误,不知是什么问题,还请大神们指教,附代码
//UART1 initialize
// desired baud rate:9600
// actual baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart1_init(void)
{
 UCSR1B = 0x00; //disable while setting baud rate
 UCSR1A = 0x00;
 UCSR1C = 0x06;
 UBRR1L = 0x33; //set baud rate lo
 UBRR1H = 0x00; //set baud rate hi
 UCSR1B = 0x98;
 Rx_485_on;
}

#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
 //uart has received a character in UDR
 Usart1_RX_Buff = UDR1 ;
 if (Usart1_RX_Buff=='1')
 {
Usart0_num = (Usart0_num + 1)%2;
if(Usart0_num==1)
{
    Led_on;
}
else
{
  Led_off;
}
 }
}

void USART1_Transmit(uchar data)
{
  //UCSR1B = 0x90;
  Tx_485_on;
delay(20);
//UCSR1B = 0x98;
  //等待数据寄存器为空
    while ( !( UCSR1A & (1<<UDRE1))) 
   ; 
  //数据放入缓存器                     
    UDR1 = data;
//UCSR1B = 0x88;
Rx_485_on;
delay(20);
//UCSR1B = 0x98;
}

------最佳解决方案--------------------
引用:
C/C++ code

void USART1_Transmit(uchar data)
{
    Tx_485_on;
    //等待数据寄存器为空
    while ( !( UCSR1A &amp; (1<<UDRE1))) 
      ; 
    //数据放入缓存器                     
    UDR1 = data;
    Rx_48……



数据时按照你设定的波特率发送的,你在接收的地方加了延时,相当于收到一个bit等一会,再接收另一个,能不丢数据吗
------其他解决方案--------------------
485 通信 好像只能做 单工的,不能做成双工.

------其他解决方案--------------------
所谓的双工, 是应答方式实现的
------其他解决方案--------------------
但是现在单工通讯的时候也会误码
------其他解决方案--------------------
终端加负载电阻没有?,距离多长? , 用双绞屏蔽线没有? 有干扰源没有?
------其他解决方案--------------------
终端加负载电阻没有?,距离多长? , 用双绞屏蔽线没有? 有干扰源没有?
------其他解决方案--------------------
首先你的代码有点问题,这里

  //数据放入缓存器                     
    UDR1 = data;
    //UCSR1B = 0x88;
    Rx_485_on;

你只是把数据给了串口就把485芯片置成收了,数据不一定能发送完。应该在发送数据完成后延时一会再置收。

------其他解决方案--------------------
最直观的就是量示波器
  相关解决方案