QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”

Posted

技术标签:

【中文标题】QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”【英文标题】:UART driver for QEMU receiving `delete` byte instead of `backspace` 【发布时间】:2022-01-09 19:53:41 【问题描述】:

我按下键盘上的退格键,我得到 delete 字节,它是 127 而不是 8,这是 backspace 的代表,使用以下简单的 get/put UART 函数。

#define mmio_write_byte(base, offset, value) \
    *((uint8_t *) (base + offset)) = (uint8_t) value

#define mmio_read_byte(base, offset) *((uint8_t *) (base + offset))

void uart0_put(char c) 
    while ((mmio_read_byte(UART0_BASE, UART_LSR) & (1 << 5)) == 0);
    mmio_write_byte(UART0_BASE, UART_THR, c);


char uart0_get() 
    while ((mmio_read_byte(UART0_BASE, UART_LSR) & (1 << 0)) == 0);
    return mmio_read_byte(UART0_BASE, UART_RHR);

在我的驱动程序代码中,我有以下内容:

    while (1) 
        char c = read_char();
        if (c == 127) 
            puts("HERE: delete\n");
         else if (c == 8) 
            puts("HERE: backspace\n");
         else if (c == 10 || c == 13) 
            putchar('\n');
         else 
            putchar(c);
        
    

当我运行 QEMU 并反复按键盘上的退格键时,我收到以下信息:

$ qemu-system-riscv64 -machine virt -smp 1 -bios none -m 128 -serial mon:stdio -nographic -device virtio-keyboard-device -kernel kernel/kernel.elf
HERE: delete
HERE: delete
HERE: delete

此外,当我按下 delete 按钮时,我没有打印任何内容(因此它不会映射到 8 或 127)...

【问题讨论】:

【参考方案1】:

这是正确的行为。如果你按键盘上的退格键,它的作用是删除光标后面的字符,而不是将光标向后移动而不删除。

delete 按钮不会转换为任何 ASCII 字符。它在终端内部但未发送。

【讨论】:

非常感谢!那么ASCII码08在键盘上翻译成什么?

以上是关于QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”的主要内容,如果未能解决你的问题,请参考以下文章

Uart 接收到正确的字节,但顺序混乱

为啥 UART w/DMA 只接收发送数据的最后一个字节?

uart接收和发送数据

STM32 硬件UART接收超时检测设置

atmel 模拟 UART 通讯

无法通过 UART 传输每个字符