如何解决使用QSerialPort更改arduino值以使用python进行绘图
以this question和this question为基础,我正在尝试将值发送到arduino,以使用arduino代码更改值以使用matplotlib和pyqt5进行绘图(使用引脚11和A0之间的RC电路) ,因此建议使用here,将其DC设置为A0,在这里,我将进一步研究python代码可能出现的错误),
int PinOutput = 11;
int PinInput = A0;
int inph;
int inpl;
int input;
void setup() {
// put your setup code here,to run once:
Serial.begin(9600);
pinMode(PinInput,INPUT);
pinMode(PinOutput,OUTPUT);
delay(100);
}
void loop() {
// put your main code here,to run repeatedly:
if(Serial.available())
{
input = Serial.read();
}
else
{
input = 255;
}
inpl = analogRead(PinInput)/4;
Serial.println(inpl);
analogWrite(PinOutput,input);
delay(100);
inph = analogRead(PinInput)/4;
Serial.println(inph);
analogWrite(PinOutput,input/2);
delay(100);
}
和python代码
import sys
from PyQt5 import QtCore,QtWidgets,QtSerialPort
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
class SerialManager(QtCore.QObject):
valueChanged = QtCore.pyqtSignal(float)
def __init__(self,parent=None):
super().__init__(parent)
self.serial_port = QtSerialPort.QSerialPort("COM3")
self.serial_port.setBaudRate(QtSerialPort.QSerialPort.Baud9600)
self.serial_port.errorOccurred.connect(self.handle_error)
self.serial_port.readyRead.connect(self.handle_ready_read)
self.serial_port.open(QtCore.QIODevice.ReadWrite)
def handle_ready_read(self):
while self.serial_port.canReadLine():
codec = QtCore.QTextCodec.codecForName("UTF-8")
line = codec.toUnicode(self.serial_port.readLine()).strip().strip("\x00")
try:
value = float(line)
except ValueError as e:
print("error",e)
else:
self.valueChanged.emit(value)
def handle_error(self,error):
if error == QtSerialPort.QSerialPort.NoError:
return
print(error,self.serial_port.errorString())
def send(self,value):
self.serial_port.write(value.text().encode())
class MainWindowm(QtWidgets.QMainWindow):
def __init__(self,*args,**kwargs):
super(MainWindowm,self).__init__(*args,**kwargs)
self.canvas = FigureCanvasQTAgg(Figure(figsize=(5,4),dpi=100))
self.setCentralWidget(self.canvas)
self.axes = self.canvas.figure.subplots()
n_data = 10
self.xdata = list(range(n_data))
self.ydata = [0 for i in range(n_data)]
def update_plot(self,value):
self.ydata = self.ydata[1:] + [value]
self.axes.cla()
self.axes.plot(self.xdata,self.ydata,"r")
self.canvas.draw()
class Ui_MainWindow(object):
def setupUi(self,MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(325,300)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(110,20,61,16))
self.label.setObjectName("label")
self.textEdit = QtWidgets.QLineEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(90,60,104,71))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(100,150,75,23))
self.pushButton.setObjectName("pushButton")
self.pushButton2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton2.setGeometry(QtCore.QRect(100,200,100,23))
self.pushButton2.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0,325,21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self,MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow","test window"))
self.label.setText(_translate("MainWindow","pyqt5 tests"))
self.textEdit.setPlaceholderText('enter text')
self.pushButton.setText(_translate("MainWindow","plot button"))
self.pushButton.clicked.connect(self.display)
self.pushButton.clicked.connect(self.plot)
self.pushButton2.setText(_translate("MainWindow","update plot button"))
self.pushButton2.clicked.connect(self.write)
def plot(self):
self.w = MainWindowm()
self.w.show()
manager.valueChanged.connect(self.w.update_plot)
def display(self):
print(self.textEdit.text())
def write(self):
manager.send(self.textEdit)
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self,parent=None):
super().__init__(parent)
self.setupUi(self)
def update_text(self,value):
self.label.setNum(value)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
manager = SerialManager()
w1 = MainWindow()
w1.show()
manager.valueChanged.connect(w1.update_text)
sys.exit(app.exec_())
因此,我尝试使用“绘图”按钮开始绘图,然后使用“更新绘图”按钮对其进行更新以绘制新值。但是,当我输入一个值并按“更新绘图”按钮时,当我尝试输入数字时(它在DC值之间振荡),所有绘图都停滞不前,并且绘图不使用新值进行更新。任何有关如何使arduino更新和绘制新值的想法都将有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。