GNU/Linux >> Znalost Linux >  >> Linux

Čtení a zápis na sériový port v C na Linuxu

Vyřešil jsem své problémy, takže zde zveřejňuji správný kód pro případ, že by někdo potřeboval podobné věci.

Otevřít port

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

Nastavit parametry

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;
}

Napište

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);

Rozhodně nebylo nutné psát bajt po bajtu, také int n_written = write( USB, cmd, sizeof(cmd) -1) fungovalo dobře.

Konečně čtěte :

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;
}

Tenhle se mi osvědčil. Děkuji vám všem!


Linux
  1. Linux – Jak přepínat mezi relací Tty a Xorg?

  2. Linux – Tty hlavní číslo vašeho Unixu?

  3. Linux – sériový port Raspberrypi?

  1. Linux – Jak najít procesy pomocí sériového portu?

  2. Virtuální sériový port pro Linux

  3. Jak otevřít, číst a zapisovat ze sériového portu v C?

  1. Jak se připojit a odeslat data do sériového portu Bluetooth v systému Linux?

  2. Linux – rozdíl mezi Pts a Tty?

  3. Brána sériového portu Netbsd?