串口通信在minicom中可以工作但在Python中不行。

4

我正在尝试与我的智能电表进行通信,但只能部分成功。 基本上,我通过FT232 USB-串口电缆从我的电表获取串行数据。 智能电表有一个数据记录器端口,每10秒发送一个电报消息(9600波特率,7个数据位,偶校验,1个停止位)。 我在minicom中使用的配置文件是:

pu port             /dev/ttyUSB0
pu baudrate         9600
pu bits             7
pu parity           E
pu stopbits         1
pu minit            ~^M~AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0^M

这个方法是可行的,我能够成功地接收到数据。但是我的目标是在Python中接收数据,因此我尝试了以下脚本。

import serial

ser = serial.Serial()
ser.baudrate = 9600
ser.bytesize=serial.SEVENBITS
ser.parity=serial.PARITY_EVEN
ser.stopbits=serial.STOPBITS_ONE
ser.xonxoff=0
ser.rtscts=0
ser.timeout=20
ser.port="/dev/ttyUSB0"

ser.close()
ser.open()
print ("Waiting for P1 output on "  + ser.portstr)

counter=0
#read 20 lines    
while counter < 20:
    print ser.readline()
    counter=counter+1

try:
    ser.close()
    print ("Closed serial port.")
except:
    sys.exit ("Couldn't close serial port.")

这似乎不起作用,只是在20秒后超时。我也尝试使用“ cu”并输入以下命令:cu -l /dev/ttyUSB0 -s 9600 -oe。
我发现当运行Python脚本,然后运行Minicom脚本时,Python脚本会得到所需的数据。我还尝试将初始化字符串更改为“”,这有效,但如果我根本不设置它,Minicom也无法获取数据。
有人有任何想法吗?

1
你能发布一下minicom脚本吗?我猜它可能执行了某些打开端口的操作,而你的Python代码没有执行。或者,它是以root权限运行的吗? - adrianmcmenamin
@adrianmcmenamin 我没有使用任何脚本来运行minicom,我只需要通过运行> minicom smartmconfig来“运行”配置文件。 - user2826436
我尝试过了,没有任何区别。我真的很苦恼。 - user2826436
好的,那么我想知道问题是否在于minicom初始化字符串 - 你说如果你先运行minicom它就能工作?那么我猜 ^MAT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0^M 与此有关。很久以前我玩过调制解调器,所以很抱歉不能提供更多帮助。 - adrianmcmenamin
尝试使用Python发送一个空字符串,看看会发生什么? - adrianmcmenamin
显示剩余3条评论
2个回答

1
我遇到了同样的问题,结果发现我的传输设备没有按行传输,而是逐个字符传输。
使用:
bytesToRead = ser.inWaiting()
ser.read(bytesToRead)

允许数据开始流入。

0
类似的问题,我能读取智能电表,但有50%的时间它不工作。 从20行中,只能读取前15行。第15到20行被忽略。
这是我的解决方案使用cu并捕获输出。
#!/usr/bin/python

# test voor cu -l /dev/ttyUSB0 -s 9600 --parity=none

import time
import os
import signal
import sys
import subprocess
from subprocess import Popen, PIPE

line = ''
teller = 0
stack = []
#Use a process group so as to enable sending a signal to all the process in the groups.
process = subprocess.Popen('cu -l /dev/ttyUSB0 -s 9600 --parity=none', shell=True, stdout=PIPE, bufsize=1, preexec_fn=os.setsid)

while teller < 20:
    line = process.stdout.readline()
    stack.append(line)
    print str(teller) + ' ' + line
    teller = teller + 1

#time.sleep(15)

os.killpg(process.pid, signal.SIGTERM) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接