【发布时间】:2016-06-18 16:36:09
【问题描述】:
我正在尝试通过直接对其 atmega328p 的串行通信寄存器进行编程来在 arduino 中进行串行传输(我知道 arduino 中有一个现成的串行通信库,但我想自己尝试对 atmega328p 进行编程)。
我正在尝试使用 arduino 的 tx 引脚将字符“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 引脚”似乎有输出,但液晶显示屏上没有输出。
为串口传输编写的代码有错误吗?
【问题讨论】:
-
while(1)inloop()通常不是一个好主意。一个原因是芯片可能有一个硬件看门狗,而 Arduino 库通常会在loop()之外重置它。如果您从未从loop()返回,则看门狗永远不会重置,因此将导致芯片重新启动。您应该通过简单地使用全局bool来确保此代码只运行一次。 -
@DarkFalcon 或者使用
setup()让一些代码在程序启动时只执行一次。 -
我什至从代码中删除了 while 循环,但即便如此它也没有响应。