如何将数据从 /dev/ttyUSB0 传输到 python 脚本

How to pipe data from /dev/ttyUSB0 to a python script

我可以 sudo cat /dev/ttyUSB0 并且数据正在控制台中流动。

但我不知道如何在 python 脚本中执行此操作以使用数据。

我试过了

sudo python test.py < /dev/ttyUSB0
sudo cat /dev/ttyUSB0 | python test.py

其中 test.py

import sys

for line in sys.stdin:
    print line

它从不打印任何东西,但如果我打印 ls | python test.py 是否与 ls 的内容相呼应?

我的 test.py 需要做什么才能阅读 /dev/ttyUSB0

评论更新

因此,当我重新启动 pi 并 cat out 时 运行 除此处显示的内容外没有任何其他内容:

pi@raspberrypi ~ $ sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
pi@raspberrypi ~ $ sudo cat /dev/ttyUSB0
$GPGGA,111448.000,5543.1460,N,01229.2541,E,2,08,1.13,19.1,M,41.5,M,0000,0000*5A
$GPGSA,A,3,10,16,18,21,26,20,29,27,,,,,1.42,1.13,0.87*0D
$GPRMC,111448.000,A,5543.1460,N,01229.2541,E,0.37,331.77,270816,,,D*63
$GPVTG,331.77,T,,M,0.37,N,0.68,K,D*33
$GPGGA,111449.000,5543.1462,N,01229.2542,E,2,08,1.13,19.1,M,41.5,M,0000,0000*5A
$GPGSA,A,3,10,16,18,21,26,20,29,27,,,,,1.42,1.13,0.87*0D
$GPRMC,111449.000,A,5543.1462,N,01229.2542,E,0.40,336.35,270816,,,D*62
$GPVTG,336.35,T,,M,0.40,N,0.74,K,D*3F
$GPGGA,111450.000,5543.1463,N,01229.2541,E,2,08,1.13,19.1,M,41.5,M,0000,0000*50
$GPGSA,A,3,10,16,18,21,26,20,29,27,,,,,1.42,1.13,0.87*0D
$GPRMC,111450.000,A,5543.1463,N,01229.2541,E,0.18,42.67,270816,,,D*52
$GPVTG,42.67,T,,M,0.18,N,0.33,K,D*06
$GPGGA,111451.000,5543.1464,N,01229.2542,E,2,08,1.13,19.1,M,41.5,M,0000,0000*55
$GPGSA,A,3,10,16,18,21,26,20,29,27,,,,,1.42,1.13,0.87*0D
$GPGSV,4,1,14,21,66,084,17,16,65,264,18,26,56,199,24,27,41,281,20*74
$GPGSV,4,2,14,20,37,067,14,18,37,138,25,49,26,189,28,10,14,169,21*72
$GPGSV,4,3,14,07,13,335,,29,11,100,16,08,07,282,,13,05,050,*73
$GPGSV,4,4,14,05,04,025,,15,04,080,*72
$GPRMC,111451.000,A,5543.1464,N,01229.2542,E,0.30,7.93,270816,,,D*67
$GPVTG,7.93,T,,M,0.30,N,0.55,K,D*36

一切看起来都不错 然后 运行 python 脚本

pi@raspberrypi ~ $ python test.py
Traceback (most recent call last):
  File "test.py", line 96, in <module>
    run_program()
  File "test.py", line 85, in run_program
    with serial.Serial('/dev/ttyUSB0',9600) as ser:
  File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__
    self.open()
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open
    raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyUSB0: [Errno 16] Device or resource busy: '/dev/ttyUSB0'

通过关闭 gpsd 修复

pi@raspberrypi ~ $ sudo killall gpsd
pi@raspberrypi ~ $ python test.py

我现在在服务器上收到数据,看起来不错。 (我推套接字而不是打印答案)。

$GPGGA,111838.000,5543.1488,N,01229.2451,E,2,09,0.94,21.8,M,41.5,M,0000,0000*5A
$GPGSA,A,3,29,10,16,18,21,26,20,27,07,,,,1.60,0.94,1.30*09
$GPRMC,111838.000,A,5543.1488,N,01229.2451,E,0.55,102.49,270816,,,D*65
$GPVTG,102.49,T,,M,0.55,N,1.02,K,D*35
$GPGGA,111839.000,5543.1488,N,01229.2454,E,2,09,0.93,21.8,M,41.5,M,0000,0000*59
$GPGSA,A,3,29,10,16,18,21,26,20,27,07,,,,1.22,0.93,0.79*04
$GPRMC,111839.000,A,5543.1488,N,01229.2454,E,0.56,54.80,270816,,,D*55
$GPVTG,54.80,T,,M,0.56,N,1.05,K,D*06
$GPGGA,111840.000,5543.1489,N,01229.2456,E,2,09,0.93,21.8,M,41.5,M,0000,0000*54
$GPGSA,A,3,29,10,16,18,21,26,20,27,07,,,,1.22,0.93,0.79*04
$GPRMC,111840.000,A,5543.1489,N,01229.2456,E,0.43,12.04,270816,,,D*52
$GPVTG,12.04,T,,M,0.43,N,0.80,K,D*00
$GPGGA,111841.000,5543.1490,N,01229.2457,E,2,09,0.94,21.8,M,41.5,M,0000,0000*5B
$GPGSA,A,3,29,10,16,18,21,26,20,27,07,,,,1.60,0.94,1.30*09
$GPGSV,4,1,14,16,65,260,27,21,64,082,17,26,54,198,30,27,43,282,17*7B
$GPGSV,4,2,14,18,39,137,29,20,36,065,18,49,26,189,28,10,15,168,16*74
$GPGSV,4,3,14,07,13,334,16,29,10,101,15,08,08,283,,13,06,049,*73
$GPGSV,4,4,14,15,05,079,,05,02,025,*73
$GPRMC,111841.000,A,5543.1490,N,01229.2457,E,0.24,252.88,270816,,,D*69
$GPVTG,252.88,T,,M,0.24,N,0.44,K,D*3B
$GPGGA,111842.000,5543.1490,N,01229.2456,E,2,09,0.93,21.8,M,41.5,M,0000,0000*5E
$GPGSA,A,3,29,10,16,18,21,26,20,27,07,,,,1.22,0.93,0.79*04

退出 python 脚本后 sudo cat /dev/ttyUSB0 什么都没有发生。 这是因为我没有在 python 中关闭正确的内容吗?

您可以使用pyserial

从python中的USB端口/串口读取数据
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)

while True:
    data = ser.readline()
    if data:
        print(data)

您不需要通过管道将串行输入重定向到 python 脚本。