Search
Cvičení zaměřené na komunikaci mezi Qt a externím zařízením v podobě Nuclea po sériové lince. Nucleo se zde chová jako generátor signálu posílaný po sériové lince s konfigurací:
Verze Qt 6 už má v sobě zabudovanou knihovnu sériové linky, kterou lze přidat přes hlavičkový soubor #include <QtSerialPort/QSerialPort>. Nesmíme zapomenout zahrnout knihovnu serialport do překladu, která se přidá do řádku kompilace QT v projektovém souboru .pro, např. QT += core gui serialport.
#include <QtSerialPort/QSerialPort>
QT += core gui serialport
Jelikož používáme pro vykreslení grafu QtCharts, je třeba zahrnout ještě knihovnu charts, takže výsledný řádek poté bude vypadat QT += core gui serialport charts
QT += core gui serialport charts
Qt Template osciloskopu
Zkompilovaný soubor pro Nucleo s procesorem STM32F401RE
Příkazy, kterými lze nastavit chod jednoduchého osciloskopu je vždy zakončen novým řádkem \n.
\n
start
adc
stop
fvz=x
x
fper=x
tim_rst
Přijatá data jsou ve tvaru t.tttt, yyyy;\n, kde
t.tttt, yyyy;\n
t.tttt
yyyy
Kód pro procesory STM32 můžete nahrát pomocí programu STM32CubeProgrammer, který lze stáhnout z https://www.st.com/en/development-tools/stm32cubeprog.html
Pro nahrání kódu postupujte následovně:
Erasing & Programming
Start Programming
Možné řešení rozhodně není optimální, protože využívá funkci delay - lépe by bylo využít časovač, který by vracel v přesný časový okamžik hodnotu vzorku. Pro demonstrační účely je ale tato varianta dostatečná.
class Generator { int prodleva, status, f; double cas; public: Generator(): status(0), cas(0), f(10), prodleva(100) {} void tick() { cas += prodleva/1000.; if (status) { Serial.print(cas); Serial.print(", "); Serial.print(int(1000*sin(6.28*cas))); Serial.println(";"); } delay(prodleva); } void start() {status = 1;} void stop() {status = 0;} void reset() {cas = 0;} void setFR(int fr) {f = fr;} void setSR(int sr) {prodleva = 1000/sr;} }; void setup() { Serial.begin(115200); } Generator g; void loop() { if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); int ind = cmd.indexOf('='); if (ind > 0) { String cmd1 = cmd.substring(0, ind); int value = cmd.substring(ind+1).toInt(); if (cmd1 == "fvz") g.setSR(value); else if (cmd1 == "fper") g.setFR(value); } if (cmd == "start") g.start(); else if (cmd == "stop") g.stop(); else if (cmd == "tim_rst") g.reset(); } g.tick(); }
Program je možné otestovat na platformě Wokwi.