Forum: PC-Programmierung c write RS232


von Marco Oklitz (Gast)


Lesenswert?

Tach auch

Ich schreibe grad an nem c Programm unter linux, um über RS232
(/dev/ttyUSB0 is n usb2serial kabel)
Daten an meinen LED Cube zu senden.

Port öffnen klappt:
1
int open_port(void)
2
    {
3
    int fd; /* File descriptor for the port */
4
5
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
6
    if (fd == -1)
7
        {
8
        //Could not open the port.
9
    perror("open_port: Unable to open /dev/ttyS0 - ");
10
        }
11
    else    fcntl(fd, F_SETFL, 0);
12
    return (fd);
13
    }

diese test zeile funzt zum senden wunderbar:
1
n = write(fd,"test", 4);
2
if (n < 0) printf("write of 4 bytes failed!\n");

Soooo...

ich möchte aber gerne die daten nicht als string sondern als raw daten 
senden !

ich brauche 320Bytes um ein Bild zu übertragen.
die daten liegen in einem array:
1
unsigned char Port_LED[80][4]={
2
{  0,  0,  0,  4  },
3
{  0,  0,  0,  4  },
4
{  255,  255,  255,  132  }, // usw.....

diese möchte ich so wie sie sind übertragen damit der µC sie gleich in 
den speicher schreiben kann !

Ich könnte sie ja auch in ASCII-HEX übertragen, aber da müsste ich sie 
im µC wieder umwandeln und das will ich nicht.

gibts ne Möglichkeit daten in form von unsigned char (0-255) zu 
übertragen ??

wenn ichs probiere gibt fd -1 zuück

mfg marco

von Arc N. (arc)


Lesenswert?

Gibt's irgendwo im Programm noch einen Aufruf von tcsetattr?

von DirkB (Gast)


Lesenswert?

Marco Oklitz schrieb:
> gibts ne Möglichkeit daten in form von unsigned char (0-255) zu
> übertragen ??

Das Format der Daten ist write() egal.

> wenn ichs probiere gibt fd -1 zuück
Wo passiert das denn? fd ist eine Variable und die hat einen Wert. 
Funktionen wie open() geben einen Wert zurück.

ein
1
 n = write(fd,Port_LED, sizeof(Port_LED));
sollte reichen.

von Marco Oklitz (Gast)


Lesenswert?

DirkB schrieb:
> ein n = write(fd,Port_LED, sizeof(Port_LED));sollte reichen.

yo stimmt ! ich kann das ganze array raushauen !

super danke euch

mfg marco

von Marco Oklitz (Gast)


Lesenswert?

habs grad nochmal getestet ! der atmega bekommt die daten auch als raw.

also es kommt auch an.

ich wollte vom timing her so schnell wie möglich übertragen damit ich 
den würfel in echtzeit vom pc aus füttern kann !

von Imon (Gast)


Lesenswert?

Marco Oklitz schrieb:
> n = write(fd,"test", 4);
> if (n < 0) printf("write of 4 bytes failed!\n");

Der Teil ist Käse du nutzt doch schon perror um zu testen ob das open 
geklappt hat, dann solltest du auch hier im Fehlerfall mit perror 
ausgeben das es nicht geklappt hat.
1
 
2
 n = write(fd,"test", 4);
3
 if ( n < 0) {
4
    perror("write test");
5
    /* TODO Kontrolliertes Exit oder ähnlich */
6
 }

ausserdem solltest du dein Programm mit tcsetattr die Serille richtig 
Konfigurieren lassen. Das wurde aber schon erwähnt. last but not least
der Ansatz einfach

DirkB schrieb:
> n = write(fd,Port_LED, sizeof(Port_LED));

mag zwar zufällig Klappen und das geben was du dir vorstellst, aber das 
ist gefrickel. Hier solltest du dann wenig das Array mit den attribute 
packed deklarien und ggf. beim Initialisieren das ganze durch ein 
Endianess Check jagen, oder wenn es statische Daten sind ein Warnig 
geben wenn der Kompiler beim Endian check durch fällt. Schöner wäre 
allerdings eine Art memcpy Magic welche aus den 2d Feld ein 1d Stream 
macht.

Sorry aber ich habe zu öft erlebt das Projekte an solchen Stellen eine 
Menge Zeit und Geld verbrannt haben weil der Entwickler an einer 
Maschine mit Prozessor X getestet hat und der Code auf Prozessor Y dann 
knallt.

von Rolf Magnus (Gast)


Lesenswert?

Imon schrieb:
> mag zwar zufällig Klappen und das geben was du dir vorstellst, aber das
> ist gefrickel. Hier solltest du dann wenig das Array mit den attribute
> packed deklarien

Wozu? In einem Array gibt's kein Padding, schon gar nicht, wenn der 
Basistyp unsigned char ist.

> und ggf. beim Initialisieren das ganze durch ein Endianess Check jagen,

Endianness? Bei einzelnen Bytes?

> Sorry aber ich habe zu öft erlebt das Projekte an solchen Stellen eine
 Menge Zeit und Geld verbrannt haben weil der Entwickler an einer
> Maschine mit Prozessor X getestet hat und der Code auf Prozessor Y dann
> knallt.

Dann sollte dir aber auch klar sein, daß die Verwendung des Attributs 
packed genauso "Gefrickel" ist.

von Lukas H. (1uk3)


Lesenswert?

Was ist das den für ein MegaCube? 320Byte?! 13x13x13?

von Marco Oklitz (Gast)


Lesenswert?

Lukas H. schrieb:
> Was ist das den für ein MegaCube? 320Byte?! 13x13x13?

nee nur 5x5x5

mit atmega32, ich benutze 30 I/O Ports, die übrigen 2 sind rx,tx.

hab für jede LED noch 4Bit PWM für die Helligkeit.
der µC soll erstmal nur anzeigen und nix rechnen.
d.h. der bekommt 4Bytes für die Ports mal 5 Ebenen mal 16 PWM = 320Bytes

dann brauch er nur die ankommenden bytes ins sram und dann inner ISR 
direkt auf die Ports legen.

f=14.7456MHz und 115k2 Rs232 da schaff ich im moment 36 Bilder pro 
Sekunde.

jetzt bitte nicht schreiben " ohh das und das is aber schlecht das macht 
man so und so " .... das isn hobby ! mein motto is learning by doing.
Nur wenn ich mal überhaupt nich weiter komme und den wald vor lauter 
bäumen nich sehe, dann frag ich mal hier im forum nach. man bekommt hier 
sehr schnell kompetente antworten das gefällt mir ^^

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.