完善这段代码使得当UART被禁用时,按下PB1不会影响程序,int main(void) { // hardware/peripheral initialisation uint8_t Q; queue_init(&charBuf); gpio_set_mode(P_LD2, Output); gpio_set_mode(P_B1, PullUp); uart_init(9600); uart_set_rx_callback(uart_rx_isr); uart_enable(); while (1) { if (flag){ // there is a new character ReadChar(c); if(!queue_enqueue(&charBuf,X)){ while(1){ if(gpio_get(P_B1) == 0){ uart_enable(); queue_init(&charBuf); } } }else{ if(queue_dequeue(&charBuf,&Q)){ uart_tx(Q); BlinkMorseCode(Q); } } } flag = 0; // clear the flag // } // do something else } }
时间: 2024-03-10 09:45:24 浏览: 79
完善后的代码如下:
```c
int main(void) {
// hardware/peripheral initialisation
uint8_t Q;
queue_init(&charBuf);
gpio_set_mode(P_LD2, Output);
gpio_set_mode(P_B1, PullUp);
uart_init(9600);
uart_set_rx_callback(uart_rx_isr);
uart_enable();
while (1) {
if (flag) {
// there is a new character
ReadChar(c);
if (!queue_enqueue(&charBuf, c)) {
while (gpio_get(P_B1) == 0) {
if (uart_is_enabled()) {
queue_init(&charBuf);
break;
}
}
} else {
if (queue_dequeue(&charBuf, &Q)) {
uart_tx(Q);
BlinkMorseCode(Q);
}
}
flag = 0; // clear the flag
}
// do something else
}
}
```
修改的部分是在 `if(!queue_enqueue(&charBuf,X)){}` 这个条件语句中。当无法将字符加入队列时,会进入一个死循环,不断检测 PB1 是否被按下。如果 PB1 被按下且 UART 已经被启用,就重新初始化队列并启用 UART。这样就保证了当 UART 被禁用时,按下 PB1 不会影响程序的正常运行。
阅读全文