搜索
bottom↓
回复: 3

M16串口收发不稳定(用来控制小车的运动)转来请教马老师

[复制链接]

出0入0汤圆

发表于 2006-12-6 10:55:58 | 显示全部楼层 |阅读模式
请马老师在有空的时候,帮忙看下。在串口区发贴都没人问津,问题是鳔胶简单,但是已经好几天了,我也努力了的。谢谢马老师。本菜刚开始学习AVR,已经看过几十个串行口贴了,受益颇多,修改后仍未正确,可能天生驽钝,望各位大侠出手帮助并批评。相关问题如下:用AVR Studio编程环境选用外部晶振7.3728,熔丝位设置如下:SUT1和SUT0:11 CKSEL3-0:1110。熔丝应该对的,参照外部7.3728设置的。



症状一:只有发送特殊波形的UUUU时USART_Trans("UUUUUU")时;在SSCOM3.2(串口调试软件)才会正确显示,USART_Trans("Hello,World!"); 时候出来的就是乱码,不知道是波特率还是其他原因。

症状二:在SSCOM3.2工具里字符串输入框中输入U时,还算好,回显的时候10个中还有5.6个是U。其他W、S、A、D时候基本上10个偶然对上一个,其他是乱码之类的符号。所以最后我用U来左测试控制小车运动。对应程序段signal = USART_Receive();USART_Transmit(signal);

说明:程序中省略了小车的运动控制部分,这部分已经OK!对应forward()等等。省掉方便大家帮助检查串口错误。希望大家多多扔砖头,因为实在是憋久了。并且用U在输入框中时,由于10个中有5,6个U是可以接收并再传回PC,所以还能驱动小车前进,这部分没问题。我想来想去是串口部分的原因。谢谢

程序如下:

#include <io.h>

#include <signal.h>

#include <interrupt.h>

#include <stdio.h>



void USART_Init()

{

     cli();

   UBRRH=0x00;

   UBRRL=0x2f;

   UCSRA=0x00;   

   UCSRB = (1<<RXEN)|(1<<TXEN);    //接收和发送使能.引脚通用功能被USART功能取

   UCSRC = (1<<URSEL) | (3<<UCSZ0); //异步模式、禁止奇偶校验,1位停止位,8位数据位

           sei();

}



/*发送采用查询方式*/

void USART_Transmit(unsigned char data)  

{

    while( !(UCSRA & (1<<UDRE)) );   //UDR发送缓冲器非空,即等待发送缓冲器为空

    UDR = data;      //UDR一旦赋值数据就自动的由串口发送出去

}



void USART_Trans(unsigned char *p)

{

    while (*p)

         USART_Transmit(*p++);   

}



/*接收采用查询方式*/

unsigned char USART_Receive()

{

   unsigned char Rdata;

   while( !(UCSRA & (1<<RXC)) );      //等待接收数据

   Rdata = UDR;

   return Rdata;      //从缓冲器中获取并返回数据

}



int main()

{

  DDRD |= 0xf0;      //千万不要漏啊,漏了就不会选中驱动电机了



  USART_Init();  

  unsigned char signal;

//USART_Trans("UUUUUUUUUU");

//USART_Trans("Hello,World!");   

  while(1)

  {

     signal = USART_Receive();

    USART_Transmit(signal);

     switch(signal)

   {

      case 'U':

         forward();break;

      case 'S':

         backward();break;

         case 'A':

         turn_left();break;

      case 'D':

         turn_right();break;   

       default:

         stop();break;

   }

  }

  return 0;

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2006-12-6 10:56:46 | 显示全部楼层
进一步发现, signal = USART_Receive(); USART_Transmit(signal); 这个过程中,U还是比较正常的,A通过发送再接收后,显示的多为P,S多为*,D多为t.

出0入0汤圆

 楼主| 发表于 2006-12-6 21:46:45 | 显示全部楼层
估计是波特率的原因,不知道如何着手呀,唉!麻烦马老师喽!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-22 16:05

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

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