我正在尝试使用python和PySerial编写一个在Linux PC中使用串行端口的应用程序.但是在这台PC中还有其他使用串口的应用程序.在尝试使用之前,如何知道其他应用程序是否已打开某个端口?
谢谢
我在使用pySerial的Windows和Linux下遇到串行IO问题.使用此代码,设备永远不会收到命令和读取超时:
import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
ser.write("get")
ser.flush()
print ser.read()
Run Code Online (Sandbox Code Playgroud)
此代码第一次超时,但后续迭代成功:
import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
while True:
ser.write("get")
ser.flush()
print ser.read()
Run Code Online (Sandbox Code Playgroud)
有谁能说出发生了什么?我试图添加一个对sync()的调用,但它不会将串行对象作为它的参数.
谢谢,罗伯特
我已经编写了一些代码来模拟我正在使用的一些硬件并将其上传到Arduino板.这段代码有效.我知道这一点,因为我得到了HyperTerminal的预期响应.
但是,当我尝试使用PySerial进行连接时,连接不会出错,但我对我发送的命令没有响应.
为什么会这样?
Python代码
import serial
def main():
sp = serial.Serial()
sp.port = 'COM4'
sp.baudrate = 19200
sp.parity = serial.PARITY_NONE
sp.bytesize = serial.EIGHTBITS
sp.stopbits = serial.STOPBITS_ONE
sp.timeout = 0.5
sp.xonxoff = False
sp.rtscts = False
sp.dsrdtr = False
sp.open()
sp.write("GV\r\n".encode('ascii'))
value = sp.readline()
print value
sp.write("GI\r\n".encode('ascii'))
value = sp.readline()
print value
sp.close()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
注意:Arduino上的代码在对\r\n命令的响应结束时发回.
超级终端配置:

