GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Lesen und Schreiben auf die serielle Schnittstelle in C unter Linux

Ich habe meine Probleme gelöst, also poste ich hier den richtigen Code, falls jemand ähnliches braucht.

Port öffnen

int USB = open( "/dev/ttyUSB0", O_RDWR| O_NOCTTY );

Parameter einstellen

struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);

/* Error Handling */
if ( tcgetattr ( USB, &tty ) != 0 ) {
   std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}

/* Save old tty parameters */
tty_old = tty;

/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);

/* Setting other Port Stuff */
tty.c_cflag     &=  ~PARENB;            // Make 8n1
tty.c_cflag     &=  ~CSTOPB;
tty.c_cflag     &=  ~CSIZE;
tty.c_cflag     |=  CS8;

tty.c_cflag     &=  ~CRTSCTS;           // no flow control
tty.c_cc[VMIN]   =  1;                  // read doesn't block
tty.c_cc[VTIME]  =  5;                  // 0.5 seconds read timeout
tty.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines

/* Make raw */
cfmakeraw(&tty);

/* Flush Port, then applies attributes */
tcflush( USB, TCIFLUSH );
if ( tcsetattr ( USB, TCSANOW, &tty ) != 0) {
   std::cout << "Error " << errno << " from tcsetattr" << std::endl;
}

Schreiben

unsigned char cmd[] = "INIT \r";
int n_written = 0,
    spot = 0;

do {
    n_written = write( USB, &cmd[spot], 1 );
    spot += n_written;
} while (cmd[spot-1] != '\r' && n_written > 0);

Es war definitiv nicht nötig Byte für Byte zu schreiben, auch int n_written = write( USB, cmd, sizeof(cmd) -1) hat gut funktioniert.

Endlich lesen :

int n = 0,
    spot = 0;
char buf = '\0';

/* Whole response*/
char response[1024];
memset(response, '\0', sizeof response);

do {
    n = read( USB, &buf, 1 );
    sprintf( &response[spot], "%c", buf );
    spot += n;
} while( buf != '\r' && n > 0);

if (n < 0) {
    std::cout << "Error reading: " << strerror(errno) << std::endl;
}
else if (n == 0) {
    std::cout << "Read nothing!" << std::endl;
}
else {
    std::cout << "Response: " << response << std::endl;
}

Dieser hat bei mir funktioniert. Vielen Dank an alle!


Linux
  1. Linux – Unterschied zwischen Pts und Tty?

  2. Linux – So finden Sie Prozesse über die serielle Schnittstelle?

  3. Wie kann ich Daten an einer seriellen Schnittstelle in Linux überwachen?

  4. dd wird beim Lesen und Schreiben langsamer

  5. Serielle RaspberryPi-Schnittstelle

So steuern Sie Peripherieports:Zugriff auf und Schreiben auf Parallelport mit C unter Linux. Teil I

So finden und schließen Sie offene Ports in Linux

Öffnen eines Ports unter Linux

Wie und warum Linux zur Installation von Telnet verwendet wird

Wie kann ich von der seriellen Schnittstelle in C öffnen, lesen und schreiben?

Listener und Interpreter für serielle Linux-Ports?