Anweisungen Hilfe Bitte

wasa

Grünschnabel
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);
}
}
 
Das ist doch nicht dein Ernst, oder? Zunächst mal ist der Code in der Form, in der er jetzt ist nahezu unlesbar (bitte Code-Tags benutzen!) und zum andern ist es viel zu viel und auch nicht gerade super trivial. Vielleicht erklärst du uns erstmal was der eigentlich machen soll.
 
tagchen!
ja okay!
also ich soll in MFC ein Programm schreiben, welches den COM1 öffnet und die Daten eines Messgerätes ausliest. soweit so gut. Ich bekomme auch den entsprechenden String zurück geliefert aber der ist immer gleich und nichts sagend.
Da hat man mir den oben aufgeführten Quelltext (in C) gegeben, der das selbe Gerät ausliest. Nur komme ich damit nicht zurecht.
Mich würde im Prinzip nur interessieren wie der gelesene String irgendwie umgewandelt wird.

THX schonmal!

cu wasa
 
Original geschrieben von wasa
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
Code:
int digit(int x)
{
	int dig[10]={0xd7,0x05,0x5b,0x1f,0x27,0x3e, 0x7e,0x15,0x7f, 0x3f};
	int n;
	x=x&0x7f; //x = die unteren 7 bit von x - vermutlich nur Sicherheitshalber
	for(n=0;n<10;n++) //Schleife von 0 - 9
		if (x==dig[n]) // wenn x im array, dann return index
			return n;
	return 0; //sonst return 0 
//vielleicht umwandlung von irgendwie (BCD?) kodierten Ziffern (0-9) in Zahlen
//(scheint mir doof, da das auch ein index ist, keine Fehlererkennung möglich)
}
/*---------------------------------------------------------------------*/ 
char *dvm_unit(int y, int x, char *s)
{	
	char *prefix="";
	char *unit="";
	char *ext="";
	char *ext1="";

//x enthält, codiert in einzelnen bits, Informationen 
//die in einen String umgewandelt werden sollen
//y enthält die information ob AC oder ""
//s ist glaube ich der Ort wo die decodierte
//Information hingespeichert wird
// es gibt kein return?

//Ausgabe: prefix - bestehend aus m;u;n;M;k sprich die Vorfaktoren vor Einheiten
//mili, mykro, nano, Mega, kilo
//Unit: Ampere, Hz, %, C, Ohm, Volt, F (in ihren jeweiligen Abkürzungen)
//dann entweder AC oder nichts
//und dann delta, Diode oder Beep
//alles decodiert aus x - bis auf ac, welches aus y gezogen wird
//mittels bittest

	if (x&0x2000) //bittest auf bit 13
		ext="delta"; //wenn bit 13 gesetzt, dann ext=delta
	else if (x&0x100000) //bittest auf bit 20
		ext="Diode"; //dann diode
	else if (x&0x10000) //bittest auf bit 16
		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);
                                          //Speicher reservieren und buffer einlesen
		while(1)
		{
			read(fd,&buffer[n],1);		
			if ((buffer[n]&0xf0)==0xe0 || (n==16))
				break;		
			n++;
		}
#if 0
		// Raw output - zur kontrolle
		for(n=0;n<16;n++)
			printf("%02x ",buffer[n]);
#endif

		buffer1[0]=buffer[0]&15;
                                          //bufferwerte irgendwie umkopieren?
		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]);
		
                                           //skalierung gemäß bits in buffer1[4],[3],[2],[1]
		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;
		//buffer[0] ist y
                                          //x ist buffer1[5]*2^16+buffer1[6]*2^8+buffer1[7]
                                          //units ist der ausgabebuffer
		dvm_unit(buffer1[0], (buffer1[5]<<16)|(buffer1[6]<<8)|buffer1[7],units);
		
                                           timestamp(); //?
		printf("%0.3f %s\n",it, units); //druckt ?messwert? in it mit der einheit aus units aus
		fflush(stdout); //damit es auch sicher geschrieben wird.
	}
}

Ich hab kommentiert soweit möglich. Kann es sein, dass die Messwerte in BCD kodiert sind, aus einer Datei oder so ausgelesen werden und mittels 2 ints mit Einheiten versehen werden?
 
BCD wäre binary coded digital - aber wie gesagt, ich weiss nicht ob das stimmt. Ich hatte den Post zu dem Messwert nicht gesehen - da war ich schon am Antworten. Am besten du schaust dir die Kommentare an die ich im Code plaziert habe und versucht damit den Quelltext zu verstehen. Dann stellst du gezielt neue Fragen zu den Bereichen die du nicht verstanden hast.
Auch gut wäre, wenn du eine Beispieleingabe hättest.
 

Neue Beiträge

Zurück