我发现如果我将超时增加到10秒并sp.readline()在发送任何内容之前添加一个,那么我会得到对这两个命令的响应.
PySerial与Arduino或USB RS-232端口之间通常有多长时间的硬件握手?
我正在尝试用Python编写一个程序,它将循环以检查串行端口(COM4)并在从串行端口读取字符"1"时打印出一条消息.我想通过按下按钮从Arduino小工具的串口发送"1".
但是,当我尝试创建一个串行对象的实例时,我收到错误"[错误5]:访问被拒绝".(它自动尝试在实例化时打开,这是错误的位置,从我在PySerial包中处理此文件的文件中可以看到.)
我的代码:
c = serial.Serial('COM4', 9600)
while True:
signal = c.read()
print signal
print "running"
time.sleep(2)
c.flushOutput()
Run Code Online (Sandbox Code Playgroud)
它永远不会超过"c = serial.Serial('COM4',9600).这就是错误弹出的地方.我该如何解决这个问题?
我是Python的新手.根据互联网,我在收到此错误后正在寻找模块pyserial:
ImportError: No module named serial
Run Code Online (Sandbox Code Playgroud)
我第一次尝试安装pywin32,它进展顺利.但它似乎不包含pyserial.:-(
然后我找到了pyserial的单个模块安装程序,我无法安装它,它说它没有在注册表中找到python的路径.:-(
之后我在python.org上找到了这个模块,但我不知道该怎么做,它没有安装程序.:-(
如何在Windows 7 64上将pyserial添加到Python(64)2.7 ?
我想通过串口与手机通信.在给手机写了一些命令之后,我常常ser.read(ser.inWaiting())得到它的返回值,但我总是得到了总1020 bytes的字符,实际上,期望的回报应该结束了50KB.
我试图设置ser.read(50000),但解释器将继续.
如何扩展输入缓冲区以立即获得所有返回?
是否可以使用PySerial实现全双工通信?具体来说,是否可以在需要时连续监视端口以进行输入和写入?我想应该可以使用线程(并且串行接口是全双工的吗?).如果没有,那么在不传输时监控串口的最佳方法是什么?超时?
编辑:这是我的尝试.此代码针对TI的CC2540蓝牙LE芯片.在发送GATT初始化消息时,我期待一个回复(详细说明芯片的操作参数)......我什么都没得到
import serial
import threading
from time import sleep
serial_port = serial.Serial()
GAP_DeviceInit = \
"\x01\x00\xfe\x26\x08\x03\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
def read():
while True:
data = serial_port.read(9999);
if len(data) > 0:
print 'Got:', data
sleep(0.5)
print 'not blocked'
def main():
serial_port.baudrate = 57600
serial_port.port = '/dev/ttyACM0'
serial_port.timeout = 0
if serial_port.isOpen(): serial_port.close()
serial_port.open()
t1 = threading.Thread(target=read, args=())
while True:
try:
command = raw_input('Enter a command to send to the Keyfob: \n\t')
if (command == "1"):
serial_port.write(message)
except KeyboardInterrupt:
break
serial_port.close()
Run Code Online (Sandbox Code Playgroud) 我已经看到许多使用串口的代码示例,人们说他们也在使用代码.问题是,当我尝试代码时,它不起作用.
import serial
ser = serial.Serial(
port=0,
baudrate=9600
# parity=serial.PARITY_ODD,
# stopbits=serial.STOPBITS_TWO,
# bytesize=serial.SEVENBITS
)
ser.open()
ser.isOpen()
print(ser.write(0xAA))
Run Code Online (Sandbox Code Playgroud)
它给我的错误是:"SerialException:Port已经打开".是我使用python3.3的问题还是我需要安装一些额外的东西?有没有其他方法可以使用Python端口与Python3.3?
我目前正在构建一台使用Arduino Mega2560作为其主控制器的机器.Arduino连接到串行,获取命令,执行它并每隔1ms吐出一堆测量数据.我有一个运行Python的Raspberry Pi,为用户提供了一个很好的GUI来发送命令,并以可读的形式呈现数据.
我面临的问题是:Arduino能够每毫秒吐出15个字节的数据(因此只有15kbyte/s),但我正在运行的代码每10毫秒只能处理大约15个字节,所以1.5kB/s .
当我跑步时cat /dev/ttyACM0 > somefile,我很好地看到了所有的数据点.
我有以下精简的Python代码
# Reset Arduino by starting serial
microprocBusy = True
serialPort = serial.Serial("/dev/ttyACM0", baudrate=460800, timeout=0)
time.sleep(0.22);
serialPort.setDTR(False);
time.sleep(0.22);
serialPort.setDTR(True);
time.sleep(0.10);
logfile = open(logfilenamePrefix + "_" + datetime.datetime.now().isoformat() + '.txt', 'a')
# Bootloader has some timeout, we need to wait for that
serialPort.flushInput()
while(serialPort.inWaiting() == 0):
time.sleep(0.05)
# Wait for welcome message
time.sleep(0.1)
logfile.write(serialPort.readline().decode('ascii'))
logfile.flush()
# Send command
serialPort.write((command + '\n').encode('ascii'))
# Now, receive data
while(True):
incomingData = serialPort.readline().decode('ascii')
logfile.write(incomingData) …Run Code Online (Sandbox Code Playgroud) 我已经编写了一些代码来使用相同的 HC-12 433Mhz 收发器在两个 Raspberry Pi 之间进行通信。我能够使用直接串行连接和echo/成功地在两个 Pi 之间进行回声cat,但是我无法使用 HC-12s 进行复制,理论上它的工作原理类似。我在ttyAMA0此示例中使用了两个端口,但ttyS0也可用,并且尝试了这些端口的每种组合。
以下代码对发送和接收都是通用的,为了简洁起见,只写了一次:
import serial
import time
ser = serial.Serial(
port = "/dev/ttyAMA0",
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)
print("Serial status: " + str(ser.isOpen()))
Run Code Online (Sandbox Code Playgroud)
这是发送程序:
while True:
print("Sending...")
ser.write("hello\n".encode())
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
和接收程序:
while True:
print("Receiving...")
data = ser.readlines()
print(data.decode())
Run Code Online (Sandbox Code Playgroud)
发送程序只是按预期循环,但接收器打印“正在接收...”,然后什么也没有。
当我键盘在那时中断接收程序时,它说它当前已达到data = ser.readlines().
任何帮助将不胜感激 - 上周我大部分时间都在拖网和筋疲力尽的论坛和自述文件中无济于事,这实际上是我的最后选择。在这一点上我接近疯狂!
pyserial ×10
python ×8
serial-port ×3
arduino ×2
buffer ×1
python-3.3 ×1
raspberry-pi ×1
windows ×1
windows64 ×1