7173|9

90

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

avr通过rs485接收的串口数据错码怎么解决?高手来看下。 [复制链接]

用串口调试软件发数据给单片机,单片机再把收到的数据发出去,用串口调试软件查看单片机发送的数据.

结果发现串口调试软件接收到的数据很多和发出去的不一样,搞不清楚是怎么回事了,懂的人指导一下。

波特率1200,无校验,数据位8,停止位1 。


// Target : M16
// Crystal: 8.0000Mhz
//AVR单片机atmega16串口中断接收和发送程序。接收到字符后再发送出去
#include
#include
unsigned char com_in_buf[1];
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0xFF;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0xFF;
DDRD  = 0xFF;
}

//UART0 initialize  
// desired baud rate: 9600  
// actual: baud rate:9615 (0.2%)  
// char size: 8 bit  
// parity: Disabled  
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0xF9; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}

void send_data(unsigned char back)
{
  while( !( UCSRA & (1<   UDR=back;
}

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
com_in_buf[0]=UDR;
send_data(com_in_buf[0]);
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
  char j;
  init_devices();
  while(1)
  {
    for(j=1;j<100;j++)
  ;
  }
}

最新回复

已解决,是usb转串口的问题,换了个串口就好了,感谢大家的回复,分不多,别见怪。  详情 回复 发表于 2009-12-3 09:40
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你贴程序没人帮你看,需要你自己调试,我可以告诉你方法
1、你先确认你的单片机串口是否有问题,看看232模式下发送和接收的数据是否一致
2、如果一致就说明是你485电路的问题,
3、如果不一致那你就好好看看你的串口程序吧
按照我的经验多数问题会出在485电路上
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢,我正找485的原因呢。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
刚大概看了程序,没用过这个单片机,一些寄存器意义都搞不懂。
先仿真一下,看单片机收到的数据是否正确;
建议注意一下:
1.485是半双工的,收发方向要改变;
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
我现在用的功能是只收不发,所以把接收的使能端接地了,这样没问题吧。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有问题,单向的,另外确保你的测试设备也没有问题,祝好运
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 ll_211314 的回复:
我现在用的功能是只收不发,所以把接收的使能端接地了,这样没问题吧。


这个没问题。
仿真一下看看。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
1
程序里面波特率设置是9600,你表述的却是1200?
2
while( !( UCSRA & (1 < 这两个"<"号中间是没有空格的
3
“我现在用的功能是只收不发,所以把接收的使能端接地了,这样没问题吧。”
是否是这样连接的:PC串口 -> RS485 -> M16Receive ->M16Translate -> RS232 -> PC串口
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 lin0119 的回复:
1
程序里面波特率设置是9600,你表述的却是1200?
2
while( !( UCSRA & (1 < 这两个" <"号中间是没有空格的
3
“我现在用的功能是只收不发,所以把接收的使能端接地了,这样没问题吧。”
是否是这样连接的:PC串口 -> RS485 -> M16Receive ->M16Translate -> RS232 -> PC串口

前两条同意!
第3条,如果你是只收不发,你怎么知道“串口调试软件接收到的数据很多和发出去的不一样”???
请确认好问题,表述清楚!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
已解决,是usb转串口的问题,换了个串口就好了,感谢大家的回复,分不多,别见怪。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表