搜索
bottom↓
回复: 70

串行口搞了一周,终于搞定,发贴庆贺。

[复制链接]

出0入0汤圆

发表于 2005-11-17 15:24:19 | 显示全部楼层 |阅读模式
才入门AVR单片机,串行口搞了一周才搞定,可能是问题很菜,以前问问题没人回帖,搞的很郁闷。

现在搞定了,希望和我一样挣扎在入门级的同胞们可以借鉴些东西,少走些弯路。

     以下是我的教训总结,愿与大家分享,见笑~:

      串口调试了四五天了,今天下午终于找到毛病了,虽然费了不少劲,内心还是很高兴,对调试增强了信心,在原理上可以的东西肯定可以实现,如果结果不对的话,肯定是存在问题,应该仔细检查。我开始怀疑软件的问题,后来试了好多,结果还是一点反应都没有,后来逐渐怀疑是硬件的问题,max3232的外围电路很简单,就是5个电容,可以是0.1uf也可以是1uf,而且对于v+(2脚)的电容可以接地也可以接电源,现在我的两个板子就不同。开始以为是外围电容的问题,就换来换去,把焊盘都搞动了。后来就不敢轻易动了,这一点也恰恰加速了我发现问题的所在。我原来有个板子串口是好的,我就把max232所有管脚电平波形都测了,和我现在的对比,发现数据线波形差不多,其他管脚波形不太一样。

     昨天下午搞了一下午,一点进展都没有,后来把同学(牛人)叫来测试了一番,波形都对,所以也没有找出问题所在。不过我的确发现和她的差距所在,她做事的方法很好。感谢。

     晚上搞一晚上,今天上午搞一上午都没有找出问题,今天下午和我原来的板子对比,我把我的232出来的管脚引到好的串口输出管脚那里,结果发现串口调试工具接收到东西了,所以确定我的232没有问题,接下来就找串口的毛病了,换了个新的结果和原来一样,这使我想起看看硬件连接,看pcb图时发现我的和以前那个板子串口封装引脚顺序不一样,我终于找到问题所在了,原来如此!通过引线,测试,焊接,再测试,一切正常。

    通过此事,我总结了调试应该遵循以下步骤,而不能想起什么就测什么,这样 一步步排除问题所在,如果有以前可以对比参考的板子,对比一下各参数是否一样,再寻找原因,比较容易发现问题所在:

(1)对封装,查硬件连接:我一开始也是从硬件着手查起,但没有对封装检查,因为有好多元件名称相同封装却不同,有的封装名称一样,但是管脚顺序不一样,7805就是这样搞反了。其次查硬件连接问题,确定其外围器件连接正确。

(2)不可轻易将元件换来换去,可能你的元件取值与一些参考资料不同,但你的未必是错的。

  (3)最后检查程序是否正确,可以多试几个程序,再配合示波器观察有没有输出。

  (4)现在想想自己当时画电路图实在是草率了点,借鉴人家的电路要明其理,不然调试时会很费劲,哪里出了问题自己都不清楚,那可就惨了。

   (5) ok,终于搞定。

        自己的串口调试程序:(mega128l,IAR编译器)

#ifndef _uart_com1_h_

#define _uart_com1_h_





void Usart0_init(void) ; //设置波特率9.6k,8位数据位,无校验,接收发送使能,1位停止位

void Usart0_transmit(unsigned char c);

unsigned char Usart0_receive(void);

#endif

//以上是uart_init.h 头文件



#include "iom128.h"

#include "uart_init.h"



void Usart0_init(void)  //7.3728Mhz频率,设置波特率9.6k,8位数据位,无校验,接收发送使能,1位停止位

{

  //UCR0=0x00;  //设置波特率之前先关闭串口

  UBRR0H=0;

  UBRR0L=47;

  UCSR0B=(1<<RXEN0)|(1<<TXEN0);  //发送接收使能,使用查询方式,故没有使能中断

  UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);  //0x06 8位数据,1位停止位,无校验

}



