unsignet char zusammensetztzen

Gast #3305796
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
Gast #3306262
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

:-(
Gast #3306331
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.
Gast #3306332
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};
Moderator #3306349
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?
Gast #3306380
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren