Blandade C++ frågor, nybörjarnivå
Re: Blandade C++ frågor, nybörjarnivå
> hur kommer man då åt en variabel i ett annat scope?
Det kan du inte med mindre än det andra "scopet" har
tillåtit det genom att den "global", hur nu det görs...
Däremot kan du ju alltid se variabler "uppåt", så att säga.
Det är enbart när du har en egen med samma namn som
du måste skriva lite speciellt för att komma runt det.
Det kan du inte med mindre än det andra "scopet" har
tillåtit det genom att den "global", hur nu det görs...
Däremot kan du ju alltid se variabler "uppåt", så att säga.
Det är enbart när du har en egen med samma namn som
du måste skriva lite speciellt för att komma runt det.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Blandade C++ frågor, nybörjarnivå
God kväll,
efterfrågar lite hjälp för att få nedan att fungera.
Har "överkommenterat" lite för att visa hur jag tänker.
Funktionen går ut på att kolla den inkommande USART-datan och om denna matchar ordet "Start", så ska texten skrivas ut.
Det närmsta jag kommer är att jag får ut rad efter rad av decimala motsvarigheten av S, t, a, r och t.
efterfrågar lite hjälp för att få nedan att fungera.
Har "överkommenterat" lite för att visa hur jag tänker.
Funktionen går ut på att kolla den inkommande USART-datan och om denna matchar ordet "Start", så ska texten skrivas ut.
Det närmsta jag kommer är att jag får ut rad efter rad av decimala motsvarigheten av S, t, a, r och t.
Kod: Markera allt
while (Serial.available()>0) { // Stay in function while data in the buffer
incomingData = Serial.read(); // Read buffer and add data to var
dataContent += incomingData; // Add data to string
if (dataContent == "Start") { // If string matches the characters Start, then
Serial.println("Communication started!"); // Print text on screen
dataContent = ""; // Delete string
}
}
Re: Blandade C++ frågor, nybörjarnivå
Hur är dataContent definierad? Notera att C (och inte väl heller C++)
har någon specifik datatyp av typen "string". dataContent borde vara
en pekare till början av en array som kan innehålla lite av varje...
har någon specifik datatyp av typen "string". dataContent borde vara
en pekare till början av en array som kan innehålla lite av varje...
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Blandade C++ frågor, nybörjarnivå
Du är nog något på spåret sodjan men jag förstår inte så mycket av det här med pekare än.
Variabeln är definerad som just string, så här -> String dataContent;
Hur mycket minne som allokeras till en string vet jag inte.
Datan som jag ska matcha är bara orden "Start" och "Stop" och då borde Start bli störst. Klurade lite i dom här banorna innan men det tog helt enkelt stopp.
Start borde bli 5 bytes, dvs 40 bitar. Tyvärr lite för stort för en uint32_t och (precis här tog det stopp i tankeverksamheten).
Variabeln är definerad som just string, så här -> String dataContent;
Hur mycket minne som allokeras till en string vet jag inte.
Datan som jag ska matcha är bara orden "Start" och "Stop" och då borde Start bli störst. Klurade lite i dom här banorna innan men det tog helt enkelt stopp.
Start borde bli 5 bytes, dvs 40 bitar. Tyvärr lite för stort för en uint32_t och (precis här tog det stopp i tankeverksamheten).
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Blandade C++ frågor, nybörjarnivå
Om det är strcmp() som jämför blir "Stop" störst. Mina C++ kunskaper är i princip noll så det här kanske bara var nonsens.
Re: Blandade C++ frågor, nybörjarnivå
Ah, OK. Ja, Arduino har en inbyggd String objekttyp för att man ska
slippa att hålla på med pekare och så där. Tar lite mer minne och
sannolikt lite mer CPU, men så är det ju alltid...
Av vad jag förstår från denna sida:
https://www.arduino.cc/en/Tutorial/Stri ... nOperators
så ska man bl.a. göra
dataContent = String("");
för att ge en String ett värde. I detta fall en tom sträng.
Och "delete string" är lite fel, "empty string" kanske men
objektet dataContent finns ju ändå kvar.
slippa att hålla på med pekare och så där. Tar lite mer minne och
sannolikt lite mer CPU, men så är det ju alltid...

Av vad jag förstår från denna sida:
https://www.arduino.cc/en/Tutorial/Stri ... nOperators
så ska man bl.a. göra
dataContent = String("");
för att ge en String ett värde. I detta fall en tom sträng.
Och "delete string" är lite fel, "empty string" kanske men
objektet dataContent finns ju ändå kvar.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Blandade C++ frågor, nybörjarnivå
Hehe, ja säkert. Men jag är tacksam för allt gratis jag kan få i nuläget
lillahuset fick mig och kika närmre på det här med strcmp() och efter en massa googlande och modifierande så lyckades jag faktiskt få ihop nedan. Och som fungerar som tänkt.
Ser ni något riktigt tokigt?

