Serieport med gcc i Linux?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Serieport med gcc i Linux?

Inlägg av Marta »

Vill skicka ut binärdata via en serieport. Alla 256 kombinationer förekommer så all "hjälpsamhet" måste stängas av. Format n8? utan finesser. Det är här problemet finns.

Kan porten kommas åt mera direkt än som ttyUSB* ?

Går det (hur?) att stänga av all förbannad "hjälpsamhet"? Det är ju en hel roman med blaj :evil: :evil:

speed 19200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Användarvisningsbild
AndLi
Inlägg: 17045
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Serieport med gcc i Linux?

Inlägg av AndLi »

Det går alldeles utmärkt, vad är det du inte lyckas stänga av?

Du kan hämta alla inställningar i en termios struct, stänga av allt du inte vill ha och sätta upp porten med den modifierade strukten...
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Serieport med gcc i Linux?

Inlägg av Marta »

Visst, men vad skall alla fälten sättas till för att bli av med sk*ten?

Exakt vad som är fel vet jag inte. Får samma, avvikande, CRC hela tiden så utgår från det är någon "hjälpsamhet" som förändrar det som skickas.

Det är enkelriktad kommunikation med manuell CRC-32 på en display att jämföra med den sändande program visar. En testfil med slumpade endast A..Z ger rätt CRC.
Användarvisningsbild
AndLi
Inlägg: 17045
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Serieport med gcc i Linux?

Inlägg av AndLi »

Let me google it for you....

https://en.wikibooks.org/wiki/Serial_Pr ... ng/termios

Kod: Markera allt

#include <termios.h>
#include <unistd.h>

struct termios  config;

 //
 // Check if the file descriptor is pointing to a TTY device or not.
 //
 if(!isatty(fd)) { ... error handling ... }

 //
 // Get the current configuration of the serial interface
 //
 if(tcgetattr(fd, &config) < 0) { ... error handling ... }

 //
 // Input flags - Turn off input processing
 //
 // convert break to null byte, no CR to NL translation,
 // no NL to CR translation, don't mark parity errors or breaks
 // no input parity check, don't strip high bit off,
 // no XON/XOFF software flow control
 //
 config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
                     INLCR | PARMRK | INPCK | ISTRIP | IXON);

 //
 // Output flags - Turn off output processing
 //
 // no CR to NL translation, no NL to CR-NL translation,
 // no NL to CR translation, no column 0 CR suppression,
 // no Ctrl-D suppression, no fill characters, no case mapping,
 // no local output processing
 //
 // config.c_oflag &= ~(OCRNL | ONLCR | ONLRET |
 //                     ONOCR | ONOEOT| OFILL | OLCUC | OPOST);
 config.c_oflag = 0;

 //
 // No line processing
 //
 // echo off, echo newline off, canonical mode off, 
 // extended input processing off, signal chars off
 //
 config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);

 //
 // Turn off character processing
 //
 // clear current char size mask, no parity checking,
 // no output processing, force 8 bit input
 //
 config.c_cflag &= ~(CSIZE | PARENB);
 config.c_cflag |= CS8;

 //
 // One input byte is enough to return from read()
 // Inter-character timer off
 //
 config.c_cc[VMIN]  = 1;
 config.c_cc[VTIME] = 0;

 //
 // Communication speed (simple version, using the predefined
 // constants)
 //
 if(cfsetispeed(&config, B9600) < 0 || cfsetospeed(&config, B9600) < 0) {
     ... error handling ...
 }

 //
 // Finally, apply the configuration
 //
 if(tcsetattr(fd, TCSAFLUSH, &config) < 0) { ... error handling ... }
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Serieport med gcc i Linux?

Inlägg av hawkan »

Om man vill jobba i bash

Kod: Markera allt

stty -F /dev/ttyUSB raw
borde lösa det mesta. Sen kan man stänga av eko för att få halv duplex

Kod: Markera allt

stty -F /dev/ttyUSB -echo -echoe -echok
https://acassis.wordpress.com/2016/01/2 ... -raw-mode/
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Serieport med gcc i Linux?

Inlägg av Marta »

Tack för svaren.

Det skall göras inifrån ett program i gcc. Lite mera komplicerat än vad bash klarar. Bl.a. skall det räknas CRC och stanna upp varje 128 byte så PIC hinner flasha mottagen data. Skall prova sätta termios om en stund. Det kom lite invalidgöromål emellan och de är inte riktigt klara ännu.
sm5tfx
Inlägg: 114
Blev medlem: 20 juli 2011, 14:28:41
Ort: Gnällbältet

Re: Serieport med gcc i Linux?

Inlägg av sm5tfx »

cfmakeraw(3) är händigt för att stänga av terminal-finesserna, sen cfsetspeed(3) och lämpliga flaggor för paritet och stop-bitar.
Skriv svar