c++ - 在arduino上编程atmega328p的UART

标签 c++ arduino avr

我正在通过直接编程其 atmega328p 的串行通信寄存器来尝试在 arduino 中进行串行传输(我知道 arduino 中有一个现成的串行通信库,但我想尝试自己编程 atmega328p)。

我正在尝试使用 arduino 的 tx pin 将字符“a”发送到串行 lcd。 我在网上引用了几个资源,得到了以下代码:

#define BAUDRATE(BAUD) (((F_CPU/(BAUD*16UL)))-1)


class serials
    { 
        serials()
        {
            UBRR0H = BAUDRATE(9600) >> 8;
            UBRR0L = BAUDRATE(9600);

            UCSR0A &= ~_BV(U2X0);
            UCSR0B |= _BV(TXEN0) | _BV(RXEN0);
            UCSR0C |= _BV(UCSZ00) | _BV(UCSZ01);
        }
         void transmit(unsigned char);
};

void serials::transmit(unsigned char data)
    {


                loop_until_bit_is_clear(UCSR0A,UDRE0);  
                UDR0 = data;
    }



void loop() 
{
    serials lcdtransmit;

        lcdtransmit.transmit(254);
        lcdtransmit.transmit(1);
        lcdtransmit.transmit(254);
        lcdtransmit.transmit(128);
        lcdtransmit.transmit('a');

        while(1);
}

但是,当我运行这段代码时,

  1. 液晶显示器无输出。
  2. tx 引脚始终为高电平。
  3. while(1) 不存在时,'tx pin' 似乎有输出,但液晶显示屏上没有输出。

串口传输的代码有没有错误?

最佳答案

鉴于您在 Arduino 上使用 328p,您应该假设引导加载程序在您到达代码之前已经写入 UART 寄存器。因此,UCSR0B 和 UCSR0C 寄存器应该被完全分配,而不是仅仅在您的设置位中进行屏蔽。

关于c++ - 在arduino上编程atmega328p的UART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899269/

相关文章:

c++ - 信号上的 QT 未定义引用编译错误

c++ - 拆分并分配字符

c++ - 了解 Node.js 的 napi_value 类型的定义

java - 从文件夹中排除 cpp 而不删除

arduino - 可编程电源

c++ - 将 char* 转换为 int arduino

c - 为什么这些函数使用不同的指针和空指针?

linker - C AVR 中对 `usbInit' 的 undefined reference

installation - AtmelStudio 7 安装 avr8 设备支持包失败

c++ - MySQL 在 DROP FUNCTION 上崩溃