修改代码,使charbuff满的时候摁下PB1才能重新启用while(1) { if (flag) { ReadChar(c); AddToBuff(c); flag = 0; } if (head != tail) { char c = CharBuff[head]; head = (head + 1) % 8; BlinkMorseCode(c); ReadFromBuff(head); SendChar(c); } },其中void AddToBuff(char X) { if (tail == head && f == 1) { // if full uart_disable(); while (1) { if (gpio_get(P_B1) == 0) { uart_enable(); head = 0; tail = 0; uart_tx(' '); f = 0; break; } } } CharBuff[tail] = X; tail = (tail + 1) % 8; if (tail == head) { f = 1; } }
时间: 2024-02-14 11:10:51 浏览: 56
可以将 `AddToBuff` 函数进行如下修改:
```
void AddToBuff(char X) {
if (tail == head && f == 1) { // if full
uart_disable();
while (1) {
if (gpio_get(P_B1) == 0) {
uart_enable();
while (gpio_get(P_B1) == 0); // 等待 PB1 松开
head = 0;
tail = 0;
uart_tx(' ');
f = 0;
break;
}
}
}
else {
CharBuff[tail] = X;
tail = (tail + 1) % 8;
if (tail == head) {
f = 1;
}
}
}
```
在缓冲区已满的情况下,先将 `uart` 禁用,然后进入一个无限循环,等待 PB1 被按下。当 PB1 被按下时,先将 `uart` 重新启用,然后等待 PB1 松开。接着将 head 和 tail 重置为 0,向串口发送一个空格字符,将 f 标志位重置为 0,表示缓冲区已经清空。最后跳出循环,重新进入缓冲区添加字符的逻辑。
需要注意的是,在 PB1 被按下时,需要等待 PB1 松开,否则程序会在 PB1 被按下的情况下一直重置 head 和 tail,导致无法正常添加字符。
阅读全文