void Usart0_transmit(unsigned char c)  //查询方式发送接收字符函数

{

  while( !(UCSR0A&(1<<UDRE0)));//等待发送缓冲区为空

  UDR0=c;

  //while(!(UCSR0A&(!<<TXC0)));

  // UDCR0=c;

  // SET_BIT(UCSR0A,TXC0); //将发送结束标志位清零

  }



  unsigned char Usart0_receive( void)

  {

  while (!(UCSR0A&(1<<RXC0))) ;

   return UDR0;

   }



//以上是串口发送接收函数



主函数如下:

#include "stdio.h"

#include "iom128.h"

#include "avr_macros.h"

#include "ina90.h"

#include "pgmspace.h"

#include "uart_init.h"





int  main(void)

{

DDRE=0xFF;

PORTE=0xFF; //驱动二级管

   unsigned int temp;

   Usart0_init();



  while(1)

{

  Usart0_transmit('U');

  for(temp=0;temp<30000;temp++)

  {

  }



   }

  //return 0;



}



   以上菜贴希望能让同行少走些弯路~

出0入0汤圆

发表于 2005-11-17 15:28:57 | 显示全部楼层
恭喜恭喜,佩服LZ的韧性,工作幸苦啊。呵呵,又赚分

出0入0汤圆

 楼主| 发表于 2005-11-17 15:35:43 | 显示全部楼层
的确是很辛苦,赚分就没有必要了

呵呵

出0入0汤圆

发表于 2005-11-18 08:40:03 | 显示全部楼层
好贴!

恭喜!

出0入0汤圆

发表于 2005-11-18 08:49:29 | 显示全部楼层
好贴

记下

出0入0汤圆

发表于 2006-3-26 22:21:54 | 显示全部楼层
支持,我打算入门avr 了

出0入0汤圆

发表于 2006-3-27 00:07:55 | 显示全部楼层
pf楼主,我是断断续续的在入门AVR啊!

等这次考试搞定以后我一定要向楼主学习,坚持…………

出0入0汤圆

发表于 2006-3-27 07:53:59 | 显示全部楼层
历经波折,恭喜了

欢迎进入AVR的世界

出0入0汤圆

发表于 2006-3-27 08:48:15 | 显示全部楼层
andre:

恭喜你

万事开头难啊,加油!

出0入0汤圆

发表于 2006-3-27 10:16:37 | 显示全部楼层
呵呵,我上次也遇到同样的问题,早看到你的贴就好了。

出0入0汤圆

发表于 2006-3-27 11:26:59 | 显示全部楼层
谢谢,我也刚入门

希望能在论坛里学到不少东西

出0入0汤圆

发表于 2006-4-18 17:30:58 | 显示全部楼层
恭喜阿,我再用M8 调串口程序,调了一天了,没调出来,看了这贴我又有了信心!!!谢谢!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2006-5-20 23:06:09 | 显示全部楼层
我也喜欢AVR单片机!

出0入0汤圆

发表于 2006-5-22 18:56:33 | 显示全部楼层
我上次用M8调串口,

能发数据不能收,搞了半天才发现是接收那条线不通,

很郁闷了一段时间

出0入0汤圆

发表于 2006-5-23 09:21:45 | 显示全部楼层

出0入0汤圆

发表于 2006-7-24 09:34:01 | 显示全部楼层
恭喜,万事开头难

出0入0汤圆

发表于 2006-8-1 13:28:11 | 显示全部楼层
我也才入门,向楼主学习了

出0入0汤圆

发表于 2006-8-1 14:47:21 | 显示全部楼层
我那次调了一天啊没调好,第二天才发现原来那个DB9座有问题啊,2脚根本不通,哈哈.

出0入0汤圆

发表于 2006-8-1 14:53:10 | 显示全部楼层
虽然不懂,还是谢谢LZ共享。

出0入0汤圆

发表于 2006-8-5 20:43:45 | 显示全部楼层
好贴大家一起分享

