Teach ikasgaia
STM32 Mbed CodeIDE (4/8): serieko mezuen bidezko arazketa, printf erabiliz
Erabili printf bidezko serie-mezuak STM32 Mbed CodeIDEn, espero den portaera eta benetakoa alderatzeko eta desadostasun bat ebidentziaren arabera zuzentzeko.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
printf()erabiltzea martxan dagoen Mbed programa zer egiten ari den aztertzeko.Zenbaki osoak inprimatzea, koma higikorreko formaturik erabili gabe.
Serieko irteera erabiltzea erroreak bilatzeko, aldi bakoitzean aldaketa bakarra eginez.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Zertarako balio du serieko irteerak?
8 min
STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 4.a. LED batek ez dizu erakusten kodeak zer balio erabiltzen zituen zerbaitek huts egin duenean. Serie-kontsolak programaren barneko balioak ikusgai jartzen ditu, denboraren edo logikaren desadostasunak aurkitzeko. Inprimatutako denbora benetan behatutakoarekin alderatuko duzu.
Kontrolagailuak ez badu espero bezala jokatzen, serieko irteera lagungarria da: balioak eta programa zein puntutara iritsi den adierazten duten mezuak inprima ditzakezu.
printf("cycle=%d led=%d\n", cycle, led_state);
Mbed programa hauetan, printf() funtzioak martxan dagoen STM32 plakatik CodeIDEko serie-kontsolara bidaltzen du testua. %d bakoitzaren ordez zenbaki oso bat agertzen da, eta \n sekuentziak lerro berria hasten du, irakurketa bakoitza errazago kopiatzeko.
Ikastaro honetan zenbaki osoak erabiliko dituzu serieko irteeran. Laborategiko Mbed konfigurazioak ez du lehenespenez gaitzen printf("%f") bidezko koma higikorreko irteera. Erabili milisegundoak, milivoltak, ehunekoak edo graduak zenbaki oso gisa, dagokion eskala adieraziz.
Serieko irteera CodeIDEko laborategi-ikuspegiaren behealdeko kontsolan agertzen da. CodeIDEk kudeatzen ditu USB serie-konexioa eta komunikazio-abiadura; konpilatu, kargatu eta irakurri inprimatutako lerroak. Programa honetako cycle begiztaren iterazio kopurua da, ez piztu-itzali ziklo osoen kopurua; led, irteerari ezarritako 0/1 balioa; eta interval_ms, mezuak adierazitako tartea milisegundotan. Kopiatu lerroak agertu bezala eta azaldu esanahia euskaraz.
printf mezua CodeIDEko kontsolara iritsi arte
Compile konpilatzeko da; Upload, plakan kargatzeko. Kargatu ondoren, irakurri CodeIDEren behealdeko Console atala (kontsola): bertan agertzen dira plakak exekutatzen dituen printf() deien mezuak.
Zein egiaztapen da egokiena inprimatutako denbora-balioa benetako portaerarekin bat datorren jakiteko?
Erakutsi programak martxan jarraitzen duela
26 min
Aurreikusi bi konpilazio eta laborategiko 22 minutu aktibo inguru: nahita desadostasun bat duen bertsioa eta zuzendutako bertsioa. Ilararik badago, prestatu taula eta bost tarte kronometratzeko metodoa. Ez aldatu 1. bertsioa haren serieko eta kamerako ebidentzia lortu aurretik.
Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.
Ireki
main.cpp.Ordeztu fitxategia hurrengo programarekin, zehatz-mehatz. Nahita ez datoz bat programatutako itxaronaldia eta haren berri ematen duen mezua; ez zuzendu oraindik.
Gorde, konpilatu okerreko 1. bertsioa eta kargatu.
Ireki edo behatu CodeIDEko serie-kontsola.
Behatu serie-lerroak, eta egiaztatu
cyclekontagailua handitzen dela LEDaren egoera aldatzen den bitartean.Kopiatu gutxienez hiru serie-lerro, programa aldatu aurretik.
Kameran, kronometratu egoera-aldaketen arteko bost tarte jarraian, segundotan: hasi trantsizio batean eta gelditu beste bost trantsizioren ondoren. Zatitu denbora 5ez, tarte bakarraren iraupena estimatzeko.
Mantendu 1. bertsioa taula eta denboraren ebidentzia osatu arte.
Klase-saio batean erabilgarri
#include "mbed.h"
DigitalOut status_led(PB_5, 0);
int main() {
int cycle = 0;
const int interval_ms = 500;
const auto interval = 1000ms;
printf("STM32 Mbed serial debug start\n");
while (true) {
status_led = !status_led.read();
cycle = cycle + 1;
printf("cycle=%d led=%d interval_ms=%d\n", cycle, status_led.read(), interval_ms);
ThisThread::sleep_for(interval);
}
}
Lehen lerroek honelako itxura izan beharko lukete:
STM32 Mbed serial debug start
cycle=1 led=1 interval_ms=500
cycle=2 led=0 interval_ms=500
cycle=3 led=1 interval_ms=500
Bete hiru errenkada cycle=... lerro desberdinekin; ez erabili hasierako mezua. Itsatsi lerro osoa. Une horretako kamerako portaera eremuan, jaso gutxi gorabehera une berean ikusitako egoera edo aldaketa. Serieko eta kamerako atzerapenak desberdinak izan daitezke; ez aurresuposatu 0/1 balioek beti piztuta/itzalita esan nahi dutenik. Zer adierazten dit eremuan, idatzi ohar labur bat, adibidez «cycle kontagailua bat handitu da» edo «led balioa txandakatu da». Denbora baloratzeko, erabili hurrengo bost tarteen alderaketa. STM32 Mbed serial debug start hasierako mezuak programa abiarazi dela adierazten du.
Serieko ebidentzien taula
| Kopiatutako kontsola-lerroa | Une horretako kamerako portaera | Zer adierazten dit |
|---|---|---|
Okerreko 1. bertsiorako, erantzun hiru lerro hauekin:
Inprimatutako tartea: ... ms5 tarterako neurtutako denbora: ... sTarte bakarraren kalkulua: (... s / 5) × 1000 = ... ms
Ez proposatu oraindik zuzenketarik.
Aurkitu serie-mezuko desadostasuna
13 min
Diagnostikatu 1. bertsioa, serie-lerroa, kamerako neurketa eta kodeko bi denbora-konstanteak erabiliz.
Itsatsi 1. bertsioaren informazio okerra ematen duen serie-lerro bat. Adierazi mezuak dioen tartea eta kameran neurtutakoa, biak unitateekin. Identifikatu bat ez datozen kodeko bi adierazpenak. Ez sartu hemen zuzendutako bertsioaren ebidentzia.
Erantzun ondoren, ordeztu bi denbora-definizioak hurrengo txantiloiarekin. Konpilatzea eragozten duten bi hutsune ditu. Aukeratu 500 ms edo 1000 ms; bi TODOek iraupen bera adierazi behar dute. Bilatu TODO konpilatu aurretik, eta kendu edo berridatzi amaitutako TODO iruzkinak ere.
// 1: serie-lerroan inprimatutako milisegundoak, zenbaki oso gisa.
const int interval_ms = TODO_REPORTED_MS;
// 2: iraupen bera Mbed-en chrono literal gisa, ms atzizkiarekin.
const auto interval = TODO_WAIT_MS;
Gorde, konpilatu 2. bertsioa, kargatu eta errepikatu bost tarteen neurketa metodo berarekin. Zuzendutako ebidentzia jaso ondoren bakarrik, sakatu Marcar práctica como completada (markatu praktika amaitutzat). Kontsolan testurik agertzen ez bada, egiaztatu azken aldaketak gorde, konpilatu eta kargatu dituzula. Mantendu mezu laburrak eta irakurtzeko moduko 500 ms edo 1000 ms-ko erritmoa; ez erabili %f ikastaro honetan.
Zuzendutako 2. bertsiorako, erantzun formatu honekin:
Serie-lerroa: ...Inprimatutako tartea: ... ms5 tarterako neurtutako denbora: ... sTarte bakarraren kalkulua: (... s / 5) × 1000 = ... msOndorioa: bat datoz/ez datoz bat kameraren neurketa-ziurgabetasunaren barruan, zeren...
Bidali zure kodea
8 min
Erantsi gordetako azken main.cpp fitxategia
Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak), eta ziurtatu main.cpp fitxategiak zuzendu eta kargatu duzun bertsioa duela, TODO markarik gabe. Ondoren, sakatu Adjuntar código guardado (erantsi gordetako kodea) eta Enviar entrega (bidali lana).
Bihurtu aurrebista hau klase-saio batean
Jarraitu LabsLand Teach-era ikasgai hau ikasleekin erabiltzeko eta kontuaren sarbidea berrikusteko.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua