我正在使用pyserial与嵌入式设计进行通信.
ser = serial.Serial(PORT, BAUD, timeout = TOUT)
ser.write(CMD)
z = ser.readline(eol='\n')
Run Code Online (Sandbox Code Playgroud)
因此,我们将CMD发送到设备,并以一个以a结尾的变量长度字符串进行回复 '\n'
如果设计不能重播然后readline()超时和z=''
如果设备中断或崩溃,它将发送数据然后readline()超时,z将是一个没有'\n'结束的字符串.
readline()除了检查z的状态之外,还有一种很好的方法可以检查是否超时.
我需要列出或枚举现有的串口,直到现在我使用这个方法enumerate_serial_ports(),但它不能与Windows 7一起工作.你知道一些替代方法如何在Windows 7下找到可用的串口?
def enumerate_serial_ports():
""" Uses the Win32 registry to return an
iterator of serial (COM) ports
existing on this computer.
"""
path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
except WindowsError:
raise IterationError
for i in itertools.count():
try:
val = winreg.EnumValue(key, i)
yield str(val[1])
except EnvironmentError:
break
Run Code Online (Sandbox Code Playgroud)
我得到了IterationError

我一直试图在过去的两天里运行以下两行Python代码,但没有取得多大成功:
import serial
ser = serial.Serial(0)
Run Code Online (Sandbox Code Playgroud)
每次运行它,我都会收到以下错误:
Traceback (most recent call last):
File "./test.py", line 4, in <module>
ser = serial.Serial(0)
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 280, in open
self._reconfigurePort()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 308, in _reconfigurePort
raise SerialException("Could not configure port: %s" % msg)
serial.serialutil.SerialException: Could not configure port: (5, 'Input/output error')
Run Code Online (Sandbox Code Playgroud)
我正在运行Ubuntu 11.10 64位,Pyserial 2.5(python-serial 2.5-2.1)和Python 2.7(python 2.7.2-7ubuntu2),我的用户是拨出组的成员.
我也在运行Ubuntu 11.10 64位,使用相同版本的Python和Pyserial,并且似乎没有出现问题.欢迎任何建议 - 我很沮丧......
谢谢,多纳
我觉得这个问题真的很傻,但是我很震惊我无法找到一个我能想象的最简单的例子来与Arduino进行交谈.我有一个连接设置,我知道如何编写Arduino代码和Python,但我不知道如何使用python写入arduino引脚.任何人都可以通过这个例子向我指出一个位置或者告诉我它是如何完成的吗?
我有一个Arduino板通过串行端口发送数据,还有一条Python代码读取该数据。Arduino开发板只是发送它从TMP36传感器读取的温度,当我使用Arduino IDE随附的端口监视器检查端口时,我看到以下内容:
20.3
20.3
20.2
20.2
...
Run Code Online (Sandbox Code Playgroud)
这是完全正确的。现在,当我使用Python读取串行端口时,我得到以下信息:
b'20.32\r\n'
b'20.32\r\n'
b'20.32\r\n'
b'20.80\r\n'
...
Run Code Online (Sandbox Code Playgroud)
那件事是做什么的?如何处理字符串,以便正确显示数字?
这是我正在使用的代码:
import serial
ser = serial.Serial('/dev/ttyACM0', 9600)
while True:
message = ser.readline()
print(message)
Run Code Online (Sandbox Code Playgroud)
道歉,如果这是一个愚蠢的问题,但我是Arduino,Python和串行编程的新手:)
关于GUI编程,我几乎是一个初学者。我将QT与python绑定(PyQT4)结合使用。
我正在尝试做的是:
QThread使用pyserial读取和写入串行端口的端口。QThread。并通过QThread信号从接收串行数据
。我基于此代码(Link)开始了自己的测试实现。在此之前,我阅读了有关QThread的基础知识,并试图了解如何使用它们。以下测试代码是我提出的。对不起,我试图将其保持在最低水平,但仍然是75行代码:
from PyQt4 import QtCore, QtGui
import time
import sys
class SerialData(QtCore.QObject):
def __init__(self, message):
super(SerialData, self).__init__()
self.__m = message
def getMsg(self):
return self.__m
class SerialCon(QtCore.QObject):
finished = QtCore.pyqtSignal()
received = QtCore.pyqtSignal(SerialData)
def init(self):
super(SerialCon, self).__init__()
# TODO setup serial connection:
# setting up a timer to check periodically for new received serial data
self.timer = QtCore.QTimer()
self.timer.setInterval(400)
self.timer.timeout.connect(self.readData)
self.timer.start(200)
# self.finished.emit()
def readData(self):
self.received.emit(SerialData("New …Run Code Online (Sandbox Code Playgroud) 我已经阅读了文档,但似乎无法找到一个直接的答案.我有连接到计算机的调制解调器使用的所有COM端口的列表.从这个列表中,我尝试打开它,向它发送一个命令,如果它返回任何内容,则将其添加到另一个列表中.我不完全确定我正在使用pyserial的读写函数.
i=0
for modem in PortList:
for port in modem:
try:
ser = serial.Serial(port, 9600, timeout=1)
ser.close()
ser.open()
ser.write("ati")
time.sleep(3)
print ser.read(64)
if ser.read(64) is not '':
print port
except serial.SerialException:
continue
i+=1
Run Code Online (Sandbox Code Playgroud)
我没有从ser.read()中得到任何东西.我总是得到空白的字符串.
你如何确定导致PySerial写入超时的原因?我遇到一个问题,PySerial Write timeout在运行一段可变的时间后开始抛出异常.它可以正常运行几分钟(大约200字节/秒),然后失败.
所有握手都被禁用.
在写入超时之前,我观察到TX数据引脚上没有更多数据.几秒钟后,超时开始.如果我禁用writeTimeout,那么代码会持续运行,而TX引脚上没有发送新数据.
我在pySerial代码中看到它只是将写入的数据传递给一个os.write()调用.什么会导致这种情况可靠地超时?什么会导致它没有超时,但不会在输出引脚上显示任何数据?
有关我的申请的具体信息如下:
我通过FTDI适配器将数据发送到Arduino板(模拟一些动态像素伺服器).我正在使用逻辑分析仪监视rx/tx线路,因此我可以看到实际通过FTDI适配器实现的是什么.
我在VM中运行Ubuntu 14.04.
代码来自ROS的Dynamixel Controller节点.我一直在进行小的改动以调试问题.
Write方法,添加了用于调试的print语句:
def __write_serial(self, data):
print "TX"
if self.ser is None:
print "not open"
self.ser.flushInput()
self.ser.flushOutput()
try:
n = self.ser.write(data)
print n
except Exception as e:
print e
Run Code Online (Sandbox Code Playgroud)
读方法:
def __read_response(self, servo_id):
data = []
print "RX"
try:
data.extend(self.ser.read(4))
print data
if not data[0:2] == ['\xff', '\xff']:
print "RX ERR1"
raise Exception('Wrong packet prefix %s' % data[0:2])
data.extend(self.ser.read(ord(data[3])))
data = …Run Code Online (Sandbox Code Playgroud) 我有一个简单的类Connect,它在实例化时创建一个串行连接.
import serial
import serial.tools.list_ports_windows as list_ports
class Connect:
def __init__(self):
connect(self)
def connect(self):
self.ser = serial.Serial(port='COM1')
def disconnect(self):
self.ser.close()
def __del__(self):
self.disconnect()
del self.ser
Run Code Online (Sandbox Code Playgroud)
如果我创建了这个类的实例,然后以这样的方式销毁我的实例,即disconnect()和del()方法都不运行,那么端口仍将被绑定.因此,如果我再次尝试连接,则会出现以下异常:
SerialException: could not open port 'COM1': WindowsError(5, 'Access is denied.')
Run Code Online (Sandbox Code Playgroud)
我可以用我的代码断开串口,所以我可以用一个新的Connect实例重新连接它?
我安装了Python 3.6.1和PySerial。我正在尝试
我能够获得连接的比赛清单。我现在希望能够将数据发送到COM端口并接收回响应。我怎样才能做到这一点?我不确定接下来要尝试的命令。
码:
import serial.tools.list_ports as port_list
ports = list(port_list.comports())
for p in ports:
print (p)
Run Code Online (Sandbox Code Playgroud)
输出:
COM7-多产USB到串行通信端口(COM7)
COM1-通讯端口(COM1)
我从PySerial文档中看到打开COM端口的方式如下:
导入序列
>>> ser = serial.Serial('/dev/ttyUSB0') # open serial port
>>> print(ser.name) # check which port was really used
>>> ser.write(b'hello') # write a string
>>> ser.close() # close port
Run Code Online (Sandbox Code Playgroud)
我在Windows上运行,但出现以下行错误:
ser = serial.Serial('/ dev / ttyUSB0')
这是因为在Windows中'/ dev / ttyUSB0'没有意义。我可以在Windows中做什么?