【问题标题】:How can I connect a serial device to a Raspberry Pi without a USB to serial adapter?如何在没有 USB 转串口适配器的情况下将串口设备连接到 Raspberry Pi?
【发布时间】: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


【解决方案1】:

可能有问题的一件事是 PI 串行引脚使用 3v3 逻辑而不是 5v。如果您的传感器以 5v 逻辑发送数据,它可能会干扰 PI。

另一件事你应该检查你是否在 ttyAMA0 上启用了一个 linux 终端会话。这是您可以在/boot/cmdline.txt中设置的选项

您可能会看到类似console=ttyAMA0,115200 的条目。删除它并重新启动。

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多