AVR USART 仅传输 2 个字符
AVR USART transmitting only 2 chars
下面是 ATmega328P 上的代码 运行。它应该每秒发送 "abcdef" 到我的电脑。但是,它每秒只向我发送 "ab"。这里有什么问题?
#include <avr/io.h>
#include <util/delay.h>
void USART_transmit(unsigned char data);
void print(const unsigned char *buffer, size_t n);
void print(const char* str);
int main(void) {
// Serial.begin(115200)
UCSR0B |= (1<<TXEN0);
UBRR0L = 8;
while(1){
// Serial.write(i)
print("abcdef");
_delay_ms(1000);
}
}
void USART_transmit(const uint8_t data) {
/* wait for empty transmit buffer */
while (!UCSR0A & (1<<UDRE0));
UDR0 = data;
}
void print(const uint8_t *buffer, size_t n) {
while(n--){
USART_transmit(*buffer++); //**
}
}
void print(const char *str) {
if(strlen(str) != 0) print((const uint8_t *) str, strlen(str));
}
代码导致:
ababababababababababab...
从 USART_transmit(*buffer++);
更改为 USART_transmit(n + 48);
(+48 以转换为 char)导致:
5454545454545454545454545454...
所以我猜循环不应该停止?
"data register empty"检查错误。
while (!UCSR0A & (1<<UDRE0));
应该是
while (!(UCSR0A & (1 << UDRE0)));
在您的情况下,检查不会阻塞,直到缓冲区为空。我认为一个字节缓冲在 USART 输出缓冲区中,一个字节在 UDR 中待处理。然后丢弃每个额外的字节,这就是为什么你只看到 "ab".
下面是 ATmega328P 上的代码 运行。它应该每秒发送 "abcdef" 到我的电脑。但是,它每秒只向我发送 "ab"。这里有什么问题?
#include <avr/io.h>
#include <util/delay.h>
void USART_transmit(unsigned char data);
void print(const unsigned char *buffer, size_t n);
void print(const char* str);
int main(void) {
// Serial.begin(115200)
UCSR0B |= (1<<TXEN0);
UBRR0L = 8;
while(1){
// Serial.write(i)
print("abcdef");
_delay_ms(1000);
}
}
void USART_transmit(const uint8_t data) {
/* wait for empty transmit buffer */
while (!UCSR0A & (1<<UDRE0));
UDR0 = data;
}
void print(const uint8_t *buffer, size_t n) {
while(n--){
USART_transmit(*buffer++); //**
}
}
void print(const char *str) {
if(strlen(str) != 0) print((const uint8_t *) str, strlen(str));
}
代码导致:
ababababababababababab...
从 USART_transmit(*buffer++);
更改为 USART_transmit(n + 48);
(+48 以转换为 char)导致:
5454545454545454545454545454...
所以我猜循环不应该停止?
"data register empty"检查错误。
while (!UCSR0A & (1<<UDRE0));
应该是
while (!(UCSR0A & (1 << UDRE0)));
在您的情况下,检查不会阻塞,直到缓冲区为空。我认为一个字节缓冲在 USART 输出缓冲区中,一个字节在 UDR 中待处理。然后丢弃每个额外的字节,这就是为什么你只看到 "ab".