为啥我不能在 ATMEGA64A-AU 串口中输入命令?

Posted

技术标签:

【中文标题】为啥我不能在 ATMEGA64A-AU 串口中输入命令?【英文标题】:Why can't I put command in ATMEGA64A-AU serial?为什么我不能在 ATMEGA64A-AU 串口中输入命令? 【发布时间】:2021-01-26 23:00:18 【问题描述】:

我买了一个ATMEGA64A-AU,我将它的 USART0 连接到 FT232RL(USB 转串口)和它的 USART1 到 GSM 模块。

我使用 USART0 仅用于监控目的,使用 USART1 与 GSM 模块通信。

我写这些是为了启用 USART:

void USART0_Init( unsigned int ubrr )

    UBRR0H = (unsigned char) (ubrr >> 8);
    UBRR0L = (unsigned char) ubrr;
    UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
    UCSR0C = (1 << USBS0) | (3 << UCSZ00);


void USART1_Init( unsigned int ubrr )

    UBRR1H = (unsigned char) (ubrr >> 8);
    UBRR1L = (unsigned char) ubrr;
    UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
    UCSR1C = (1 << USBS1) | (3 << UCSZ01);

这些将字符或字符串放入每个 USART:

void usart0_putc (char send)

    while ((UCSR0A & (1 << UDRE0)) == 0) ;
    UDR0 = send;


void usart0_puts (const char *send)

    while (*send) 
        usart0_putc(*send++);
    


void usart1_putc (char send)

    while ((UCSR1A & (1 << UDRE1)) == 0) ;
    UDR1 = send;


void usart1_puts (const char *send)

    while (*send) 
        usart1_putc(*send++);
    

我使用 RX1 中断向量从模块获取响应:

ISR (USART1_RX_vect)

    data_in[data_count] = UDR1;
    if (data_in[data_count] == '\n') 
        command_ready = TRUE;
        data_count = 0;
     else 
        data_count++;
    


以及主要功能:

void main( void )

    sei();
    
    USART0_Init(MYUBRR);
    USART1_Init(MYUBRR);
    while(1)
        if (command_ready == TRUE) 
            memcpy(command_in, data_in, MAXCHAR );
            memset(data_in, 0, sizeof(data_in));
            usart0_puts(command_in);
            command_ready = FALSE;
        
        
    

它显示响应或类似响铃和消息之类的东西,但问题是,当我通过微控制器向它发出一些命令时,例如将此行放在 main while 循环之前:

usart1_puts("ATD+545555555555;\r\n");

要拨打某个号码,整个事情都停止了,不仅不拨打该号码,而且停止显示来自模块的响应,所以我认为代码有问题。

任何帮助将不胜感激。

【问题讨论】:

我只是在猜测,但它可能与字符串文字有关。请参阅有关 PROGMEM 的编译器文档。 (抱歉,现在没时间验证。) 【参考方案1】:

你必须换行:

UCSR1C = (1 &lt;&lt; USBS1) | (3 &lt;&lt; UCSZ01);

对此:UCSR1C = (1 &lt;&lt; USBS1) | (3 &lt;&lt; UCSZ10);

UCSZ01 位属于 USART0 而不是 USART1 根据数据表!

【讨论】:

【参考方案2】:

您在UCSR0B 中启用了接收完成中断 (RXCIE0)

 UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);

但您没有该中断向量的中断服务例程处理程序。

所有带有未声明中断处理程序的向量默认为无限循环,这会挂起程序。

您必须声明 ISR (USART0_RX_vect) 或从 UCSR0B 中删除 RXCIE0

【讨论】:

我确实添加了 ISR (USART0_RX_vect) ,但我无法发送任何东西。

以上是关于为啥我不能在 ATMEGA64A-AU 串口中输入命令?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的电脑上的串口不能用,,用串口调试助手的时候说找不到?

C # 如何实现PC的串口通讯(一台PC 双串口通讯),以下程序设计为啥不能发送接收,错在了哪里吗?

WIN8 64系统装了串口驱动为啥还提示感叹号?

[小小Pi] USB/USB 串口/Wiring

STM32 串口为啥只能接收发送的部分数据

Delphi - 为啥我不能在 64 位中安装我的组件?