我有一个简单的Python代码,可通过串行端口使用串行通信连接到Arduino板。
我正在使用Python库“ pyserial”。是Python2.7
我创建一个连接基本上是在做类似的事情
ser = serial.Serial("/dev/ttyACM0", 115200)
之后,我使用serial.write将命令发送到arduino板。我有一个自制固件,可以读取命令并移动一些电动机。
此代码正在运行,目前正在运行。尽管我每天都连接和断开几次,以使用机器人进行操作。我总是刷新所有内容(serial.flush)。在某些时候,它只是失败了。它似乎已连接,但未执行任何操作。就像串行端口在某个时候损坏了。
一旦重新启动计算机,一切正常。
任何想法,如何在不重新启动计算机的情况下进行修复?
拔下USB电缆不起作用。
我遇到的一个问题是我没有关闭串行连接:
ser.close()
这导致python进程没有关闭并阻止对串行连接的任何访问。pyserial可能会阻止进程死掉,因为它在后台启动了线程。
您可以使用兼容的库SerialTransfer.h和pySerialTransfer轻松强大地在Python和Arduino板之间进行连接和通信。这些库使用开始/结束标记,循环冗余检查,一致的开销字节填充和动态有效载荷长度来自动打包和解析串行数据包。
SerialTransfer.h可通过Arduino IDE的库管理器进行安装,而pySerialTrasnfer可通过pip安装。
Python范例:
from pySerialTransfer import pySerialTransfer as txfer
if __name__ == '__main__':
try:
link = txfer.SerialTransfer('COM13')
link.txBuff[0] = 'h'
link.txBuff[1] = 'i'
link.txBuff[2] = '\n'
link.send(3)
while not link.available():
if link.status < 0:
print('ERROR: {}'.format(link.status))
print('Response received:')
response = ''
for index in range(link.bytesRead):
response += chr(link.rxBuff[index])
print(response)
link.close()
except KeyboardInterrupt:
link.close()
Arduino示例:
#include "SerialTransfer.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
SerialTransfer myTransfer;
void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
myTransfer.begin(mySerial);
}
void loop()
{
myTransfer.txBuff[0] = 'h';
myTransfer.txBuff[1] = 'i';
myTransfer.txBuff[2] = '\n';
myTransfer.sendData(3);
delay(100);
if(myTransfer.available())
{
Serial.println("New Data");
for(byte i = 0; i < myTransfer.bytesRead; i++)
Serial.write(myTransfer.rxBuff[i]);
Serial.println();
}
else if(myTransfer.status < 0)
{
Serial.print("ERROR: ");
Serial.println(myTransfer.status);
}
}