Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: große Datenmengen über Ser.Schnittst. auslesen Kategorie: Programmierung (von wernerAZ - 21.04.2007 17:09)
Als Antwort auf Re: große Datenmengen über Ser.Schnittst. auslesen von André H. - 21.04.2007 15:34
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.1
Danke für deine Hilfe Andre'
, aber mittlerweile läut das Einlesen sehr gut.
Werde mir aber deinen Souce genauer ansehen, sieht interessant aus.
Mein Problem jetzt: Die Daten in einem Thread einlesen und aktualisieren
und im main Werte anzeigen und berechnen.

//Serielle Schnittstelle einlesen
//Modul v24, GPS-Signal formatiert

type gpsData
{
string kennung;
string zeit;
string status;
string breite;
string breiteB;
string laenge;
string laengeL;
string speed;
string grad;
string datum;
string gradM;
string direction;
string mode;
string checksum;
}

function auswertung(gpsData gps,byte buf[])
{
string s14[14];
int zaehler,pos;
pos=0;

for zaehler=0 ... 127
    {
    if buf[zaehler]=='*' & pos==13
       break;            //zaehler=255;      //Schleife verlassen
    else if buf[zaehler]=='$'
       {
       for pos=0 ... 13
           s14[pos]="";      //str.clear(s14[pos]); Werte werden nicht immer gelöscht
       pos=0;
       }
    else if buf[zaehler]==','
       pos=pos+1;
    else
       str.putchar(s14[pos],buf[zaehler]);
    }
if strx.comp("GPRMC",s14[0])
   {
   gps.kennung=s14[0];
   if str.length(s14[1])==10    //Gültigkeit prüfen
      gps.zeit=s14[1];          //und zuweisen
   gps.status=s14[2];
   if str.length(s14[3])==9
      gps.breite=s14[3];
   if str.length(s14[4])==1
      gps.breiteB=s14[4];
   if str.length(s14[5])==10
      gps.laenge=s14[5];
   if str.length(s14[6])==1
      gps.laengeL=s14[6];
   if str.length(s14[7])>3
      gps.speed=s14[7];
   if str.length(s14[8])>3
      gps.grad=s14[8];
   if str.length(s14[9])==6
      gps.datum=s14[9];
   }
}

function auslesen(gpsData gps,byte buf[])
{
byte buffer[1024];
byte c;
hwcom.setbuf(buffer,1024);
loop
  {
  wait hwcom.ready();
  c=hwcom.get();
  if c=='*'
     {
     hwcom.receive(buf,127,500);
     hwcom.send(buf,127);
     auswertung(gps,buf);
     //zeigeData(gps);
     hwcom.flush();
     }
  }
}

thread com
{
gpsData gps;
byte buf[255];
auslesen(gps,buf);
menu.location[1].breite=gps.breite;
menu.location[1].breiteB=gps.breiteB;
menu.location[1].laenge=gps.laenge;
menu.location[1].laengeL=gps.laengeL;
}


Hier das Hauptprogramm

string s,hs,s3;
float e;
//byte buf[255];

//hier gehts los
thread main
{
v24.gpsData gps0;
int i0,anzahlDaten;
anzeige.gradMemory=360;
anzeige.zeigerMemory=0;
anzahlDaten=menu.datenbank();     //Anzahl Datensätze auslesen
//Programm initialisieren
lcdext.init();
touchlcd.init();
touchlcd.cursor(0);
i0=anzahlDaten-1;
hwcom.init();
hwcom.setspeed(hwcom.SPEED_4800);
run v24.com;

loop
    {
    touchlcd.textmodus(1,1);
    touchlcd.touchactive(1);
    touchlcd.touchevent(0,0);   //kein invers, kein Beep
    i0=menu.anzeigen(i0);       //letzter Datensatz auswählen
    }
}

Und hier ein Teil von menu:

//Modul menu

type gpsDaten
{
string breiteB;
string breite;
string laengeL;
string laenge;
string datum;
string name;
}
string s,hs;
int i,a,uhr;
float posBreite,posLaenge,zielBreite,zielLaenge,entfernung;
gpsDaten location[15];


function anzeigen(int i3) returns int
{
loop
    {
    lcdext.clear();
    lcdext.print2(location[i3].name);
    lcdext.line(2);
    lcdext.print("Koordinaten");
    touchlcd.clear();
    lcdext.clear();
    anzeige.kreis();
    //Entfernung anzeigen
    touchlcd.font(3,1,1);
    s=location[1].breite;
    posBreite=berechnung.inStunden(s);
    s=location[1].laenge;
    posLaenge=berechnung.inStunden(s);
    s=location[i3].breite;
    zielBreite=berechnung.inStunden(s);
    s=location[i3].laenge;
    zielLaenge=berechnung.inStunden(s);
    entfernung=berechnung.entfernung(posBreite,posLaenge,
                                   zielBreite,zielLaenge);
    str.clear(s);
    str.putfloatf(s,entfernung,4);
    touchlcd.text2('L',15,29,s);
    uhr=berechnung.grobeRichtung(posBreite,posLaenge,
                                   zielBreite,zielLaenge);
    anzeige.kompass(0);
    if uhr!=360
       anzeige.zeiger(uhr);
    touchlcd.font(2,1,1);
    //s="ZIEL";
    //touchlcd.text2('L',94,0,s);
    touchlcd.text2('R',127,0,location[i3].name);
    touchlcd.font(1,1,1);
    touchlcd.text2('L',78,7,location[i3].breiteB);
    touchlcd.text2('L',86,7,location[i3].breite);
    touchlcd.text2('L',78,14,location[i3].laengeL);
    touchlcd.text2('L',82,14,location[i3].laenge);
    s="POS.";
    touchlcd.text2('L',94,44,s);
    touchlcd.text2('L',78,51,location[1].breiteB);
    touchlcd.text2('L',86,51,location[1].breite);
    touchlcd.text2('L',78,58,location[1].laengeL);
    touchlcd.text2('L',82,58,location[1].laenge);
    s="DATENBANK";
    touchlcd.text2('L',80,30,s);
    s="";
    touchlcd.button(0,7,7,'*',0,s,str.length(s));
    s="";
    touchlcd.button(0,4,5,'+',0,s,str.length(s));
    s="DATENBANK";
    touchlcd.button(0,9,10,'#',2,s,str.length(s));
    s="";
    touchlcd.button(0,14,15,'-',0,s,str.length(s));
    while(!swcom.rxd());
    a=swcom.get();
    if a=='+'
       {
       return edit(i3);
       }
    if a=='-'
       {
       return anzeigen(1);
       }
    if a=='#'
       {
       lcdext.clear();
       lcdext.print("Datenbank");
       return auswahl(i3);
       }
    if a=='*'
       {
       lcdext.clear();
       lcdext.print("Entfernung");
       }
    }
}


Was ich nicht verstehe, im thread v24.com die Zeile:
menu.location[1].breite=gps.breite;
Hier wollte ich eigentlich die aktuellen Koortinaten(z.B. gps.breite)
in menu.location[1].breite kopieren.
Die aktuellen Werte würden dann im Hauptprogramm angezeigt werden.
Geht aber nicht. Was mache ich falsch?

GruÃ?
Werner



    Antwort schreiben


Antworten: