You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下USB条码扫描器串口读取数据为空问题求助

问题:USB条码扫描器在Ubuntu下无法通过Python serial读取数据

我将USB条码扫描器连接至Ubuntu电脑,扫描器可正常工作——在终端、VSCode等任意光标位置均能输出条码结果,但使用以下Python serial代码读取时,received_string变量始终为空,且无报错信息。

import serial
import time

SerialObj = serial.Serial("/dev/ttyS0", 9600)

time.sleep(3)

SerialObj.timeout(3)

print("Starting")

while True:
    received_string = SerialObj.readline()
    print("Received: ", received_string)

SerialObj.close()

运行后始终得到Received: b''。


更新:系统日志信息

未插入扫描器时执行sudo dmesg | tail的输出:

[85989.229043] usb 1-10.1: USB设备断开连接,设备编号15
[85995.490066] usb 1-10.1: 使用xhci_hcd发现新的全速USB设备,编号16
[85995.606922] usb 1-10.1: 未运行在最高速度;请连接到高速集线器
[85995.608536] usb 1-10.1: 发现新USB设备,idVendor=060e,idProduct=7800,bcdDevice=2.54
[85995.608538] usb 1-10.1: 新USB设备字符串:制造商=1,产品=2,序列号=0
[85995.608539] usb 1-10.1: 产品:USB Barcode Scanner HID
[85995.608540] usb 1-10.1: 制造商:USB Barcode Scanner HID
[85995.615660] 输入设备:USB Barcode Scanner HID USB Barcode Scanner HID,路径为/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.1/1-10.1:1.0/0003:060E:7800.0010/input/input43
[85995.674330] hid-generic 0003:060E:7800.0010: 输入设备,hidraw6:USB HID v1.01键盘 [USB Barcode Scanner HID USB Barcode Scanner HID],位于usb-0000:00:14.0-10.1/input0
[87124.076792] usb 1-10.1: USB设备断开连接,设备编号16

插入扫描器时执行sudo dmesg | tail的输出:

[85995.674330] hid-generic 0003:060E:7800.0010: 输入设备,hidraw6:USB HID v1.01键盘 [USB Barcode Scanner HID USB Barcode Scanner HID],位于usb-0000:00:14.0-10.1/input0
[87124.076792] usb 1-10.1: USB设备断开连接,设备编号16
[89435.842374] usb 1-10.2: 使用xhci_hcd发现新的全速USB设备,编号17
[89435.963057] usb 1-10.2: 未运行在最高速度;请连接到高速集线器
[89435.964477] usb 1-10.2: 发现新USB设备,idVendor=060e,idProduct=7800,bcdDevice=2.54
[89435.964479] usb 1-10.2: 新USB设备字符串:制造商=1,产品=2,序列号=0
[89435.964480] usb 1-10.2: 产品:USB Barcode Scanner HID
[89435.964481] usb 1-10.2: 制造商:USB Barcode Scanner HID
[89435.970627] 输入设备:USB Barcode Scanner HID USB Barcode Scanner HID,路径为/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.2/1-10.2:1.0/0003:060E:7800.0011/input/input44
[89436.030645] hid-generic 0003:060E:7800.0011: 输入设备,hidraw6:USB HID v1.01键盘 [USB Barcode Scanner HID USB Barcode Scanner HID],位于usb-0000:00:14.0-10.2/input0

解决方案

问题核心原因

从系统日志可以明确看到,你的扫描器被Ubuntu识别为USB HID键盘设备(日志里的hid-generic、USB HID v1.01 Keyboard标识),这类扫描器的工作原理是模拟键盘按键输入,把条码内容“敲”到光标位置,而非通过串口传输数据。你代码里指定的/dev/ttyS0是物理串口,和这个扫描器完全无关,所以读不到任何数据。

可行解决方法

方法1:捕获键盘输入(快速实现)

既然扫描器是模拟键盘,直接监听全局键盘输入即可获取条码,推荐用pynput库:

  1. 先安装库:
sudo pip install pynput
  1. 使用以下代码:
from pynput import keyboard

barcode_buffer = ""

def on_key_press(key):
    global barcode_buffer
    try:
        # 收集普通字符
        barcode_buffer += key.char
    except AttributeError:
        # 扫描器通常会在条码末尾发送回车键,以此作为扫描完成的标志
        if key == keyboard.Key.enter:
            print(f"扫描到条码:{barcode_buffer}")
            barcode_buffer = ""  # 清空缓冲区,准备下一次扫描

# 启动键盘监听
with keyboard.Listener(on_press=on_key_press) as listener:
    listener.join()

方法2:切换扫描器到串口模式(长期最优)

部分条码扫描器支持通过扫描特定的设置条码,切换工作模式为串口(CDC-ACM协议)。切换后,设备会被识别为/dev/ttyACM0这类串口设备,此时修改你原代码里的设备路径,就能正常用serial库读取数据了。具体的设置条码需要查阅扫描器的说明书。

方法3:读取hidraw设备(复杂不推荐)

可以直接读取日志里的/dev/hidraw6设备,但需要手动解析HID协议的数据包,处理字节编码和按键映射,实现难度大,仅在前两种方法不可行时考虑。


内容的提问来源于stack exchange,提问作者Arif Agustyawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:08:13