LÄSA string genom serial (Arduino)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Manneh
Inlägg: 151
Blev medlem: 15 juli 2012, 22:52:44
Ort: Sundsvall

LÄSA string genom serial (Arduino)

Inlägg av Manneh »

Tjabba, jag har precis fått hem en gsm modul med en Siemens TC35 á la denna

Modulen har stöd för UART och jag har kopplat ihop modulen och arduinon.

Fungerar skitbra med exempelkoden på denna hemsida dock så är allt hårdkodat. Jag vill kunna skriva dessa strängar direkt.

Får inte till det att skicka en string vidare till modulen. Jag vill antingen kunna skicka en string alternativt låta allting bara åka rakt igenom arduinon.

Testat med saker liknande:
gsmSerial.println(string med värden från diverse sensorer);
Detta fungerar ej.
Skicka en bokstav som char och göra en iteration fungerar bra, precis som i exempelkoden men det är inte riktigt så jag vill ha det.

Jag vill helst inte få allt upplagt på ett silverfat så ett exempel där jag kan skicka en string via Softwareserial duger. Implementeringen i mitt projekt står jag själv för :) Man vill ju lära sig något på kuppen, hehe ;)
Senast redigerad av Manneh 9 november 2012, 23:28:25, redigerad totalt 1 gång.
Användarvisningsbild
Klas-Kenny
Inlägg: 11842
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Skicka string genom serial (Arduino)

Inlägg av Klas-Kenny »

I exempelkoden skickar de ju strängar, fungerar det inte att göra så?

Dvs.

Kod: Markera allt

gsmSerial.print(variabel_innehållande_den_sträng_du_vill_skicka);
Manneh
Inlägg: 151
Blev medlem: 15 juli 2012, 22:52:44
Ort: Sundsvall

Re: Skicka string genom serial (Arduino)

Inlägg av Manneh »

Oj... Det är jag som ställer fel frågor.

Strängen ska alltså komma ifrån datorn. Så det är LÄSA en string som är problemet :doh: . Suttit och försökt så länge nu så jag blandade ihop det hela.

Jag har testat denna kod:

Kod: Markera allt

char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void setup() {
    Serial.begin(9600);
    Serial.write("Power On");
}

char Comp(char* This) {
    while (Serial.available() > 0) // Don't read unless
                                   // there you know there is data
    {
        if(index < 19) // One less than the size of the array
        {
            inChar = Serial.read(); // Read a character
            inData[index] = inChar; // Store it
            index++; // Increment where to write next
            inData[index] = '\0'; // Null terminate the string
        }
    }

    if (strcmp(inData,This)  == 0) {
        for (int i=0;i<19;i++) {
            inData[i]=0;
        }
        index=0;
        return(0);
    }
    else {
        return(1);
    }
}

void loop()
{
    if (Comp("m1 on")==0) {
        Serial.write("Motor 1 -> Online\n");
    }
    if (Comp("m1 off")==0) {
        Serial.write("Motor 1 -> Offline\n");
    }
}
Detta fungerar men jag kan inte skicka vidare Comp då detta är en funktion och inte en sträng.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: LÄSA string genom serial (Arduino)

Inlägg av Icecap »

Det var då ett knöligt sätt att göra det hela på...

Först en liten sak som gör livet mycket enklare: Byt
if(index < 19) // One less than the size of the array
med
if(index < (sizeof(inData) - 1)) // One less than the size of the array
Då kan man ändra allokeringen av inData allt man vill utan att skulle leta upp alla referenser, det justerar sig själv helt enkelt. Inget problem just här men i riktigt många avseenden är det extremt mycket bättre att använda sizeof() som bas.

Om Serial.available() går aktiv bara när det finns en byte att hämta har du besvär!
* Först töms inbuffern och det går fort, mycket fortare än 9600 baud som är 960 bytes/sekund, alltså en dryg ms per byte. Under den tid har Serial.available() hunnit blivit kollat och släckt många gångar. Alltså fungerar inte den while()-sats.
* Du begär inte att den ska skicka strängen vidare, du frågar den om huruvida en av två texter finns. Vad är det du vill?
Manneh
Inlägg: 151
Blev medlem: 15 juli 2012, 22:52:44
Ort: Sundsvall

Re: LÄSA string genom serial (Arduino)

Inlägg av Manneh »

Jag vill till och börja med styra modulen som om det inte fanns någon arduino. Precis som om det vore ren RS232.

Allt som åker in i terminalen ska direkt in i modulen och allt som kommer ur modulen ska rakt in i terminalen. Om jag har fattar det hela rätt så måste arduinon först läsa strängen, sedan skicka vidare samma sträng. Detta ska då göras så smärtfritt som möjligt.
Användarvisningsbild
adent
Inlägg: 4245
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: LÄSA string genom serial (Arduino)

Inlägg av adent »

Som sagt, jag kan inget om arduino, men principen borde väl vara:

while(1)
{
if(serial1.available())
serial2.write(serial1.read());
if(serial2.available())
serial1.write(serial2.read());
}

Fast tyckte read-"metoden" läser en byte och write skriver en sträng?

//Mikael
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: LÄSA string genom serial (Arduino)

Inlägg av stekern »

Icecap skrev:Först en liten sak som gör livet mycket enklare: Byt
if(index < 19) // One less than the size of the array
med
if(index < (sizeof(inData) - 1)) // One less than the size of the array
Då kan man ändra allokeringen av inData allt man vill utan att skulle leta upp alla referenser, det justerar sig själv helt enkelt. Inget problem just här men i riktigt många avseenden är det extremt mycket bättre att använda sizeof() som bas.
Ska man vara petnoga så ska du använda sizeof(inData)/sizeof(inData[0]), det gör ju givetvis ingen skillnad i det här fallet eftersom sizeof(inData[0]) == 1,
men skall man lära ut, så är det väl lika bra att lära ut det generella fallet istället för undantaget.
Skriv svar