0


0

プログラムがシリアルポートバッファーを読み取らないようにするにはどうすればよいですか?

端末からのデータを読み取るための作業プログラムがあります。 問題は、たとえば、データが来たり停止したりすると、プログラムがバッファから読み取り続けるということです。 すでにポートを介して送られてきたものを読み取らないようにするにはどうすればよいですか?

ここに私のコードがあります。これはhttp://pastebin.com/66S5hSAb[pastebinにあります]

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


int open_port(void);

int main()
{
    char dato[1];
    int fd = 0;
    fd = open_port();
    while(1)
    {
        read(fd,dato,1);
        //~ if(dato == "B")
        //~ return 0;
        printf(dato);
    }
}

int open_port(void)
{
    int fd; /* File descriptor for the port */

    //~ fd = open("/home/tomas/ttySV1", O_RDWR | O_NOCTTY | O_NDELAY);
    fd = open("/dev/ttyUSB0", O_RDWR | O_NDELAY);
    //~ fd = open("/dev/ttyUSB0", O_RDWR);

    if (fd == -1)
    {
        perror("open_port: No se pudo abrir el puerto: ");
    }
    else
    {
        struct termios options;

        /*
         * Get the current options for the port...
         */

        tcgetattr(fd, &options);

        /*
         * Set the baud rates to B9600...
         */

        cfsetispeed(&options, B9600);
        cfsetispeed(&options, B9600);

        /*
         * Enable the receiver and set local mode...
         */

        options.c_cflag |= (CLOCAL | CREAD);

        /*
         * Set the new options for the port...
         */

        tcsetattr(fd, TCSANOW, &options);

        options.c_cflag &= ~CSIZE; /* Mask the character size bits */
        options.c_cflag |= CS8;    /* Select 8 data bits */

        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;

        //~ fcntl(fd, F_SETFL, 0);
        return (fd);
    }
}

1 Answer


2


O_NDELAYは、読み取りのブロックを防ぎます。 常にリターンコードを確認する必要があります。 Readは-1を返し、errnoをEWOULDBLOCKに設定します。

戻りコードとerrnoを試して、何をすべきかを考えてください。例:

ssize_t retval=1;
int doit=1;
while(doit)
{
 while( retval==1)
 {
    retval=read(fd, &ch, 1);
 }
 if(retval == -1)
 {
  if (errno == EWOULDBLOCK)
  {
      sleep 1;
  }
  else
     doit=0;
}