Problem mit String

Antworten
geab
Beiträge: 6
Registriert: Mittwoch 24. April 2013, 22:48

Problem mit String

Beitrag von geab » Dienstag 13. Mai 2014, 16:19

Hej alle
seit kurzem habe ich Profilab Exp. und bin dabei die Daten von einen 8x8 pixel Thermosensor von Panasonic Grideye http://pewa.panasonic.com/components/bu ... /grid-eye/
graphisch darzustellen

Dazu habe ich den sensor über einen Arduino angebunden und den entsprechenden arduino code (siehe unten) aufgeladen.
Im serial window der Arduino IDE kann ich Daten für alle 64 pixel auslesen.

In Profilab habe ich das Arduino Beispiel aus dem Beispielfolder benutzt und vereinfacht.
Wenn ich die Daten daüber einlese bekome ich nicht alle Daten mit.

Bild

Wenn ich es im Arduino code simuliere (loop über 64 Datenpunkte) dann bekome ich ab:

00;23.00;24.00;25.00;26.00;27.00;28.00;29.00;30.00;31.00;......64.00;E;

Wenn ich die Anzahl der zu lesenden positionen mit in der Simulierung auf 40 begrenze bekomme ich alle:

0.00;1.00;2.00;3.00;4.00;5.00;6.00;7.00;8.00;9.00;10.00;11.00;12.00;13.00;14.00;15.00;16.00;17.00;18.00;19.00;20.00;21.00;22.00;23.00;24.00;25.00;26.00;27.00;28.00;29.00;30.00;31.00;32.00;33.00;34.00;35.00;36.00;37.00;38.00;39.00;E;

Gibt es eine Begrenzung der Stringlänge in der Com Übrtragung?

Gruss und Danke, Gernot
Grid eye com v1.prj
(3.18 KiB) 194-mal heruntergeladen

#include <Wire.h>

#define HEIGHT 8
#define WIDTH 8

byte pixelTempL;
byte pixelTempH;
int ledNum = 1;
char addr = 0x68;
int celsius;
float deccel;
byte array[HEIGHT*WIDTH];

void readFrame(byte *arr)
{
byte *pos;
byte *uBound;

pos = arr;
uBound = arr + (HEIGHT*WIDTH);

//First two data registers for the pixel temp data are 0x80 and 0x81
pixelTempL=0x80;
pixelTempH=0x81;

//Get Temperature Data for each pixel in the HEIGHT x WIDTH array. Will loop 64 times for Grid-eye
for(int pixel = 0; pixel < (HEIGHT*WIDTH); pixel++)
{
//Get lower level pixel temp byte
Wire.beginTransmission(addr);
Wire.write(pixelTempL);
Wire.endTransmission();
Wire.requestFrom(addr,1);
byte lowerLevel = Wire.read(); //
//Serial.println(lowerLevel);
//Get upper level pixel temp byte
Wire.beginTransmission(addr);
Wire.write(pixelTempH);
Wire.endTransmission();
Wire.requestFrom(addr,1);
byte upperLevel = Wire.read();
//Serial.println(upperLevel);
//Combine the two bytes together to complete the 12-bit temp reading
int temperature = ((upperLevel << 8) | lowerLevel);
//Temperature data is in two's compliment, do conversion.
if (upperLevel != 0)
{
temperature = -(2048 - temperature);
}
celsius = temperature*0.25;
deccel = temperature*0.25;
//Serial.print(celsius);
//Serial.print(";");
Serial.print(deccel);
Serial.print(";");
//*pos = celsius & 63;
*pos = celsius;
pos++;

//Go to next pixel by advancing both the low and high bit two register values
pixelTempL=pixelTempL+2;
pixelTempH=pixelTempH+2;
}
}

void setup()
{
Wire.begin();
Serial.begin(19200);
}

void loop()
{
int input;
float temp;
for(int pixel = 0; pixel < (40); pixel++) //gloops 64 times
{
temp = float(pixel); //generates a float value from int pixel
Serial.print(temp);
Serial.print(";");
}
Serial.println("E;"); //Used in Profilab as separator in COM receiving string
//readFrame(array);Function to read from the IR array 64 float values
delay(2000);
} //end loop

abacom
Site Admin
Beiträge: 3413
Registriert: Dienstag 23. September 2008, 10:54
Kontaktdaten:

Re: Problem mit String

Beitrag von abacom » Mittwoch 14. Mai 2014, 11:12

Ja, die gibt es. Shortstring=255 Zeichen.
Nach ca. 200 Zeichen sollte man also mal 'umbrechen'.
ABACOM support

geab
Beiträge: 6
Registriert: Mittwoch 24. April 2013, 22:48

Re: Problem mit String

Beitrag von geab » Donnerstag 15. Mai 2014, 08:15

abacom hat geschrieben:Ja, die gibt es. Shortstring=255 Zeichen.
Nach ca. 200 Zeichen sollte man also mal 'umbrechen'.
Danke für die Info

Ist es am besten den String in zwei Teilen einzulesen (Das kann ich ohne Probleme im Arduino code realisieren) und mit einer Hold funktion den ersten zu halten und dann wenn der zweite reinkommt zB 50 ms später diese mit Add funktion wieder zusammenzusetzen?

Als Alternative havbe ich auch die Buffer funktion gefunden.

Vielleicht hat jemand schon eine ähnliches Projekt realisert wo er über Zeit verschiede Strings einliest und die in einer Warteschleife hält.

gruss, Gernot

IKT
Beiträge: 553
Registriert: Mittwoch 4. November 2009, 18:32

Re: Problem mit String

Beitrag von IKT » Donnerstag 15. Mai 2014, 10:14

Hallo @alle,

Strings sind zwar einfach zu 'handhaben' aber eben auch 'ineffizient' sobald die Datenmenge grösser wird, z.B. dezinal -122 = 4 Byte 'String', aber NUR 1 Byte 'Numerisch'!

Da jeder beim ARDU sein 'eigenes' Protokoll schreiben kann, ist es zumindest die Überlegung Wert, evtl. die Werte numerisch zu übergeben ... dies kann den 'nach-behandlungs' Aufwand erheblich verringern ($Part etc.). Meine 5 Cent's ...
++++++
Gruss/regards IKT

Antworten

Zurück zu „Thema RS232“