adatok fogadása Soros porton

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

adatok fogadása Soros porton

Hozzászólás Szerző: Kotesz »

Sziasztok!

DTH22 + Mini pro 168 páros méri a páratartalmat és hőmérsékletet. Ez küldi az eredményeket a soros portra.

Egy másik mini pro 328 -al szeretném fogadni az értékeket és egy kijelzőre kiíratni.

A fogadott adatokat szeretném egy tömbbe tárolni és onnan kiolvasni.
Ez szintaktikailag hogyan néz ki?
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: adatok fogadása Soros porton

Hozzászólás Szerző: Kotesz »

Kód: Egész kijelölése

#include "DHT.h"
#include <Wire.h>

#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }                          

   
  Serial.print(h);
  Serial.print(t);
    
  delay(300);
}
Ez a küldő
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: adatok fogadása Soros porton

Hozzászólás Szerző: Robert »

A probléma:
- hogyan jelzed, hogy adatkezdet?
- hol ér véget a pára ill a T adatérték?
- ezek hossza ismert-e?
- mikor van az adatvége?

A vételi oldalon:
- karakterek jönnek egymás után
- szöveg - szám konverzió kell, ha megvannak a limiter karakterek
- mi van ha:
- sérült a bejött adat? CRC vagy egyéb?
- megszakad és elveszik az előző adatsor vége és "ráindít" a chip (pl. reset volt).
http://www.tavir.hu - a gazda :)
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: adatok fogadása Soros porton

Hozzászólás Szerző: Kotesz »

Köszönöm az instrukciókat, hamarosan jövök a konkrét kérdéseimmel ezen instrukciók figyelembevételével.
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: adatok fogadása Soros porton

Hozzászólás Szerző: Kotesz »

Kód: Egész kijelölése

#include "DHT.h"
#include <Wire.h>

#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }                          

  Serial.print("H");
  Serial.println(h);
  Serial.print("T");
  Serial.println(t);
    
  delay(300);
}


Az adatok eleje és vége ismert mostmár.
Hogy tudom a bufferbe tárolni és visszaalakítani?
Előre is köszi a segítséget
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: adatok fogadása Soros porton

Hozzászólás Szerző: Robert »

Én pl. ilyen úton indulnék el:
1, string összeépítése
2, a bejövő adat stringből bányászat: adaott karakter hol van és darabolni így a stringet

1-2 egyben: amikor jön adat, egyből nézem hogy darabolni kell.-e:

Kód: Egész kijelölése

Data: servoId : Position & servoId : Position & servoId : Position
strchr(): search for a character in a C string (i.e. char *)
strtok(): splits a C string into substrings, based on a separator character
atoi(): converts a C string to an int
That would lead to the following code sample:

// Calculate based on max input size expected for one command
#define INPUT_SIZE 30
...

// Get next command from Serial (add 1 for final 0)
char input[INPUT_SIZE + 1];
byte size = Serial.readBytes(input, INPUT_SIZE);
// Add the final 0 to end the C string
input[size] = 0;

// Read each command pair 
char* command = strtok(input, "&");
while (command != 0)
{
    // Split the command in two values
    char* separator = strchr(command, ':');
    if (separator != 0)
    {
        // Actually split the string in 2: replace ':' with 0
        *separator = 0;
        int servoId = atoi(command);
        ++separator;
        int position = atoi(separator);

        // Do something with servoId and position
    }
    // Find the next command in input string
    command = strtok(0, "&");
}


illetve

Kód: Egész kijelölése

This function can be used to seperate a string into pieces based on what the separating character is.

String xval = getValue(myString, ':', 0);
String yval = getValue(myString, ':', 1);

Serial.println("Y:" + yval);
Serial.print("X:" + xval);
Convert String to int

int xvalue = stringToNumber(xval);
int yvalue = stringToNumber(yval);
This Chunk of code takes a string and separates it based on a given character and returns The item between the separating character

String getValue(String data, char separator, int index)
{
    int found = 0;
    int strIndex[] = { 0, -1 };
    int maxIndex = data.length() - 1;

    for (int i = 0; i <= maxIndex && found <= index; i++) {
        if (data.charAt(i) == separator || i == maxIndex) {
            found++;
            strIndex[0] = strIndex[1] + 1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
        }
    }
    return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

vagy

Kód: Egész kijelölése

void setup() {
    Serial.begin(9600);
}

void loop() {
    for(int i=1; i<=3; i++) {
        String servo = Serial.readStringUntil(':');
        if(servo != ""){
            //here you could check the servo number
            String pos = Serial.readStringUntil('&');
            int int_pos=pos.toInt();
            Serial.println("Pos");
            Serial.println(int_pos);
        }
    }
}

Arduino SPLIT-tel

Kód: Egész kijelölése

down vote
Here is Arduino method to split a String as answer to the question "How to split a string in substring?" declared as a duplicate of the present question.

The objective of the solution is to parse a series of GPS positions logged into a SD card file. Instead of having a String received from Serial, the String is read from file.

The function is StringSplit() parse a String sLine = "1.12345,4.56789,hello" to 3 Strings sParams[0]="1.12345", sParams[1]="4.56789" & sParams[2]="hello".

String sInput: the input lines to be parsed,
char cDelim: the delimiter character between parameters,
String sParams[]: the output array of parameters,
int iMaxParams: the maximum number of parameters,
Output int: the number of parsed parameters,
The function is based on String::indexOf() and String::substring() :

int StringSplit(String sInput, char cDelim, String sParams[], int iMaxParams)
{
    int iParamCount = 0;
    int iPosDelim, iPosStart = 0;

    do {
        // Searching the delimiter using indexOf()
        iPosDelim = sInput.indexOf(cDelim,iPosStart);
        if (iPosDelim > (iPosStart+1)) {
            // Adding a new parameter using substring() 
            sParams[iParamCount] = sInput.substring(iPosStart,iPosDelim-1);
            iParamCount++;
            // Checking the number of parameters
            if (iParamCount >= iMaxParams) {
                return (iParamCount);
            }
            iPosStart = iPosDelim + 1;
        }
    } while (iPosDelim >= 0);
    if (iParamCount < iMaxParams) {
        // Adding the last parameter as the end of the line
        sParams[iParamCount] = sInput.substring(iPosStart);
        iParamCount++;
    }

    return (iParamCount);
}
And the usage is really simple:

String sParams[3];
int iCount, i;
String sLine;

// reading the line from file
sLine = readLine();
// parse only if exists
if (sLine.length() > 0) {
    // parse the line
    iCount = StringSplit(sLine,',',sParams,3);
    // print the extracted paramters
    for(i=0;i<iCount;i++) {
        Serial.print(sParams[i]);
    }
    Serial.println("");
}
http://www.tavir.hu - a gazda :)
Válasz küldése