出0入0汤圆

发表于 2006-8-10 08:39:40 | 显示全部楼层
下面是我的串口程序 (只接收PC发来的一个数据后 给PZ口显示以验证) 不知道是不是上位机软件的原因 一点反映也没,,M16

  #include <iom16v.h>

  #include <macros.h>



  void delay()

  {

    unsigned char i,j;

        for(i=200;i>=0;i--)

           for(i=150;i>=0;i--)

           ;

   }

//*********UART初始化**********//

void usart_init()

  {

     

    UCSRA=0X02;  //U2X=1 双倍速

       

        UCSRC=(1<<URSEL)|(0<<UMSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位 异步 一个停止

        UBRRL=0x10;        //57600

        UBRRH=0x00;

        UCSRB=0x18;  //发送接收使能

  }

//*************接受一个字节***********

unsigned char recieve_byte(void)

  {

   while( !(UCSRA & (1<<RXC) ) )

    ;

        return UDR;

   }

//*************发送一个字节********//

void trasmit_byte( unsigned char data )

  {

    while( !( UCSRA & (1<<UDRE) ) ) // 等待UDR为空

        ;

        UDR=data;

   }

//***********main*******************//

void main ()

  {

    unsigned char temp;

        DDRA=0XFF;

        PORTA=0XFF;

        asm("cli");

   usart_init(); //初始化

   

   while(1)

     {

           temp=recieve_byte();

           PORTA=temp;

           delay();

          }

  }
-----此内容被hayuda于2006-08-10,08:49:28编辑过

出0入0汤圆

发表于 2006-8-10 11:52:01 | 显示全部楼层
下面是我的串口电瓶转换图! 测的发送接收波形挺正常的!我降低拨特率的时候有时候从PC连续多发数据 例如 00 00 00 00 00 00 00 还能接到数据(接到PA口LED亮)

穿口 挺不好调的啊:(

点击此处打开armok01125845.doc

出0入0汤圆

发表于 2006-8-10 19:31:37 | 显示全部楼层
自己顶下!!!!!!!!!!

出0入0汤圆

发表于 2006-9-2 18:21:03 | 显示全部楼层
我也顶一下!

出0入0汤圆

发表于 2006-9-2 18:38:47 | 显示全部楼层
楼上各位DX,拜托看看:

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=663742&bbs_page_no=1&bbs_id=1000



也是串口问题,可我一运行就死机啊,查不到软件原因。。。

出0入0汤圆

发表于 2006-9-3 09:33:59 | 显示全部楼层
谢谢楼主传授调试经验!



值得我们新手学习!

出0入0汤圆

发表于 2006-9-19 16:47:19 | 显示全部楼层
请大家帮忙看看我的这个?很奇怪的问题!谢谢大家



http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=667493&bbs_page_no=1&bbs_id=1000

出0入0汤圆

发表于 2006-10-17 11:13:09 | 显示全部楼层
是去年的帖子了,楼主要是能看到的话,我想问一下搂主用的什么编译器,我觉得是不是gcc,不过我装的也是gcc却没有楼主的avr_macros.h文件,请教楼主

出0入0汤圆

发表于 2006-11-9 09:50:35 | 显示全部楼层
恭喜

出0入0汤圆

发表于 2006-11-9 20:54:40 | 显示全部楼层
恭喜

出0入0汤圆

发表于 2006-11-10 09:59:50 | 显示全部楼层
一个串口搞好,就这么开心!神六上天,研发人员岂不要全开心死掉!

出0入0汤圆

发表于 2006-11-10 10:55:35 | 显示全部楼层
万事开头难!我第一次写串口程序时也费了不少劲,但是主要不是程序问题而是串口线的问题。成功的过程有时候比结果更重要,基于此所以才有成功的喜悦!

出0入0汤圆

发表于 2006-11-10 10:56:47 | 显示全部楼层
知道30楼是高手,对一个串口调试根本是小菜一碟,可对我们大部分新手可不一样了~

搞这软硬件结合的,没进展肯定是郁闷着的,可成功了难道不值得欣喜一下吗?

虽然前方路途对我们新手来说还很茫然,但是一次次小小的成功可给我们带来接受未来更多的挑战的动力!

新手们说是吧~~反正我是这么认为的!

出0入0汤圆

发表于 2006-11-10 11:19:58 | 显示全部楼层
恭喜搂主了,我也要试一下串口,先借鉴经验了:)

出0入0汤圆

发表于 2006-11-11 09:43:49 | 显示全部楼层
恭喜!

我刚学AVR,也正准备调试一下串口的程序,楼住的经验太珍贵了啊.

出0入0汤圆

发表于 2007-4-8 10:50:45 | 显示全部楼层
彼此彼此

出0入0汤圆

发表于 2007-4-14 20:38:06 | 显示全部楼层
新买的芯片要注意熔丝位,其他的只要连线正确就ok了

出0入0汤圆

发表于 2007-4-21 16:04:48 | 显示全部楼层
楼主你好,我在学AVR,现在要用MEGA16做个通信程序,但始终还是没调通,参考了你的程序还是一样,对于硬件外围我现在也无法判断对错,现附上图,请教.

出0入0汤圆

发表于 2007-4-27 19:52:35 | 显示全部楼层
不错不错,我现在也在调一串口程序,能用发数,但是波特率和程序中对不上号,郁闷

出0入0汤圆

发表于 2007-4-28 08:30:20 | 显示全部楼层
严重关注

出0入4汤圆

发表于 2007-4-28 10:06:09 | 显示全部楼层
37楼的硬件不能双向通讯,

出0入0汤圆

发表于 2007-4-29 22:09:18 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2007-7-31 15:40:07 | 显示全部楼层
20楼的错拉

#include <iom16v.h>

#include <macros.h>



void delay()

{

unsigned char i,j;

for(i=200;i>=0;i--)

for(i=150;i>=0;i--)

;

}

//*********UART初始化**********//

void usart_init()

{



UCSRA=0X02; //U2X=1 双倍速



//UCSRC=(1<<URSEL)|(0<<UMSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位 异步 一个停止

UBRRL=0x10; //57600

UBRRH=0x00;

UCSRB=0x18; //发送接收使能

}

//*************接受一个字节***********

unsigned char recieve_byte(void)

{

while( !(UCSRA & (1<<RXC) ) )

;

return UDR;

}

//*************发送一个字节********//

void trasmit_byte( unsigned char data )

{

while( !( UCSRA & (1<<UDRE) ) ) // 等待UDR为空

;

UDR=data;

}

//***********main*******************//

void main ()

{

unsigned char temp;

DDRA=0XFF;

PORTA=0XFF;

asm("cli");

usart_init(); //初始化



while(1)

{

temp=recieve_byte();

PORTA=temp;

trasmit_byte(temp);

delay();

}

}

在和PC通信时,我一般不设数据桢.

出0入0汤圆

发表于 2007-7-31 17:51:20 | 显示全部楼层
谢谢楼主的共享啊

出0入0汤圆

发表于 2007-7-31 21:21:38 | 显示全部楼层
恭喜恭喜,想我开始学习的时候,因为有了实验板,参照搞的

出0入0汤圆

发表于 2007-9-19 16:21:18 | 显示全部楼层
恭喜老兄试验成功!


我搞了两天,头都大了,用的是Codevision,收到的数据不是期望的结果.今晚再去试试,但愿能够成功.

出0入0汤圆

发表于 2007-9-27 12:13:49 | 显示全部楼层
才入门,向楼主学习了

出0入0汤圆

发表于 2007-9-27 13:12:23 | 显示全部楼层
恭喜楼主!
我是最近开始学AVR的 现在开始做一个模拟串口发送和接收实验 在实验过程中可发现发送的8位数据单片机接受时第一位始终默认是零 和起始位一样 其余7个数据接受都是正确的 搞了好几天都没查明原因 请问一下各位高手这问题出错的原因是什么?怎么解决?谢谢

出0入0汤圆

发表于 2007-10-24 12:44:47 | 显示全部楼层
刚来这里,试试手气。

出0入4汤圆

发表于 2007-10-26 21:55:34 | 显示全部楼层
正在学习中、、、、

出0入0汤圆

发表于 2007-11-3 10:22:03 | 显示全部楼层
不错,这些天的实验,我也感觉搞懂原理很重要啊,宁愿开始都花些时间~~

出0入0汤圆

发表于 2007-11-3 11:43:22 | 显示全部楼层
有空偶也试一试。

出0入0汤圆

发表于 2007-11-7 14:52:54 | 显示全部楼层
楼主用的上位机是什么啊?能否介绍一下供我等莱鸟参考一下,可否?

出0入0汤圆

发表于 2007-11-7 18:24:05 | 显示全部楼层
串行口与PC通讯在调试其它程序中很有用,调试OK就可以做为子程序,以后其它程序中可以作为显示用,对程序的调试就一目了然了

出0入0汤圆

发表于 2007-11-12 12:49:07 | 显示全部楼层
其实很多时候不是光抄别人的电路图。还得从根本上读懂别人设计的意图。还有现在一些人入门设计PCB很粗糙,感觉太随便了,然后就去做板。建议把程序什么的整个系统都搞得很清楚了才出去做板,不然就实在有点浪费,我说不是浪费你的钱,是浪费板材,做板人的心血。我很多时候写程序时会发现电路原理图需要修改,不然程序就麻烦,可靠性什么的都不高。

出0入0汤圆

发表于 2007-11-21 08:37:03 | 显示全部楼层
准备使用串口了,学习一下。

出0入0汤圆

发表于 2007-12-3 15:23:42 | 显示全部楼层
正在调试中,收到的全是乱码。郁闷ING

出0入0汤圆

发表于 2008-3-28 17:34:58 | 显示全部楼层
恭喜啊!!我以前弄的是51现在公司要做avr的请问我怎么可以快速入门啊?

出0入0汤圆

发表于 2008-3-29 01:29:41 | 显示全部楼层
回57楼,多看看芯片资料,还有就是多来这里逛逛,保证你收获多.

出0入0汤圆

发表于 2008-4-24 13:42:45 | 显示全部楼层
不错!

出0入0汤圆

发表于 2008-4-24 15:12:21 | 显示全部楼层
贡喜你!
这个串口用LIBC中的东东很好搞定。比如说设波特率
用LIBC可以这样搞,这样就不能晶振问题而来回算了:
GCC环境:

#define F_CPU 16000000//这一点如果在makefile里有了就不用声明了
#define BAUD 20000
#include<util/setbaud.h>
UBRRH=UBRRH_VALUE;  
UBRRL=UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif

出0入0汤圆

发表于 2009-7-12 14:37:28 | 显示全部楼层
还没入门 像lz
学习

出0入0汤圆

发表于 2009-10-22 22:42:46 | 显示全部楼层
我更郁闷,写了十多天的程序,结果是一个很小的毛病,程序本来就是对的

出0入0汤圆

发表于 2009-10-23 08:32:10 | 显示全部楼层
其实用CV调试串口更方便,楼主的韧劲的确佩服

出0入0汤圆

发表于 2009-10-23 08:55:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-23 09:07:14 | 显示全部楼层
mark

出70入0汤圆

发表于 2009-10-30 17:26:37 | 显示全部楼层
靠,楼主牛B了

出0入0汤圆

发表于 2009-10-30 18:10:33 | 显示全部楼层
顶。。。。。。。。。。。

出0入0汤圆

发表于 2009-10-30 18:17:45 | 显示全部楼层
都是这么过来的

出0入0汤圆

发表于 2011-9-27 11:09:28 | 显示全部楼层
回复【楼主位】andre
-----------------------------------------------------------------------

感谢楼主分享,我就在做这个!谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 06:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表