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库:
- 先安装库:
sudo pip install pynput
- 使用以下代码:
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
相关产品推荐
相关产品推荐

