我正在通过直接编程其 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);
}
但是,当我运行这段代码时,
- 液晶显示器无输出。
- tx 引脚始终为高电平。
- 当
while(1)
不存在时,'tx pin' 似乎有输出,但液晶显示屏上没有输出。
串口传输的代码有没有错误?
最佳答案
鉴于您在 Arduino 上使用 328p,您应该假设引导加载程序在您到达代码之前已经写入 UART 寄存器。因此,UCSR0B 和 UCSR0C 寄存器应该被完全分配,而不是仅仅在您的设置位中进行屏蔽。
关于c++ - 在arduino上编程atmega328p的UART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899269/