【发布时间】:2016-10-06 11:28:12
【问题描述】:
我正在尝试将串行设备(特别是气溶胶粒子计数器)连接到 Pi。目前,我有一个连接 Pi 和设备的 USB 到串行适配器。当我运行这个程序从串口设备读取数据时:
import time
import serial
ser = serial.Serial('/dev/ttyUSB0')
print "connected"
ser.flushInput()
time.sleep(1)
while True:
ser.read(ser.inWaiting())
resp = ser.readline()
print resp
time.sleep(1)
我看到控制台上打印了两个数字(气溶胶颗粒计数):
56,4
63,2
68,1
42,2
72,9
62,8
74,5
77,7
73,4
54,6
65,6
67,2
65,1
80,4
这些数字会根据房间内的粒子数量而波动。换句话说,这段代码工作正常。
但是,我想摆脱这个 USB 串行适配器。所以,我直接用电线连接了 TX、RX 和接地引脚(Pi 上的 TX 到设备上的 RX,反之亦然)。现在,当我用/dev/ttyAMA0 代替/dev/ttyUSB0 运行类似的程序时:
import serial
import time
ser = serial.Serial('/dev/ttyAMA0')
print "connected"
ser.flushInput()
time.sleep(1)
while True:
resp = ser.read(1)
print ord(resp)
time.sleep(1)
我看到这个打印到控制台:
100
230
77
166
207
15
0
101
102
154
51
121
61
0
101
153
154
153
158
61
0
随着程序的运行,这种六个数字后跟零的模式继续存在。
注意:我运行“相似”程序而不是同一个程序的原因是 readline() 函数,它从设备读取字节直到读取新行字符,不适用于直接串行连接因为串行数据中没有换行符。相反,使用直接串行数据,Pi 读取每个字节并打印它的 unicode 字符号。另一方面,通过 USB 串口转换器连接读取的数据确实包含换行符。
我想知道如何从串行连接 (RX/TX) 获取 USB 串行转换器显示的粒子计数。
其他信息:
Python 2.7.11
“序列”文档:http://pythonhosted.org/pyserial/pyserial_api.html#classes
两个连接的波特率为 9600
两个连接没有奇偶校验
read(bytes)函数从设备中读取对应的字节数
readline() 函数从设备读取字节直到换行符
ord('char') 是一个内置的 Python 函数,它返回作为参数的 Unicode 字符的相应整数
inWaiting() 给出 Pi 的输入缓冲区中的字节数
Pi 型号:A
操作系统:Raspbian wheezy
谢谢
【问题讨论】:
-
为什么你总是睡一秒钟,直到你读到下一个字符?我猜它应该在不工作的情况下工作。总是暂停一秒钟,你可能太慢了。
-
@Pyfisch 如果我不暂停,仍然会打印所有相同的数字,但速度要快得多。具体来说,每组七个数字(最后一个为零)一次全部打印出来,然后是接下来的七个,然后是接下来的七个,等等
-
当然它们的打印速度更快,因为您可以获得所有数据。否则,您会在接收到的数据中累积不断增长的延迟。
-
您的硬件描述含糊不清。这个“粒子计数器”有RS-232接口吗?您使用的是什么“TX、RX 和接地引脚”?您使用的是 RS-232 电平转换器(例如 MAX3232)板吗? “相反,Pi 使用直接串行数据读取每个字节并打印它的 unicode 字符号。” -- 这听起来不像是串行端口。此外,该陈述不是事实,而是您认为自己观察到的猜测。
-
@sawdust Met One 80080 两通道粒子计数器具有 RS-232 接口。在粒子计数器上,我使用引脚 3(RS-232 TX 输出)、5(RS-232 接地)、6(RS-232 RX 输入)。在 RPi 上,我使用引脚(板引脚编号)6(接地)、8(UART0_TXD)、10(UART0_RXD)。我将地线连接到地线,TX 连接到 RX,RX 连接到 TX。我没有使用电平转换器。我将编辑解释您评论的最后一部分的问题
标签: python serial-port raspberry-pi usb pyserial