Hirdetés
- Ennyiért vehetjük meg az első vízhűtéses gaming mobilt az EU-ban
- Android alkalmazások - szoftver kibeszélő topik
- iPhone topik
- Google Pixel topik
- Motorola Edge 70 - többért kevesebbet
- Milyen okostelefont vegyek?
- 7000 mAh-s aksit kapott a Motorola Moto G57 Power
- Samsung Galaxy S21 FE 5G - utóirat
- Fotók, videók mobillal
- Xiaomi 15T Pro - a téma nincs lezárva
-
Mobilarena
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Blasius
tag
válasz
vargalex
#19710
üzenetére
Na, tálalhatóbb formába hoztam a kódot. Íme:
const byte numChars = 128;char receivedChars[numChars];bool newData = false;void setup() {// put your setup code here, to run once:Serial.begin(9600);Serial.println("<Johet>");}void loop() {// put your main code here, to run repeatedly:recvWithStartEndMarkers();showNewData();}void showNewData() {if (newData == true) {Serial.print("new data came:");Serial.println(receivedChars);newData = false;}}void recvWithStartEndMarkers() {static boolean recvInProgress = false;static byte ndx = 0;static byte ndxmea = 0;byte endKa = 0x0a;byte startKa = 0x24;byte starKa = 0x2a;byte nmea = 0x00;char rc;char nmeaRd[2];long nmeaRdL;bool inhibi = false;while (Serial.available() > 0 && newData == false) {rc = Serial.read();if (recvInProgress == true) {if (rc != endKa) {//delay(2);//?????????????????????????????????????????????????????????????????if (inhibi == true) {nmeaRd[ndxmea]=rc; ndxmea++;}else if (rc == starKa) {inhibi = true;}else if (inhibi == false){nmea ^=rc; receivedChars[ndx] = rc; ndx++;//delay(1);//?????????????????????????????????????????????????????????????????if (ndx >= numChars) {ndx = numChars - 1;}}}if (rc==endKa) {nmeaRd[2] = '\0';char * pEnd;nmeaRdL = strtol(nmeaRd, &pEnd, 16);if (nmeaRdL==nmea){receivedChars[ndx] = '\0';} // terminate the stringelse {memset(receivedChars, '0', 6); receivedChars[7] = '\0';}recvInProgress = false;ndx = 0;ndxmea = 0;newData = true;nmea =0;inhibi=false;}}else if (rc == startKa) {recvInProgress = true;}}}A második függvényben lévő késleltetések (...delay(x)/???...) nélkül a kód nem megy rendesen. Viszont, ahogy Aryes tippelte, a késleltetéssel jól megy. Ha késleltetések helyett sorosra írás lenne akkor is menne jól. Hát, kicsit tákolt, de megy. Gondolom erre mondják hogy nem egy robosztus kód
. De most már kíváncsi vagyok hogy mi lehet ennek a furcsa viselkedésnek az oka
.
(nmea ...^=rc... az egyfajta crc számítás. A startKa karakter utáni karakterekre kell számolni. Aztán a soroson jön egy * (starKa), egy byte két karakter hex ascii-ként (00-FF, ez a crc) majd egy 0x0a karakter (sorvég). Ha a számolt és fogadott crc egyezik, akkor kiírja sorosra ami jött ahogy van. Ha a crc nem stimmel akkor kinullázza az első pár karaktert.)
Ez egy rendes arduino unon fut (atmega chip). -
Blasius
tag
Igen, egy delay(5) segített. Még egy másik helyen a kódban előfordult egy hasonló eset. Azta... itt ilyenek vannak?
@Janos250
volatile char receivedChars[numChars]; el nem fordult le. (A volatile nem tudom pontosan mit csinál).A kód soros partról olvas. Van egy függvény ami karakterenként beolvassa ami a soros porton van. Ezeket hozzá csapja char receivedChars[numChars] -hoz (még néhány más dolog is történik, crc számítás stb) Ha jött egy 0x0a a soroson, az adat fogadás befejezettnek tekintett, és a függvény egy boolt átvált igazról hamisra. Egy másik függvény kezd valamit a beolvasott receivedCharsal, majd visszaváltja a boolt. A második függvénynél reklamált a fordító a volatile miatt. A hármas példa alapján indultam el. https://forum.arduino.cc/t/serial-input-basics-updated/382007
-
Blasius
tag
Sziasztok,
Nagyon különös problémával találkoztam. Nézzétek meg az alábbi kódrészletet. Ha a kódot úgy futtatom hogy a soroson író részeket kikommentelem, "nmea" nem számolódik jól. Ha a sorosra írás nincs kikommentelve, akkor "nmea" jól számolódik
. Erre nem tudok gombot varrni. Jópár órám ráment mire rájöttem hogy ezzel van a hiba... Van valakinek esetleg ötlete hogy mi történik itt?...else if (inhibi == false){nmea ^=rc; receivedChars[ndx] = rc; ndx++;Serial.print(" nmea in calc ");Serial.println(nmea, HEX);Serial.print(" inhibi in nmeabuild: ");Serial.println(inhibi);Serial.print(" rc recorded ");Serial.println(rc);if (ndx >= numChars) {ndx = numChars - 1;}}...A kódrészlet egy függvény része.
Az érintett változók a függvényen belül vannak definiálva a következõképpen:bool inhibi = false;byte nmea = 0x00;char rc;static byte ndx = 0;Kivéve ez, ami a kód legelején van, mert máshol is elérhetõ kell hogy legyen:
char receivedChars[numChars];
Új hozzászólás Aktív témák
- Hyundai, Kia topik
- A fociról könnyedén, egy baráti társaságban
- Luck Dragon: Asszociációs játék. :)
- HiFi műszaki szemmel - sztereó hangrendszerek
- Azonnali alaplapos kérdések órája
- TCL LCD és LED TV-k
- Formula-1
- Proxmox VE
- Ennyiért vehetjük meg az első vízhűtéses gaming mobilt az EU-ban
- Suzuki topik
- További aktív témák...
- Samsung Galaxy S25 Ultra 256Gb
- Nyugatinál új és újszerű gyönyörű Ps4 / Playstation 4 Kontrollerek, tartozékok
- Apple iMac 21.5" (2017) Kétmagos i5-7360U 2.3Hz 8GBGB/ 256GB SSD , üzletből, garanciával
- -- KISHIBÁS!!! -- PRÉMIUM S1700 Verhetetlen áron? -- IGEN -- OEM Asus Prime Z690 Ingyen Fox -- IGEN
- Macbook Pro 2019 Laptop A2141 i9
- Eladó Realme gt neo 2 5g Dobozában tokkal
- BESZÁMÍTÁS! GIGABYTE X570 AORUS ELITE X570 alaplap garanciával hibátlan működéssel
- GYÖNYÖRŰ iPhone 12 64GB Black-1 ÉV GARANCIA - Kártyafüggetlen, MS3653,100% Akkumulátor
- Samsung Galaxy A16 / 4/128GB / Kártyafüggetlen / 12Hó Ganacia / BONTATLAN NULL Perces!
- GYÖNYÖRŰ iPhone 12 Pro 128GB Graphite-1 ÉV GARANCIA - Kártyafüggetlen, MS3669, 100% Akksi
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest
. De most már kíváncsi vagyok hogy mi lehet ennek a furcsa viselkedésnek az oka
.
. Erre nem tudok gombot varrni. Jópár órám ráment mire rájöttem hogy ezzel van a hiba... Van valakinek esetleg ötlete hogy mi történik itt?
ekkold

