打开arduino nan的com端口时必须使用sleep with Pyserian

2024-10-01 07:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python2.7在windows10上运行pyserial(3.1.1)

更新-在Xubuntu16和Windows上运行相同的问题。在

我正在通过usb/串行接口,通过串行接口向arduino nano写入数据。在

我正在编写一个简单的字符串(例如“2+”)并读取arduino中的输出。如果我保留第一个时间。睡觉在打开com端口2秒后,它开始工作。如果我将其更改为1或将其删除,则arduino似乎收到了不同的字符/编码,并且它不起作用。在

理想情况下,我不想睡觉,这样可以更快地工作。我是不是做错了什么事,或者有更好的方法来消除睡眠或者至少减少睡眠?在

Python代码:

import sys, getopt
import time
import serial
ser = serial.Serial(
    port='COM3',
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS
)
time.sleep(1)  #change this to 2 and it works
ser.write('2+')
out = ''
time.sleep(1)
while ser.inWaiting() > 0:
    out += ser.read(1)
if out != '':
    print ">>" + out
else:
    print ">> nothing!"
time.sleep(1)   
ser.close()

Arduino代码(我对ASCII字符号也有一些小问题-我认为是字节的签名,但这是目前我遇到的最小问题)

^{pr2}$

}


Tags: 代码importtimewindowsserialsleepoutarduino
3条回答

打开串行连接时,是否可能自动重置Arduino?在

在Arduino Nano中,复位引脚通过C4连接到FTDI USB到串行转换器的DTR。见Arduino Nano Schematic。在

也许如果你移除C4或禁用DTR,你的问题就会消失。在

您可以通过在setup函数中输入一个短的LED脉冲来检查这一点,看看它是否在从Python程序打开串行端口之后发生。在

你假设如果有数据,那就是完整的数据。如果在传输部分对串行端口的处理方式有缓冲,则只能获得部分数据。在

您可以尝试在python代码中添加一个ser.flush(),但也应该检查所接收到的数据是否完整。您可以通过确保您的数据以已知字符结束并进行检查来做到这一点。在

请记住,您还应该有某种类型的超时,这样您就不会陷入某个读取循环中。在

另一个问题是,您正在读取char类型,但是Serial.read()实际上返回了一个int,根据{a1}。char数据类型的大小为1个字节,而{}的大小为2个字节,所以这可能就是为什么您会得到奇怪的东西(有一个引用here)。在

它还说read将只返回数据的第一个字节。所以,如果你想要第二个字节,你需要读两次。在

我找不到任何解决睡眠问题的方法。只有在至少允许1.5秒的情况下,arduino才会正确地接收到字节-大概是为了串行连接初始化。在

作为一种解决方法,我必须在启动时打开串行端口,然后通过套接字服务器接受和写入数据。这一招如期而至。问题似乎出在串行端口的打开上。在

import os, os.path
import time
import serial
import socket
import re

def sendData(msg):
    if not ser.is_open:
        ser.open()
    ser.write(msg)
    ser.flush()
    out = ''
    time.sleep(0.5)
    while ser.inWaiting() > 0:
        out += ser.read(1)
    if out != '':
        print ">>" + out
    else:
        print ">> nothing!"
    time.sleep(0.5) 

port='/dev/ttyUSB1',

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 9000))
serversocket.listen(1) # become a server socket, maximum 5 connections

ser = serial.Serial(
    port=port,
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS
)

while True:
    connection, address = serversocket.accept()
    buf = connection.recv(64)
    if len(buf) > 0:
        print buf
        sendData(buf)

相关问题 更多 >