Forum: PC-Programmierung unsignet char zusammensetztzen


von Lars (Gast)


Lesenswert?

Moin,

ich stehe auf dem schauch....ich habe diese Programm zum senden von HEX 
daten:
1
int sendenserial(int fd)   
2
{
3
  
4
  //Sende /?!crlf
5
  unsigned char send_bytes[] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A};
6
  write(fd, send_bytes, 5);  //Send data
7
  printf("Daten senden\n");
8
  return 0;
9
}

So nun möchte ich aber noch die Adresse da einfügen. Dafür lesen ich 
diesen String aus einer MYSQL "0x34, 0x38, 0x40"

Wie bekomme ich das nun zusammen? Ich habe es versucht mit sprinf aber 
dann geht das write nicht mehr richtig :-(

Und wie kann ich dynamisch die Sende länge einstellen?


Ich bin irgendwie gerade überfrag. Könnte mir wer einen Tip geben?



Lars

von Yalu X. (yalu) (Moderator)


Lesenswert?

Lars schrieb:
> Wie bekomme ich das nun zusammen? Ich habe es versucht mit sprinf aber
> dann geht das write nicht mehr richtig :-(

Eher mit sscanf.

von Klaus W. (mfgkw)


Lesenswert?

Lars schrieb:
> Könnte mir wer einen Tip geben?

1. Mein Tip: verständliche Fragen stellen.
Ich zumindest weiß nicht recht, was du willst und was nicht geht.

2. man kann write auch mehrfach hintereinander aufrufen, um erst einen 
Teil zu senden und dann den anderen.

3. Rückgabewerte sind dazu da, geprüft zu werden.

von Lars (Gast)


Lesenswert?

Also ich habe das Problem mit dem String der aus der MYSQL Datenbank 
kommt.

Wie bekomme ich den gesendet?

Der String sieht ja so aus:

MYSQL Adresse:
0x34, 0x38, 0x40

Und diesen String will ich in den Vorhandenen
unsigned char send_bytes[] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A};
einbinden.

Also so soll es nachher aussehn:
->0x2F, 0x3F, 0x34, 0x38, 0x40, 0x21, 0x0D, 0x0A

Habs per sprint versucht aber dann wird gemeckert das send_bytes keine 
größen angabe hat.

Wenn ich dann send_bytes[100] schreibe, sender write meine Daten nicht 
mehr

:-(

von Peter (Gast)


Lesenswert?

Stichwort verkettete Liste wäre da was

von Lars (Gast)


Lesenswert?

Ok werde ich mal googlen...


Was ich noch so verstehe ist, warum sind die 0x.. sind der {} klammer?

unsigned char send_bytes[] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A};

Ich habe das kopiert..... Finde da aber auch nix im Netz.

von DirkB (Gast)


Lesenswert?

In send_bytes[] hast du Binärwerte.
Dein SQL-String besteht aus einzelnen Zeichen.

Das soviel miteinander zu tun wie 10 mit "zehn"

Du musst also erstmal aus dem String Binärwerte machen.

Am einfachsten geht das mit sscanf (wurde schon genannt).

Dann kannst du die ersten zwei Zeichen von send_bytes senden,
dann die Werte die du mit scanf ermittelt hast und danach die letzten 
Zeichen von send_bytes. (wurde auch schon genannt)

Du kannst auch in send_bytes Füllzeichen einbauen und die Stellen dann 
entsprechen füllen.
1
unsigned char send_bytes[] = { 0x2F, 0x3F, 0, 0, 0, 0x21, 0x0D, 0x0A};

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sollen die SQL-Daten immer nach dem zweiten Byte von send_bytes
eingefügt werden?

Wenn ja, mach's doch einfach so:
1
char sql_string[] = "0x34, 0x38, 0x40";
2
3
int sendenserial(int fd)   
4
{
5
  static unsigned char prefix[] = { 0x2F, 0x3F };
6
  static unsigned char suffix[] = { 0x21, 0x0D, 0x0A };
7
  char *sql_ptr = sql_string;
8
  unsigned char c;
9
  int val, n;
10
11
  write(fd, prefix, sizeof prefix);
12
13
  if (sscanf(sql_ptr, "%i%n", &val, &n) == 1) {
14
    do {
15
      sql_ptr += n;
16
      c = (unsigned char)val;
17
      write(fd, &c, 1);
18
19
    } while (sscanf(sql_ptr, ",%i%n", &val, &n) == 1);
20
  }
21
22
  write(fd, suffix, sizeof suffix);
23
24
  return 0;
25
}

Erst werden die Bytes 0x2f und 0x3f gesendet.

Dann wird der SQL-String mit sscanf auseinandergeflückt und jedes
einzelne darin enthaltene Byte gesendet. Dabei ist die Anzahl dieser
Bytes beliebig.

Am Schluss werden die Bytes 0x21, 0x0d und 0x0a gesendet.

Ist es das, was du dir vorgestellt hast?

von DirkB (Gast)


Lesenswert?

Lars schrieb:
> Was ich noch so verstehe ist, warum sind die 0x.. sind der {} klammer?
>
> unsigned char send_bytes[] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A};

Damit initialisierst du das Array send_bytes.
Dies geht so in C nur bei der Definition von einem Array.
Du kannst auch einen Wert in die [] setzen. Dann wird der Rest 
automatisch mit 0 aufgefüllt.
1
unsigned char send_bytes[10] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A}; // nur 5 Werte angegeben, die restlichen fünf werden mit 0 gefüllt

Die {} sind da wie die "" bei Stringliteralen.
1
char send_bytes[] = "/!?\r\n";
2
//oder 
3
char send_bytes[] = "\x2F\x3F\x21\x0D\x0A";
aber dann ist send_bytes jeweils 6 Zeichen groß

von Lars (Gast)


Lesenswert?

Viel Dank für die Erklärung es egth




Danke

von Ich (Gast)


Lesenswert?

geht mein ich :-D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.