hallo,
hier wäre der Arduino-Code:
https://github.com/dsyleixa/Borland-..._BCB6_RxTx.ino
und hier die UART-Routinen (+GUI) für den PC:
https://github.com/dsyleixa/Borland-...RxTx/Unit1.cpp
die wesentliche Funktion ist cstringarg() samt Hilfsfunktion strstrpos() , sie wird von beiden Plattformen benutzt:
Code:
//----------------------------------------------------------------------------
// tools
//----------------------------------------------------------------------------
int16_t strstrpos(char * haystack, char * needle) // find 1st occurance of substr in str
{
char *p = strstr(haystack, needle);
if (p) return p - haystack;
return -1; // Not found = -1.
}
//------------------------------------------------------------
char * cstringarg( char* haystack, char* vname, char* carg ) {
int i=0, pos=-1;
unsigned char ch=0xff;
const char* kini = "&"; // start of varname: '&'
const char* kin2 = "?"; // start of varname: '?'
const char* kequ = "="; // end of varname, start of argument: '='
char needle[TOKLEN] = ""; // complete pattern: &varname=abc1234
strcpy(carg,"");
strcpy(needle, kini);
strcat(needle, vname);
strcat(needle, kequ);
pos = strstrpos(haystack, needle);
if(pos==-1) {
needle[0]=kin2[0];
pos = strstrpos(haystack, needle);
if(pos==-1) return carg;
}
pos=pos+strlen(vname)+2; // start of value = kini+vname+kequ
while( (ch!='&')&&(ch!='\0') ) {
ch=haystack[pos+i];
if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
carg[i]='\0';
return carg;
}
if( (ch!='&') ) {
carg[i]=ch;
i++;
}
}
return carg;
}
cstringarg() gibt einen cstring zurück, der dem Teil entspricht, der hinter dem Gleichheitszeichen steht, also bei
char msg[100];
strcpy(msg, "&i=12;&myfloat=1234.56;&foo=8765; &bas="56473.563736";\n");
char cwert[20];
wird nach
cstringarg(msg, "i", cwert );
"12" in cwert[] zurückgegeben, Null-terminiert, und nach
cstringarg(msg, "myfloat", cwert );
entsprechend
"1234.56"
(ich hoffe, ich habe jetzt nicht noch einen c+p Fehler drin)
Lesezeichen