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
.
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
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
.
start
- spouští odesílání dat sinusovky
adc
- spouští odesílání dat z analogového vstupu
stop
- zastavuje odesílání dat
fvz=x
- vzorkovací frekvence v Hz, kde x
je frekvence od 1 do 100 Hz (víc nestíhá Qt zpracovat bez redukce dat)
fper=x
- frekvence periodického signálu v Hz, kde x
je frekvence od 1 do 10 Hz
tim_rst
- resetování času
Přijatá data jsou ve tvaru t.tttt, yyyy;\n
, kde
t.tttt
je čas v sekundách od začátku od spuštění zařízení nebo resetu času, yyyy
je poté naměřená hodnota nebo hodnota posílaného signáluKó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
a vyčkat, než se program nahraje
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.