Hexstream in Hexpaare zerlegen



  • Vielen Dank schonmal für die umfangreiche Antworten, die Tipps werd ich zu Herzen nehmen 🙂 .

    Hierbei handelt es sich um ein Schulprojekt, indem man natürlich darauf achten sollte nicht alles aus fremden Quellen zu fischen sondern eher nur Hilfestellungen zu suchen.

    In unserem Projekt soll ein Thermo-Drucker durch einen anderen Thermo-Drucker ersetzt werden. Zur Ansteuerung des neuen Druckers haben wir schon eine WinForm in C# entwickelt. Mein Part ist nun in nativem C ein Programm zu schreiben, dass die Befehle des alten Druckers in die des neuen umsetzt ( Der sendende Automat ist in C programmiert, deswegen hier der C Part).

    Dieses C programm soll später dann in den Automaten implementiert werden sodass je nach genutztem Drucker der Automat das Programm nutzt oder nicht.

    Da in unserer C# Anwendung auch immer in Hex gesendet und Empfangen wird, wollte ich das hier in dieser C Anwendung so beibehalten.

    Nun wollte ich erstmal einhergehen und anfangen das Grundgerüst der Anwendung zu erstellen.

    Zuerst hab ich 2 Arrays angelegt

    char Eingang[];
    char Ausgang[];
    

    Sodass man zur Weiterverarbeitung später nurnoch auf die Beiden Zugreifen braucht.

    Dann eine Switch-Anweisung in der nach bestimmten Befehlen Seitens des Automaten gesucht wird und diese in die Befehle des neuen Druckers umgesetzt werden ( wie Oben schon beschrieben ).

    Nur kam mir dann der Gedanke, dass im {Eingang[]} ne ganze Kette an Werten befinden müsste, die direkt in eins in die Switch Anweisung geladen wird und dementsprechend in die einzelnen Werte zerlegt werden muss.



  • mit Eingang[0] oder *(Eingang + 0) kannst du auf das 1. element zugreifen, mit Eingang[1] oder *(Eingang + 1) auf das 2. element usw.



  • Lucient schrieb:

    ( Der sendende Automat ist in C programmiert, deswegen hier der C Part).

    ...
    Da in unserer C# Anwendung auch immer in Hex gesendet und Empfangen wird, wollte ich das hier in dieser C Anwendung so beibehalten.[/quote]Das ist sowas von egal, welche Sprache auf jeder Seite benutzt werden.

    Lucient schrieb:

    Da in unserer C# Anwendung auch immer in Hex gesendet und Empfangen wird, wollte ich das hier in dieser C Anwendung so beibehalten.

    Ich denke, du hast ein Begriffsproblem mt HEX.



  • Wade1234 schrieb:

    mit Eingang[0] oder *(Eingang + 0) kannst du auf das 1. element zugreifen, mit Eingang[1] oder *(Eingang + 1) auf das 2. element usw.

    Nur wie kann ich diese Elemente zu einem machen ?

    Das ich dann immer Eingang 1 und 2 direkt aneinander Reihe.

    Ich denke, du hast ein Begriffsproblem mt HEX.

    Schon möglich, ich wusste mich nur nicht besser auszudrücken



  • Ich hoffe ich blamiere mich nun nicht allzusehr, aber ich habe mal versucht mein Poblem zu lösen.

    char Eingang[1024];
    	char Ausgang[1024];
    
    	char Fullcut[3] = { 0x1B, 0x43, 0x00 };
    	char Halfcut[3] = { 0x1B, 0x43, 0x01 };
    	int i,u,o,count;
    	char a, b;
    	for (i = 0; i < 512; i=i+2)
    	{
    		a = Eingang[i];
    		b = Eingang[i + 1];
    
    	   if (a == 4 && b == 3)
    	   {
    	  	  for (u = 0; u < 3; u++)
    		  {
    			Ausgang[count + u] = Fullcut[u];
    			count = count + 3;
    		  }
    
    	   }
    	   if (a == 5 && b == 0)
    	   {
    		for (o = 0; o < 3; o++)
    		{
    			Ausgang[count + o] = Halfcut[o];
    			count = count + 3;
    		}
    	   }
               else
               {
                 Ausgang[count] = Eingang[count];
                 count++;
               }
          }
    

    Wäre dies nun eine machbare Lösung, oder ist diese Schreibweise komplett daneben gegriffen ?

    Immerhin geht es in diesem Projekt sich seine Lösungen zu erarbeiten und daraus zu lernen



  • arbeite ganz schnell an deiner Kommunikation:

    1. du ignorierst Fragen oder antwortest nur wenn du die Frage verstehst, das ist
    nicht richtig

    2. die meisten deiner Posts sind ohne Kontext nicht zu verstehen
    siehe dein letzter Quelltext Post - wie sollen wir verstehen was du da machst?

    btw: welche Drucker-Modelle, Betriebssystem, Kompiler Versionen genau?



  • Lucient schrieb:

    Wade1234 schrieb:

    mit Eingang[0] oder *(Eingang + 0) kannst du auf das 1. element zugreifen, mit Eingang[1] oder *(Eingang + 1) auf das 2. element usw.

    Nur wie kann ich diese Elemente zu einem machen ?

    Das ich dann immer Eingang 1 und 2 direkt aneinander Reihe.

    unsigned short int *input = (unsigned short int *) &Eingang;
    

    damit greifst du dann quasi auf 2 elemente gleichzeitig zu.



  • Gast3 schrieb:

    arbeite ganz schnell an deiner Kommunikation:

    1. du ignorierst Fragen oder antwortest nur wenn du die Frage verstehst, das ist
    nicht richtig

    2. die meisten deiner Posts sind ohne Kontext nicht zu verstehen
    siehe dein letzter Quelltext Post - wie sollen wir verstehen was du da machst?

    btw: welche Drucker-Modelle, Betriebssystem, Kompiler Versionen genau?

    Das werde ich versuchen, nur hier schreiben einige Leute mit deren Antworten ich mich erstmal auseinander setzten muss. Es ist ja so, dass ich hier als Anfänger bzw. eher Laie unter fachkundigen Leuten schreibe, ist nicht alles so einfach.

    Ich hatte auch garnicht damit gerechnet, dass das für mich klein erscheindende Problem solche auswirkungen haben könnte und möchte mich für die Verwirrung entschuldigen.

    Nur hadere ich damit zuviel von unserem Projekt preiszugeben, da es sich immerhin um eine Schularbeit handelt worum es geht die Probleme selbst zu erörtern und nicht am ende alles aus dem Internet per Copy Paste zu holen.

    Nur meine Erörterung scheitert größtenteils daran zu wissen nach was genau man suchen muss.

    Wie gesagt vor diesem Thread hab ich google durchstöbert nach " String auswerten " , " ComPort auslesen" und so weiter.

    Zu deinen Fragen :

    Ich möchte ungern hier den Log posten.
    Meine Maschine auf der ich schreibe hat Win7 mit Visual Studio 2017.

    Ich wollte eigendlich nur wissen, wie man die von einem ComPort gesendeten Daten in ein Char Array speichert um sie dann vereinzelnt weiterverarbeiten zu können und keinen ganzen Quellcode des gesamten Programms 😕 .



  • Mal ein Beispiel:

    #include <stdio.h>
    
    int main (void)
    { char eingang[] = "Hallo Welt\n";
      int i;
    
      puts("Als char: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%c", eingang[i]);
    
      puts("\ndezimal: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%d ", eingang[i]);
    
      puts("\nhex: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%x ", eingang[i]);
    
      puts("\nhex ohne Zwischenraum: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%x", eingang[i]);
    }
    

    Ausgabe:

    Als char: 
    Hallo Welt
    
    dezimal: 
    72 97 108 108 111 32 87 101 108 116 10 
    hex: 
    48 61 6c 6c 6f 20 57 65 6c 74 a 
    hex ohne Zwischenraum: 
    48616c6c6f2057656c74a
    

    Wie du siehst, werden dieselben Daten verschieden dargestellt.

    Bei Hex werden zwei Zeichen benutz, obwohl nur ein Zeichen codiert wird.
    Die Hexausgabe ist eine Darstellungsmethode eures Loggers. Mehr nicht.
    Du brauchst da nicht zwei Zeichen zusammen basteln.

    Und wenn, ist 3 etwas anderes als '3'



  • DirkB schrieb:

    Mal ein Beispiel:

    #include <stdio.h>
    
    int main (void)
    { char eingang[] = "Hallo Welt\n";
      int i;
    
      puts("Als char: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%c", eingang[i]);
    
      puts("\ndezimal: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%d ", eingang[i]);
    
      puts("\nhex: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%x ", eingang[i]);
    
      puts("\nhex ohne Zwischenraum: ");
      for(i=0;eingang[i]!= 0;i++) 
        printf("%x", eingang[i]);
    }
    

    Ausgabe:

    Als char: 
    Hallo Welt
    
    dezimal: 
    72 97 108 108 111 32 87 101 108 116 10 
    hex: 
    48 61 6c 6c 6f 20 57 65 6c 74 a 
    hex ohne Zwischenraum: 
    48616c6c6f2057656c74a
    

    Wie du siehst, werden dieselben Daten verschieden dargestellt.

    Bei Hex werden zwei Zeichen benutz, obwohl nur ein Zeichen codiert wird.
    Die Hexausgabe ist eine Darstellungsmethode eures Loggers. Mehr nicht.
    Du brauchst da nicht zwei Zeichen zusammen basteln.

    Und wenn, ist 3 etwas anderes als '3'

    Okay, vielen dank für das Beispiel.

    Nur entfernt mich das immer mehr von einer Idee der Herangehensweise 😮 .

    Kann ich denn dann überhaupt den COM-Port alles in ein Array schreiben lassen ? Wenn ja, was für eines?

    Und wie kann ich daraus einen Hexadezimalen Code machen, da ich mir die ganzen Steuerbefehle nun in einer Liste mit hexadezimalen Werten angelegt habe.



  • Lucient schrieb:

    Kann ich denn dann überhaupt den COM-Port alles in ein Array schreiben lassen ? Wenn ja, was für eines?

    Ja.
    Ein char-Array

    Lucient schrieb:

    Und wie kann ich daraus einen Hexadezimalen Code machen, da ich mir die ganzen Steuerbefehle nun in einer Liste mit hexadezimalen Werten angelegt habe.

    Kannst du doch benutzen. Es sei denn, du hast sie völlig falsch aufgebaut.
    Du kannst die Konstanten bei switch auch als Hexwert angeben. Oder als Zeichen. Oktal geht auch.

    char ausgang[200];
    char neuer_Wert;
    int j;
    for(i=0,j=0;eingang[i]!= 0;i++,j++)
    {
      switch (eingang[i]) {
        case 0x20  :   ausgang[j] =  '.'; break;
        case 'H'   :   ausgang[j] =   W ; break;
        case  97   :   ausgang[j++] = 0x1b; ausgang[j++] = 0x41; ausgang[j] = 0x1; break;
        default    :   ausgang[j] = eingang[i]; break;
      }
      ausgang[j] = neuer_Wert;
    }
    ausgang[j] = '\0';
    puts(ausgang);
    
    Oder gleich auf die Ausgabe
    for(i=0;eingang[i]!= 0;i++)
    {
      switch (eingang[i]) {
        case 0x20  :   printf("__SPACE__"); break;
        case 'H'   :   putchar('W'); break;
        case  97   :   putchar(0x1B);putchar(0x41);putchar(1); break;
        default    :   putchar(eingang[i]); break;
      } 
    }
    


  • DirkB schrieb:

    Lucient schrieb:

    Kann ich denn dann überhaupt den COM-Port alles in ein Array schreiben lassen ? Wenn ja, was für eines?

    Ja.
    Ein char-Array

    Lucient schrieb:

    Und wie kann ich daraus einen Hexadezimalen Code machen, da ich mir die ganzen Steuerbefehle nun in einer Liste mit hexadezimalen Werten angelegt habe.

    Kannst du doch benutzen. Es sei denn, du hast sie völlig falsch aufgebaut.
    Du kannst die Konstanten bei switch auch als Hexwert angeben. Oder als Zeichen. Oktal geht auch.

    char ausgang[200];
    char neuer_Wert;
    int j;
    for(i=0,j=0;eingang[i]!= 0;i++,j++)
    {
      switch (eingang[i]) {
        case 0x20  :   ausgang[j] =  '.'; break;
        case 'H'   :   ausgang[j] =   W ; break;
        case  97   :   ausgang[j++] = 0x1b; ausgang[j++] = 0x41; ausgang[j] = 0x1; break;
        default    :   ausgang[j] = eingang[i]; break;
      }
      ausgang[j] = neuer_Wert;
    }
    ausgang[j] = '\0';
    puts(ausgang);
    
    Oder gleich auf die Ausgabe
    for(i=0;eingang[i]!= 0;i++)
    {
      switch (eingang[i]) {
        case 0x20  :   printf("__SPACE__"); break;
        case 'H'   :   putchar('W'); break;
        case  97   :   putchar(0x1B);putchar(0x41);putchar(1); break;
        default    :   putchar(eingang[i]); break;
      } 
    }
    

    Das sieht genau nach dem aus, was ich gesucht hab 😮 .
    Vielen, vielen Dank für die Hilfe und die Geduld.


Anmelden zum Antworten