|
请马老师在有空的时候,帮忙看下。在串口区发贴都没人问津,问题是鳔胶简单,但是已经好几天了,我也努力了的。谢谢马老师。本菜刚开始学习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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|