UART接收键盘输入不工作
UART Receiving keyboard input doesn't work
我无法读取通过 UART 从笔记本电脑发送到微控制器的数据。传输部分工作正常 - 我可以毫无问题地将数据发送到我的笔记本电脑,但回显数据或从笔记本电脑读取键盘输入数据不起作用。我试图通过轮询和 Rx 中断例程来实现读取,但没有成功。我使用的微控制器是 ATMEGA2560,我通过 FTD1232 USB 到 TTL 串行转换器连接到我的笔记本电脑。
我正在使用 Putty 作为串行通信终端,使用 Arduino IDE 进行编程。
我假设问题不在硬件中基于以下 - 我尝试初始化不同的 USART 并尝试使用不同的 COM 端口,以及另一个 USB 到 TTL 转换器,各种电线,但结果是一样的。我还连接了另一个电源,为所有设备提供足够的电压。
我试图通过在 Rx 中断发生时(当我在终端中键入内容时)打开 LED 来至少获得响应。
~
#define F_CPU 16000000UL //16MHz
#define BAUD 115200UL //bps
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) //Table 101, page 212
volatile uint8_t temp;
void UART_init(){
//Set baud rate
UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate
UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate
//Enable Receiver and Transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8-bit format, 1 stop bit, no parity
UCSR0C |= (3 << UCSZ00);
UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit
//Set Double Speed Asynchronous mode
UCSR0A |= (1 << U2X0);
UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc
}
uint8_t UART_getchar(){
//Wait for RXC flag
while(!(UCSR0A & (1 << RXC0))){};
return UDR0;
}
//Arduino setup()
void setup(){
pinMode(8, OUTPUT);
UART_init();
sei();
}
//Arduino loop()
void loop(){
delay(500);
UART_putchar('a');
}
ISR(USART0_RX_vect){
temp = UDR0;
digitalWrite(8, HIGH);
}
这是一个冗长的 post,但我试图做到具体并且 post 整个代码。可以找到我用于 ATMEGA2560 的数据表 here。
我的 Putty 设置:
我刚刚在我的 Mega 板上测试了它,它在没有启用中断的情况下工作正常(简单环回):
#define BAUD 115200UL
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1)
volatile uint8_t temp;
void UART_init(){
//Set baud rate
UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate
UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate
//Enable Receiver and Transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8-bit format, 1 stop bit, no parity
UCSR0C |= (3 << UCSZ00);
UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit
//Set Double Speed Asynchronous mode
UCSR0A |= (1 << U2X0);
// UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc
}
uint8_t UART_getchar(){
//Wait for RXC flag
while(!(UCSR0A & (1 << RXC0))){};
return UDR0;
}
void UART_putchar(uint8_t data){
//Do nothing until UDR is ready
while(!(UCSR0A &(1 << UDRE0))){};
UDR0 = data;
}
void UART_putstring(uint8_t *data){
while(*data != 0x00){
UART_putchar(*data);
data++;
}
}
//Arduino setup()
void setup(){
pinMode(8, OUTPUT);
UART_init();
sei();
}
//Arduino loop()
void loop(){
UART_putchar(UART_getchar());
}
/*ISR(USART0_RX_vect){
temp = UDR0;
digitalWrite(8, HIGH);
}*/
必须禁用 RX 中断,否则会发生串行中断向量并且轮询获取字符无法工作,因为 ISR 读取字符
我无法读取通过 UART 从笔记本电脑发送到微控制器的数据。传输部分工作正常 - 我可以毫无问题地将数据发送到我的笔记本电脑,但回显数据或从笔记本电脑读取键盘输入数据不起作用。我试图通过轮询和 Rx 中断例程来实现读取,但没有成功。我使用的微控制器是 ATMEGA2560,我通过 FTD1232 USB 到 TTL 串行转换器连接到我的笔记本电脑。
我正在使用 Putty 作为串行通信终端,使用 Arduino IDE 进行编程。
我假设问题不在硬件中基于以下 - 我尝试初始化不同的 USART 并尝试使用不同的 COM 端口,以及另一个 USB 到 TTL 转换器,各种电线,但结果是一样的。我还连接了另一个电源,为所有设备提供足够的电压。
我试图通过在 Rx 中断发生时(当我在终端中键入内容时)打开 LED 来至少获得响应。
~
#define F_CPU 16000000UL //16MHz
#define BAUD 115200UL //bps
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) //Table 101, page 212
volatile uint8_t temp;
void UART_init(){
//Set baud rate
UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate
UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate
//Enable Receiver and Transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8-bit format, 1 stop bit, no parity
UCSR0C |= (3 << UCSZ00);
UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit
//Set Double Speed Asynchronous mode
UCSR0A |= (1 << U2X0);
UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc
}
uint8_t UART_getchar(){
//Wait for RXC flag
while(!(UCSR0A & (1 << RXC0))){};
return UDR0;
}
//Arduino setup()
void setup(){
pinMode(8, OUTPUT);
UART_init();
sei();
}
//Arduino loop()
void loop(){
delay(500);
UART_putchar('a');
}
ISR(USART0_RX_vect){
temp = UDR0;
digitalWrite(8, HIGH);
}
这是一个冗长的 post,但我试图做到具体并且 post 整个代码。可以找到我用于 ATMEGA2560 的数据表 here。
我的 Putty 设置:
我刚刚在我的 Mega 板上测试了它,它在没有启用中断的情况下工作正常(简单环回):
#define BAUD 115200UL
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1)
volatile uint8_t temp;
void UART_init(){
//Set baud rate
UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate
UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate
//Enable Receiver and Transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8-bit format, 1 stop bit, no parity
UCSR0C |= (3 << UCSZ00);
UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit
//Set Double Speed Asynchronous mode
UCSR0A |= (1 << U2X0);
// UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc
}
uint8_t UART_getchar(){
//Wait for RXC flag
while(!(UCSR0A & (1 << RXC0))){};
return UDR0;
}
void UART_putchar(uint8_t data){
//Do nothing until UDR is ready
while(!(UCSR0A &(1 << UDRE0))){};
UDR0 = data;
}
void UART_putstring(uint8_t *data){
while(*data != 0x00){
UART_putchar(*data);
data++;
}
}
//Arduino setup()
void setup(){
pinMode(8, OUTPUT);
UART_init();
sei();
}
//Arduino loop()
void loop(){
UART_putchar(UART_getchar());
}
/*ISR(USART0_RX_vect){
temp = UDR0;
digitalWrite(8, HIGH);
}*/
必须禁用 RX 中断,否则会发生串行中断向量并且轮询获取字符无法工作,因为 ISR 读取字符