adatok fogadása Soros porton
adatok fogadása Soros porton
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?
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?
Re: adatok fogadása Soros porton
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);
}
Re: adatok fogadása Soros porton
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).
- 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
Re: adatok fogadása Soros porton
Köszönöm az instrukciókat, hamarosan jövök a konkrét kérdéseimmel ezen instrukciók figyelembevételével.
Re: adatok fogadása Soros porton
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
Re: adatok fogadása Soros porton
É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:
illetve
vagy
Arduino SPLIT-tel
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