Sida 1 av 1

LÄSA string genom serial (Arduino)

Postat: 9 november 2012, 23:01:09
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 ;)

Re: Skicka string genom serial (Arduino)

Postat: 9 november 2012, 23:08:53
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);

Re: Skicka string genom serial (Arduino)

Postat: 9 november 2012, 23:13:57
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.

Re: LÄSA string genom serial (Arduino)

Postat: 9 november 2012, 23:57:16
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?

Re: LÄSA string genom serial (Arduino)

Postat: 10 november 2012, 00:00:44
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.

Re: LÄSA string genom serial (Arduino)

Postat: 10 november 2012, 01:07:51
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

Re: LÄSA string genom serial (Arduino)

Postat: 10 november 2012, 06:00:10
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.