1

我在通过 USB 串行转换器将 ATmega128 串行端口连接到计算机时遇到问题。USB 串行转换器已通过验证,因为我已使用它将计算机连接到 CDMA 调制解调器。但是,当我尝试将它与 atmega128 连接时,我无法找出问题所在。我已经将它连接到串行 LCD (CLCD) 并且工作正常。即使在使用虚拟终端进行模拟时也没有问题。我想知道我是否错过了与串行端口相关的任何内容。我已经在硬件选项和虚拟终端中检查了波特率。这是代码。

#include<avr/io.h>
#include<util/delay.h>

char str1[]="AT\r\n";

char str2[]="AT+CMGF=1\r\n";

char str3[]="AT+CMGS=\"01068685673\"\r\n";

char str4[]="hello\x1A\r\n";


int i;

void TX_CHAR(char ch)
{

    while(!(UCSR1A&0x20));
    UDR1=ch;

}

int main()
{

    UBRR1H=0; UBRR1L=103; UCSR1B=0x08;
    UCSR1C=0b00000110;

    while(1)
    {
        i=0; while(str1[i])TX_CHAR(str1[i++]);
        _delay_ms(200);
        i=0; while(str2[i])TX_CHAR(str2[i++]);
        _delay_ms(200);
        i=0; while(str3[i])TX_CHAR(str3[i++]);
        _delay_ms(200);
        i=0; while(str4[i])TX_CHAR(str4[i++]);
        _delay_ms(3000);
    }
}
4

1 回答 1

0

检查事项:

  • 硬件 - 接线
  • M103C 保险丝的值(= 兼容模式)
  • XTAL 频率和预分频器,因为 BAUD 的公式取决于它: BAUD = Fosc/16(UBRR+1)
  • USART 双速标志 (UCSRA)
  • 帧格式
  • UDREn 标志集

如果您使用预定义的符号值,您还可以更好地了解您的代码,例如

/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);

请参阅数据表中的示例(pg 176ff)

关于帧格式,我了解您设置为异步、8 位(UCSR1B:2 = 0, UCSR1C:2,1 = 11)、禁用奇偶校验、1 个停止位

void TX_CHAR(char ch)我了解,您正在使用 mask 检查位 7 (RXC1) 的状态0x20H。另一方面,您没有启用 RX(RXEN1 表示 UCSR1B:4=0)

我想知道您是否不应该更好地检查第 6 位(TXC1)。再次......使用符号值将有助于更好地理解代码。

希望这可以帮助 ...

于 2014-01-10T08:49:07.150 回答