【问题标题】:Pyserial reads data but does not writePyserial 读取数据但不写入
【发布时间】:2015-02-19 14:20:31
【问题描述】:

我有一个Digi Transport WR41 蜂窝路由器,它运行一个它自己的专有操作系统和一个 Python 2.6 解释器。路由器有一个串行端口 (RJ45),我已将它连接到 Windows 7 PC 上的串行端口 (DB9)。电缆布线是直通配置。

在PC上,我已经安装了RealTerm Serial Capture program并连接到COM1

我希望能够使用python(和pyserial)通过串行连接读取/写入数据。

我的python脚本非常基础:

import serial
ser = serial.Serial(port=0, baudrate=9600, parity=serial.PARITY_EVEN, timeout=1)
ser.write(‘hello world’)
#ser.read(1000)

当我从RealTerm 发送数据时,我可以通过ser.read(1000) 在python 中很好地读取它。这整天有效。

但是,当我尝试通过 ser.write('hello world') 从 python 发送数据时,我无法在 RealTerm 中看到它。

认为这可能是 RealTerm 问题,我在 PC 上尝试了其他模拟器/捕获程序:TeraTermSerial Port Monitor 6(由 Eltima 提供),但我从未看到数据显示。

Serial Port Monitor 6 是唯一显示某种活动的程序,但我仍然没有看到我的数据。我对串行通信知之甚少,无法理解输出,但摘录如下:

[19/02/2015 07:58:21] 
435 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM1) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request 
            Mask - 0x00000010 (EV_DSR) 
---------------------------------------------------------------------------------- 
[19/02/2015 07:58:21] 
437 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM1) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_WAIT_MASK - Request returns the event wait mask that is currently set on a COM port 
            Mask - 0x00000119 (EV_CTS | EV_DSR | EV_RING | EV_RXCHAR) 
---------------------------------------------------------------------------------- 
[19/02/2015 07:58:21] 
439 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM1) 
    STATUS_SUCCESS 
        IOCTL_SERIAL_GET_MODEMSTATUS - Request updates the modem status, and returns the value of the modem status register before the update 
            Modem Status - 0x00000080 (MS_RLSD_ON) 
----------------------------------------------------------------------------------

路由器有一个Bytes Sent 的计数器。每次我调用 ser.write('hello world') 时,我都会看到它增加了正确的字节数。

我在 SO 上查看了两个类似的问题:

我已验证设备、RealTerm 和 python 代码的波特率、奇偶校验、停止位、控制流等设置一致。

任何其他想法为什么与 pyserial 的串行通信只能以一种方式工作?为什么允许读取但不允许写入?

【问题讨论】:

    标签: python pyserial


    【解决方案1】:

    当我从 RealTerm 发送数据时,我可以通过 ser.read(1000) 在 python 中很好地读取它。这整天有效。

    但是,当我尝试通过 ser.write('hello world') 从 python 发送数据时,我无法在 RealTerm 中看到它。

    你确定你可以发送“hello world”,也许这只是被过滤了吗? 您是否尝试过使用其他命令或至少另一种编码格式?

    【讨论】:

    • 您能详细说明过滤的含义吗?至于编码格式,你的意思是:ser.write('hello world'.encode(utf-8))?
    • 过滤我的意思是,在我的软件上,如果我收到一个我不想要的帧,我就把它丢掉,也许路由器会做同样的事情。通过编码(取决于您的路由器,抱歉没有阅读文档)。仍然在我的软件上(使用嵌入式系统监控),我无法发送这样的字符串,我必须将它们转换为 Ascii 代码/十六进制/十进制也您可以通过这种方式检查串口是否“可写”:
    • code def wait_until_connection_available(self, timeout): while ((not self.serial_connection) or (not self.serial_connection.writable) or (not self.serial_connection.readable)) and timeout > 0 : timeout -= 10 time.sleep(.010) if timeout == 0: print('Connection not available : timeout') code 不使用 read(1000) 你可以:code data += self.serial_connection .read(self.serial_connection.inWaiting())code
    • 我尝试发送 modbus 指令(这最终是我想要完成的) - 类似于:modbus_packet = struct.pack(">HHHBBHH", TRANSACTION_ID, PROTOCOL_ID, LENGTH, UNIT_ID, FUNC_CODE , START_ADDR, QUANTITY) 后跟 ser.write(modbus_packet)。 TRANSACTION_ID、PROTOCOL_ID 等都是十六进制的。我仍然没有在 RealTerm 中收到消息。
    • 是否有可能(我知道这不太可能)您需要以行终止符结尾?如果你在端口上写“hello world\n”会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多