lillahuset fick mig och kika närmre på det här med strcmp() och efter en massa googlande och modifierande så lyckades jag faktiskt få ihop nedan. Och som fungerar som tänkt.
Ser ni något riktigt tokigt?
Kod: Markera allt
void doCheckSerialCom() {
uint8_t bytesReceived;
char dataString [11];
bool startCmd;
bool stopCmd;
if(Serial.available() > 0) {
bytesReceived = Serial.readBytesUntil (13,dataString,10);
dataString[bytesReceived] = 0;
startCmd = strcmp (dataString, "Start");
stopCmd = strcmp (dataString, "Stop");
if (startCmd == 0) {
Serial.println("Communication started!");
} else if (stopCmd == 0) {
Serial.println("Communication stopped!");
} else {
Serial.println("Either Start or Stop the serial communication");
}
}
}
Re: Blandade C++ frågor, nybörjarnivå
Ja, det är ju det klassiska sättet, utan String objektet.
Ska det inte vara :
"Neither Start or Stop the serial communication"?
Ska det inte vara :
"Neither Start or Stop the serial communication"?
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Blandade C++ frågor, nybörjarnivå
Jo jag bytte till det klassiska sättet. Lite mer hardcore, eller vad det är man brukar säga...
Nja, det var bara något jag drog till med. "Antingen Starta eller Stoppa den seriella kommunikationen". Typ att det bara fungerar med Start eller Stop. "Varken Starta eller Stoppa" låter konstigt tycker jag.
Nog om det, väldigt OT!
Nja, det var bara något jag drog till med. "Antingen Starta eller Stoppa den seriella kommunikationen". Typ att det bara fungerar med Start eller Stop. "Varken Starta eller Stoppa" låter konstigt tycker jag.
Nog om det, väldigt OT!
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Blandade C++ frågor, nybörjarnivå
Det är "helt OK" att skriva "if (startCmd == 0)" men bättre att skriva "if (0 == startCmd)". Om konstanten är till vänster om == får du ett kompileringsfel om du skriver =.
Sedan är resultatet av strcmp() en int inte en bool. http://linux.die.net/man/3/strcmp
Och sodjans invändning är riktig.
Sedan är resultatet av strcmp() en int inte en bool. http://linux.die.net/man/3/strcmp
Och sodjans invändning är riktig.

- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Blandade C++ frågor, nybörjarnivå
Ah! Där ser man. Så det kanske är anledningen varför man skriver så på en del ställen.
Själv tycker jag det känns bakvänt att skriva if(0 == startCmd) men det är klart, vänjer man sig vid det så.
Testade att kompilera if(startCmd = 0) och fick en varning, men inget fel.
Tänkte spara minne så valde bool men det kanske inte spelar någon roll i slutändan.
Hur kommer det sig förresten att kompilatorn inte skrek mig i örat när funktionen resulterar i en int men jag säger att det är en bool?
Själv tycker jag det känns bakvänt att skriva if(0 == startCmd) men det är klart, vänjer man sig vid det så.
Testade att kompilera if(startCmd = 0) och fick en varning, men inget fel.
Tänkte spara minne så valde bool men det kanske inte spelar någon roll i slutändan.
Hur kommer det sig förresten att kompilatorn inte skrek mig i örat när funktionen resulterar i en int men jag säger att det är en bool?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Blandade C++ frågor, nybörjarnivå
Boolen kanske är definierad som int.
Vad har du valt för nivå på varningar. Är det gcc så bör du välja minst "-Wall".
Vad har du valt för nivå på varningar. Är det gcc så bör du välja minst "-Wall".
Re: Blandade C++ frågor, nybörjarnivå
> "Antingen Starta eller Stoppa den seriella kommunikationen"
Men det var ju "Varken Starta eller Stoppa den seriella kommunikationen".
Det var inte "Start" och det var inte "Stopp" i strängen...
Men det var ju "Varken Starta eller Stoppa den seriella kommunikationen".
Det var inte "Start" och det var inte "Stopp" i strängen...
- Jan Almqvist
- Inlägg: 1652
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Blandade C++ frågor, nybörjarnivå
Att alltid ha konstanten till vänster är ganska praktiskt om man jobbar i flera/många olika språk där jämförelse_lika_med mellan två uttryck skrivs som "==" i vissa språk och som "=" i andra.lillahuset skrev:... men bättre att skriva "if (0 == startCmd)". Om konstanten är till vänster om == får du ett kompileringsfel om du skriver =.
Re: Blandade C++ frågor, nybörjarnivå
Tror texten var menad som en "hjälp" till användaren i andra änden om att de enda kommandonsodjan skrev:> "Antingen Starta eller Stoppa den seriella kommunikationen"
Men det var ju "Varken Starta eller Stoppa den seriella kommunikationen".
Det var inte "Start" och det var inte "Stopp" i strängen...
den förstår är "Start" och "Stopp", men jag håller med om att den är lätt att missförstå.
/johan