我正在尝试使用PySerial从我的Windows 7 PC连接到我的手机,代码如下:
import wmi
import serial
c = wmi.WMI()
modem = c.query("SELECT * FROM Win32_POTSModem").pop()
ser = serial.Serial(modem.AttachedTo, modem.MaxBaudRateToSerialPort)
try:
ser.write('at \r\n')
print ser.readline()
finally:
ser.close()
Run Code Online (Sandbox Code Playgroud)
但是在写调用上得到以下错误:
Traceback (most recent call last):
File "D:\Alasdair\Documents\Python Scripts\Phone Interface\test.py", line 14, in <module>
ser.write('at \r\n')
File "C:\Python26\Lib\site-packages\serial\serialwin32.py", line 255, in write
raise SerialException("WriteFile failed (%s)" % ctypes.WinError())
SerialException: WriteFile failed ([Error 6] The handle is invalid.)
Run Code Online (Sandbox Code Playgroud)
我已经尝试连接TeraTerm并且工作正常,因此与手机本身的连接不是问题.
我一直在寻找寻找解决方案的年代,但没有提出任何有效的方法.有任何想法吗?
我正在构建一个使用Python远程控制的机器人,通过简单的GUI通过Internet发送控制消息.
我的代码部分工作得很好,GUI和控制系统,但我被卡住了.我正在尝试使用视差ping传感器来获取Arduino Mega中对象信息的距离,并将该值发送到我的Python控制脚本以显示在远程GUI上.
我遇到的主要问题是如何集成将使用已建立的COM端口与Arduino的Python代码,并发送消息告诉Arduino轮询ping传感器,然后发送到将接收值的Python程序,然后让我将该值插入我的GUI.
我已经有了这个代码来控制Arduino,它可以用我简单的GUI工作.
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
from PythonCard import model
class MainWindow(model.Background):
def on_SpdBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
def on_FBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
ser.write('@')
ser.write('F')
ser.write(chr(spd))
def on_BBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
ser.write('@')
ser.write('B')
ser.write(chr(spd))
def on_LBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
ser.write('@')
ser.write('L')
ser.write(chr(spd))
def on_RBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
ser.write('@')
ser.write('R')
ser.write(chr(spd))
def on_SBtn_mouseClick(self, event):
spd = self.components.SpdSpin.value
ser.write('@')
ser.write('S')
ser.write('0')
def on_PngDisBtn_mouseClick(self, event):
ser.write('~')
ser.write('P1')
ser.write('p2')
app = model.Application(MainWindow)
app.MainLoop() …Run Code Online (Sandbox Code Playgroud) 我知道有很多讨论,但我还有一个问题.我正在尝试使用pyserial通过pyserial将十六进制值发送到我的设备
command="\x89\x45\x56"
ser.write(command)
Run Code Online (Sandbox Code Playgroud)
但是我一直收到错误说 string argument without encoding.有人知道如何解决这个问题吗?
我在列出可用的串口时遇到问题,我真的需要帮助调试这个.在Python 2.7.5中,正确列出了COM端口,而PySerial在Python 3.3.5中返回一个空列表.
我发现另一个孤独的灵魂在互联网上遇到同样的问题(没有答案),但这个问题似乎并不受欢迎 - 也许这是我的系统?
我正在使用Mac OS X 10.9.2并通过自制软件安装了python和python3.我刚才更新了一切.PySerial在pip和pip3都是2.7版本.
输出:
Python 2.7.5 (default, Nov 4 2013, 18:04:45)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from serial.tools import list_ports
>>> list_ports.comports()
[['/dev/cu.Bluetooth-Incoming-Port', 'n/a', 'n/a'], ['/dev/cu.Bluetooth-Modem', 'n/a', 'n/a']]
Python 3.3.5 (default, Mar 10 2014, 13:25:50)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from serial.tools import list_ports
>>> …Run Code Online (Sandbox Code Playgroud) 我用python withPyserial来使用串口,代码是这样的:
import serial
portName = 'COM5'
ser = serial.Serial(port=portName)
# Use the serial port...
Run Code Online (Sandbox Code Playgroud)
但是,问题是,如果端口已经打开(由另一个应用程序为例),我得到一个错误,当我尝试打开它,如:"SerialException: could not open port 'COM5': WindowsError(5, 'Access is denied.')"。
我想知道我是否可以在尝试打开端口之前打开它以避免此错误。我想使用一种条件并仅在可以时打开它:
import serial
portName = 'COM5'
if portIsUsable(portName):
ser = serial.Serial(port=portName)
# Use the serial port...
Run Code Online (Sandbox Code Playgroud)
编辑:
我找到了一种方法:
import serial
from serial import SerialException
portName = 'COM5'
try:
ser = serial.Serial(port=portName)
except SerialException:
print 'port already open'
# Use the serial port...
Run Code Online (Sandbox Code Playgroud) 我正在尝试发送以下ASCII命令:close1
使用PySerial,下面是我的尝试:
import serial
#Using pyserial Library to establish connection
#Global Variables
ser = 0
#Initialize Serial Port
def serial_connection():
COMPORT = 3
global ser
ser = serial.Serial()
ser.baudrate = 38400
ser.port = COMPORT - 1 #counter for port name starts at 0
#check to see if port is open or closed
if (ser.isOpen() == False):
print ('The Port %d is Open '%COMPORT + ser.portstr)
#timeout in seconds
ser.timeout = 10
ser.open()
else:
print ('The Port %d is closed' %COMPORT) …Run Code Online (Sandbox Code Playgroud) 我构建了一个脚本(Windows 7,Python 2.7)来列出串行端口,但我正在寻找具有特定名称的设备。我的脚本:
import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
print(p)
Run Code Online (Sandbox Code Playgroud)
这将返回:
COM3 - Intel(R) Active Management Technology - SOL (COM3)
COM6 - MyCDCDevice (COM6)
COM1 - Communications Port (COM1)
>>>
Run Code Online (Sandbox Code Playgroud)
伟大的!但是,我希望这个脚本能够自动从一堆中挑选出 MyCDCDevice 并连接到它。我试过:
import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
if 'MyCDCDevice' in p:
print(p)
// do connection stuff to COM6
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我怀疑是因为 p 不完全是一个字符串,而是某种对象?
无论如何,解决这个问题的正确方法是什么?
谢谢!!
我编写了一个程序来从串行发送和接收数据,但是我有一个问题,我想创建一个函数“connect()”或一个类,当我按下一个按钮时,该函数被执行,但是如果我创建“MainWindow”类中的这个函数,“TestThread”类中的变量“ser”未初始化,你能帮帮我吗?
import sys
import serial
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.uic import loadUi
ser = serial.Serial('/dev/tty.usbmodem14201', 9600, timeout=1)
class TestThread(QThread):
serialUpdate = pyqtSignal(str)
def run(self):
while ser.is_open:
QThread.sleep(1)
value = ser.readline().decode('ascii')
self.serialUpdate.emit(value)
ser.flush()
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
loadUi('/Users/bogdanvesa/P2A_GUI/mainwindow.ui', self)
self.thread = TestThread(self)
self.thread.serialUpdate.connect(self.handleSerialUpdate)
self.connect_btn.clicked.connect(self.connectSer)
self.lcd_EBtn.clicked.connect(self.startThread)
def startThread(self):
self.thread.start()
def handleSerialUpdate(self, value):
print(value)
self.lcd_lineEdit.setText(value)
def main():
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试编写一个模块,该模块可以让我通过读取和发送数据pyserial。我必须能够并行读取主脚本中的数据。随着计算器用户的帮助下,我有一个基本的和工作框架方案,但是当我尝试添加一个类我创建了一个使用pyserial(句柄找到端口,速度等),发现在这里我得到以下错误:
File "<ipython-input-1-830fa23bc600>", line 1, in <module>
runfile('C:.../pythonInterface1/Main.py', wdir='C:/Users/Daniel.000/Desktop/Daniel/Python/pythonInterface1')
File "C:...\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:...\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Daniel.000/Desktop/Daniel/Python/pythonInterface1/Main.py", line 39, in <module>
p.start()
File "C:...\Anaconda3\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "C:...\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:...\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:...\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
reduction.dump(process_obj, to_child)
File "C:...\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用pySerial==3.4,并发现相当缺乏的文档serial.Serial.flush():
文件类对象的刷新。在这种情况下,请等待所有数据写入。
问题
flush而不是单独重置输入/输出缓冲区?serial = Serial("COM3")
# Option 1
serial.flush()
# Option 2
serial.reset_input_buffer()
serial.reset_output_buffer()
Run Code Online (Sandbox Code Playgroud)
相关问题
pyserial ×10
python ×9
python-3.x ×4
serial-port ×3
arduino ×1
flush ×1
hardware ×1
macos ×1
pickle ×1
pyqt5 ×1
python-2.7 ×1
pythoncard ×1
windows ×1