- Samsung Galaxy A33 5G - a három az majdnem öt
- iPhone topik
- Motorola Moto Tag - nyomom, követ
- India felől közelít egy 7550 mAh-s Redmi
- Samsung Galaxy S23 Ultra - non plus ultra
- Android alkalmazások - szoftver kibeszélő topik
- Magisk
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Xiaomi Watch 2 Pro - oké, Google, itt vagyunk mi is
- Yettel topik
-
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 string
else {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
- i5-13600KF, RX 9070, DDR5 32GB, 1 TB M.2, Fractal North TG és sok garancia
- Logitech Combo Touch iPad Pro 11" (1., 2. a 3. gen), szürke - UK billentyűzet ipad tok billentyűzet
- újszerű iPad Pro 11" (3. generációs) (2021) M1 chip Wi-Fi 128GB silver ezüst Apple
- szinte új iPhone 16 Pro Max 256GB desert titanium sivatagi titán független Apple 3 év garancia
- újszerű iPhone 16 Pro 256GB white titanium fehér titán iStyle független Apple 3 év garancia
- Asus TUF A15 FA507NU - 15.6"FHD IPS 144Hz - Ryzen 7 7735HS - 8GB - 512GB - RTX 4050 -2.5 év gari
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RX 9070 XT GAMER PC termékbeszámítással
- AKCIÓ! MSI B550 R7 3700X 16GB DDR4 512GB SSD RTX 3060Ti 8GB Rampage SHIVA Seasonic 650W
- Apple iPhone SE 2020 64GB, Yettel függő, 1 Év Garanciával
- ÁRGARANCIA! Épített KomPhone Ryzen 7 9700X 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest