Sida 2 av 10

Re: Blandade C++ frågor, nybörjarnivå

Postat: 9 februari 2016, 15:55:10
av sodjan
> 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.

Re: Blandade C++ frågor, nybörjarnivå

Postat: 9 februari 2016, 23:00:03
av Magnus_K
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.

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å

Postat: 9 februari 2016, 23:05:06
av sodjan
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...

Re: Blandade C++ frågor, nybörjarnivå

Postat: 9 februari 2016, 23:13:34
av Magnus_K
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).

Re: Blandade C++ frågor, nybörjarnivå

Postat: 9 februari 2016, 23:25:13
av lillahuset
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å

Postat: 9 februari 2016, 23:32:54
av sodjan
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.

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 00:26:54
av Magnus_K
Hehe, ja säkert. Men jag är tacksam för allt gratis jag kan få i nuläget :wink:

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å

Postat: 10 februari 2016, 00:31:52
av sodjan
Ja, det är ju det klassiska sättet, utan String objektet.

Ska det inte vara :

"Neither Start or Stop the serial communication"?

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 00:38:11
av Magnus_K
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!

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 00:45:40
av lillahuset
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. :)

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 00:58:31
av Magnus_K
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?

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 09:05:10
av lillahuset
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".

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 10:55:15
av sodjan
> "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...

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 12:20:31
av Jan Almqvist
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 =.
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.

Re: Blandade C++ frågor, nybörjarnivå

Postat: 10 februari 2016, 13:03:45
av johano
sodjan 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...
Tror texten var menad som en "hjälp" till användaren i andra änden om att de enda kommandon
den förstår är "Start" och "Stopp", men jag håller med om att den är lätt att missförstå.

/johan