485通讯误码率高

xmrforever 2012-10-11 01:41:20
两块板子双工通讯,波特率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;
}
...全文
841 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wleide823 2012-11-05
  • 打赏
  • 举报
回复
1、你的硬件晶振实际分频频率算出来和9600bps相差多少,尽量让晶振分频后与9600接近。 2、必须要监控数据,你都不知道输入、输出那里出了问题怎么排查。 3、485数据的通信电平是否符合数据格式。 4、还有就是你的设备固定发一个帧,看会不会出错,要保证一方数据没有问题。
cyymycc 2012-10-23
  • 打赏
  • 举报
回复
应该是

Tx_485_on;//变为发送状态

UDR1 = data; //数据放入缓存器,开始发送

while ( !( UCSR1A & (1<<UDRE1))) //等待数据寄存器为空
;
//发送完毕
Rx_485_on;//变为接受状态
xmrforever 2012-10-17
  • 打赏
  • 举报
回复
这是发送的函数啊
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:
C/C++ code

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



数据时按照你设定的波特率发送的,你在接收的地方加了……
[/Quote]
dsoyy 2012-10-17
  • 打赏
  • 举报
回复
利用超级终端,分别测试接收和发送
xmrforever 2012-10-15
  • 打赏
  • 举报
回复
应该没那么慢,我按照您说的在UDR1=data;后面加了一个20ms的延迟,问题依旧
关键是我现在看不到发送的数据,不知道是发送的问题还是接收的问题
是不是需要买一个485转232的数据线?
[Quote=引用 6 楼 的回复:]
首先你的代码有点问题,这里

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

你只是把数据给了串口就把485芯片置成收了,数据不一定能发送完。应该在发送数据完成后延时一会再置收。
[/Quote]
xmrforever 2012-10-15
  • 打赏
  • 举报
回复
距离很短,大概30厘米,用两根线缠成双绞线的形式连接的[Quote=引用 4 楼 的回复:]
终端加负载电阻没有?,距离多长? , 用双绞屏蔽线没有? 有干扰源没有?
[/Quote]
dsoyy 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
C/C++ code

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


数据时按照你设定的波特率发送的,你在接收的地方加了延时,相当于收到一个bit等一会,再接收另一个,能不丢数据吗
xmrforever 2012-10-15
  • 打赏
  • 举报
回复
void USART1_Transmit(uchar data)
{
Tx_485_on;
//等待数据寄存器为空
while ( !( UCSR1A & (1<<UDRE1)))
;
//数据放入缓存器
UDR1 = data;
Rx_485_on;
}
把UDR1=DATA;后面的延迟去掉就正常了,请问大神们这是何因啊?[Quote=引用 9 楼 的回复:]
平时我门控制 3位数码管, 那有什么协意, 照样可以通讯,
如果UART协意最终不可行就当 3位数码管处理就可以了,

void USART1_Transmit(uchar data)
{

UDR1 = data;
while ( !( UCSR1A & (1<<UDRE1)));

}
[/Quote]
falloutmx 2012-10-12
  • 打赏
  • 举报
回复
最直观的就是量示波器
wongtaixin 2012-10-12
  • 打赏
  • 举报
回复
平时我门控制 3位数码管, 那有什么协意, 照样可以通讯,
如果UART协意最终不可行就当 3位数码管处理就可以了,

void USART1_Transmit(uchar data)
{

UDR1 = data;
while ( !( UCSR1A & (1<<UDRE1)));

}
dsoyy 2012-10-12
  • 打赏
  • 举报
回复
距离多远?环境如何?
youzi722 2012-10-11
  • 打赏
  • 举报
回复
首先你的代码有点问题,这里

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

你只是把数据给了串口就把485芯片置成收了,数据不一定能发送完。应该在发送数据完成后延时一会再置收。
aydf1 2012-10-11
  • 打赏
  • 举报
回复
终端加负载电阻没有?,距离多长? , 用双绞屏蔽线没有? 有干扰源没有?
vc8fans 2012-10-11
  • 打赏
  • 举报
回复
终端加负载电阻没有?,距离多长? , 用双绞屏蔽线没有? 有干扰源没有?
xmrforever 2012-10-11
  • 打赏
  • 举报
回复
但是现在单工通讯的时候也会误码
vc8fans 2012-10-11
  • 打赏
  • 举报
回复
所谓的双工, 是应答方式实现的
zhou_id 2012-10-11
  • 打赏
  • 举报
回复
485 通信 好像只能做 单工的,不能做成双工.

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