python - 重置打开的串行端口

标签 python serial-port pyserial

我正在从 arduino 发送的串行端口读取数据。

我有两个文件,我分别使用它们来编写一些代码并尝试不同的东西。在其中一个中,我读取数据并使用 matplotlib 图形绘制它。在我使用完它后,它仍然连接到我的计算机并发送数据。所以,我需要做的是“重置”端口。也就是说,关闭打开的端口并再次打开它,并阻止它发送数据,这样我就可以使用 arduino 尝试对该文件的代码进行一些修改。

所以要做到这一点,我的意思是,为了重置端口,我创建了另一个文件并编写了以下代码:

import serial

print "Opening port"

try:
  serial_port = serial.Serial("com4", 9600)
  print "Port is open"

except serial.SerialException:
  serial.Serial("com4", 9600).close()
  print "Port is closed"
  serial_port = serial.Serial("com4",9600)
  print "Port is open again"

print "Ready to use"

但是这段代码似乎不起作用。端口仍然连接并发送数据。所以,这意味着我不能用我的代码关闭端口,然后再重新打开它。

我究竟做错了什么?如何阻止 arduino 发送数据?或者我怎样才能重置 thw arduino,也许?

希望您能够帮助我。

- - - 编辑 - - -

我完成了找出我遇到的真正问题,这不是我想的那样。问题不在于端口是开放的,尽管我使用了 close Pyserial 具有的功能。真实情况是端口正在按我的意愿关闭,但设备(arduino)仍在发送数据。所以,我改变了代码来重现这种情况。

这是代码:
print "Abriendo puerto"

ser = serial

try:
  ser = serial.Serial("com4", 9600, timeout = 1)
  serial_port = "Open"
  print "The port %s is available" %ser

except serial.serialutil.SerialException:
  print "The port is at use"

  ser.close()
  ser.open()

while ser.read():
  print "Sending data"

ser.setBreak(True)
time.sleep(0.2)

ser.sendBreak(duration = 0.02)
time.sleep(0.2)

ser.close()
time.sleep(0.2)
print "The port is closed"

exit()

使用此代码,我要做的是:

1)我打开串口

2)如果设备正在发送数据,我打印“发送数据”

3)1秒后,我尝试关闭端口并停止设备发送数据

我用 close 尝试了最后两件事关闭端口的函数,并阅读我尝试使用 setBreak 的文档和 sendBreak正如您在上面的代码中看到的(我故意留下它们)。但是设备仍在发送数据,这意味着代码不起作用。

那么,有没有办法告诉 arduino“停止发送数据”,或者我可以重置设备吗?

最佳答案

我做了一个非常相似的事情,成功的两种方式。

第一种方法是让Arduino连续发送数据。这里的问题是,当您的 python 代码唤醒并开始从串行端口读取时,Arduino 可能在其程序中的任何位置。简单的解决方案是修改 Arduino 代码以发送某种“重启”行。在这种情况下,您的所有 python 代码需要做的就是等待“重启”,然后读取真实数据,直到它再次看到“重启”。我有嘈杂的行,所以我的代码通过多个周期读取(和解析)以确保它获得良好的数据。

resetCount = 0;
while resetCount < 3:
    line = s.readline().rstrip("\r\n")
    if string.find(line, "restart") != -1 :
        resetCount += 1
    elif resetCount > 0 :
        fields = string.split(line, " ")
        dict[fields[0]] = fields

第二种方法是使用 Arduino 实现命令响应协议(protocol),其中 Arduino 仅在请求时发送数据。在这种情况下,您的 python 代码向 Arduino 发送命令(下例中的“RT”),然后从 Arduino 读取数据,直到它看到“完成”行或超时。
        dict = {}
        regex = re.compile('28-[0-9A-Fa-f]{12}') # 28-000005eaa80e

        s = serial.Serial('/dev/ttyS0', 9600, timeout=5)
        s.write("RT\n");

        while True:
            line = s.readline().rstrip("\r\n")
            print line
            if string.find(line, "completed") != -1:
                break;

            fields = string.split(line)
            if (regex.match(fields[0]) != None and len(fields) == 4) :
                dict[fields[0]] = fields
        s.close()

关于python - 重置打开的串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36869394/

相关文章:

python - 如何在 PyBox2D 中绘制圆形

c# - SerialPort.ReadLine() 返回垃圾

python - pySerial:刷新 vs reset_input_buffer + reset_output_buffer

python - 在 Tkinter 中隐藏 TreeView 项目

python - Read-the-docs 构建失败, "cannot import name ' PackageFinder' from 'pip._internal.index'"

python - 哥德巴赫 Python 输出

linux - Linux 的 PySerial "better"端口名称?

java - 从串口读取

c++ - 无法打开 UART。确保它没有被其他应用程序使用

python - PySerial [错误 5] 访问被拒绝