PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anweisungen Hilfe Bitte



wasa
20.07.2004, 11:14
tagchen!
kann mir jemand erklären was der folgende Code zu sagen hat bzw. was da gemacht wird!?
DANKE SCHONMAL!!!!!!
Ich komme damit echt nicht zurecht!!!

DANKE cu wasa

int digit(int x)
{
int dig[10]={0xd7,0x05,0x5b,0x1f,0x27,0x3e, 0x7e,0x15,0x7f, 0x3f};
int n;
x=x&0x7f;
for(n=0;n<10;n++)
if (x==dig[n])
return n;
return 0;
}
/*---------------------------------------------------------------------*/
char *dvm_unit(int y, int x, char *s)
{
char *prefix="";
char *unit="";
char *ext="";
char *ext1="";
if (x&0x2000)
ext="delta";
else if (x&0x100000)
ext="Diode";
else if (x&0x10000)
ext="Beep";

if (x&0x080000)
prefix="m";
else if (x&0x800000)
prefix="u";
else if (x&0x400000)
prefix="n";
else if (x&0x020000)
prefix="M";
else if (x&0x200000)
prefix="k";


if (x&0x0800)
unit="A";
else if (x&0x0200)
unit="Hz";
else if (x&0x40000)
unit="%";
else if (x&0x10)
unit="°C";
else if (x&0x4000)
unit="Ohm";
else if (x&0x0400)
unit="V";
else if (x&0x8000)
unit="F";

sprintf(s,"%s%s %s (%s)",prefix, unit,
(y&0x8?"AC":""),
ext);
}
/*---------------------------------------------------------------------*/
int main(int argc,char **argv)
{
unsigned char data;
unsigned char buffer[100];
unsigned char buffer1[9];
char units[20];
int n;
float it;
unsigned int t,tf;

fd=open_serial("/dev/ttyS0", 2400);

set_rts_dtr(fd); // DTR/RTS setzen

while(1)
{
n=0;
memset(buffer,0,20);
while(1)
{
read(fd,&buffer[n],1);
if ((buffer[n]&0xf0)==0xe0 || (n==16))
break;
n++;
}
#if 0
// Raw output
for(n=0;n<16;n++)
printf("%02x ",buffer[n]);
#endif

buffer1[0]=buffer[0]&15;

for(n=0;n<8;n++)
buffer1[1+n]=((buffer[2*n+1]&15)<<4)|(buffer[2*n+2]&15);


#if 0
// Nibble compacted data
for(n=0;n<8;n++)
printf("%02x ",buffer1[n]);

printf("%i%i%i%i\n",digit(buffer1[1]),digit(buffer1[2]),
digit(buffer1[3]),digit(buffer1[4]));
#endif

if ((buffer1[3]&0x7f)==0x68)
it=9999999;
else
it=1000.0*digit(buffer1[1])+100.0*digit(buffer1[2])
+10*digit(buffer1[3])+1*digit(buffer1[4]);


if (buffer1[4]&0x80)
it=it/10.0;

if (buffer1[3]&0x80)
it=it/100.0;

if (buffer1[2]&0x80)
it=it/1000.0;

if (buffer1[1]&0x80)
it=-it;

dvm_unit(buffer1[0], (buffer1[5]<<16)|(buffer1[6]<<8)|buffer1[7],units);
timestamp();
printf("%0.3f %s\n",it, units);
fflush(stdout);
}
}

Scotty
20.07.2004, 12:31
Mahlzeit,

wie wärs, wenn du uns im Gegenzug sagst, für was der Code sein soll, damit wir ihn im richtigen Zusammenhang betrachten können? Ansonsten könnten wir dir wahrscheinlich nur die Befehle erklären, nicht aber, was das Programm im Endeffekt macht.

Gruß Ralf

wasa
20.07.2004, 16:00
Tagchen!

Ist ne gute Idee, hätte ich wohl machen sollen! SORRY!

Also ich soll ein DMM (VC820) über den COM auslesen soweit so gut. Ich bekomme auch nen 14 Byte langen String zurück. Nur der Inhalt ist immer gleich und zweitens der Inhalt ist nichts sagend.
Da hat man mir den aufgeführten Code gegeben der das Problem beheben soll.
Also das Programm / der Quellcode öffnet den COM und liest Daten aus! aber weiter komm ich nicht!
Werden die Daten dann irgendwie umgewandelt???

DANKE schonmal!
cu wasa

Unregistriert
21.07.2004, 10:04
Hab mal für das VC840 eine Auslesesoftware in QBasic und VB6 geschrieben. Funktioniert so einigermaßen. Wie das in C geht, hab ich nicht probiert.

Das VC820/840 liefert pro Messung einen 14-Byte Frame. In jedem Byte werden 4 Bit für die Zählung der Bytes (Bit 4-7) und die anderen 4 Bit (0-3) für die eigentliche Information geliefert. Darin ist ein Abbild der LCD-Anzeige gespeichert. Also man erhält in dem Frame nicht den Wert 1,234 V sondern ein Bitmuster der 7-Segmentanzeige. Die muss man dann in den Messwert umsetzen. Das hört sich schlimmer an als es ist. Welche Informationen in dem Frame stecken lässt sich aus der Doku ermitteln.

Siegfried

MacSeck
22.07.2004, 01:07
und da sag nochmal einer: "C wäre schön"...:)