Запись и чтение из COM порта Linux

127
07 сентября 2019, 09:50

Хочу записать в com-порт и прочитать из него некоторое количество байт. С записью проблем вроде бы нет, write ошибок не возвращает. А вот с чтением проблема: на read виснет. Tо есть в порт ничего не приходит, но как такое может быть если до этого я сделал write? Или это как то по другому работает?

int main(int argc, char* argv[])
{
    int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY /*| O_NDELAY*/);
    if (fd == -1)
    {
        std::cout << " Unable to open /dev/ttyS0" << std::endl;
        return 0;
    }
    // configure
    termios attr_old;
    termios attr;
    memset( &attr_old, 0, sizeof(termios) );
    memset( &attr, 0, sizeof(termios) );
    if ( tcgetattr(fd, &attr_old) )
    {
         std::cout << "Error: " << strerror(errno) << " from tcgetattr" << std::endl;
        return 0;
    }
    attr = attr_old;
    //Baud rate
    cfsetospeed(&attr, B9600);
    cfsetispeed(&attr, B9600);
    attr.c_cflag     &=  ~PARENB;            // Make 8n1
    attr.c_cflag     &=  ~CSTOPB;
    attr.c_cflag     &=  ~CSIZE;
    attr.c_cflag     |=  CS8;
    attr.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines
    attr.c_cflag     &=  ~CRTSCTS;           // no flow control
    attr.c_cc[VMIN]   =  1;                  // read doesn't block
    attr.c_cc[VTIME]  =  5;                  // 0.5 seconds read timeout

    // Make raw 
    cfmakeraw(&attr);
   // Flush Port, then applies attributes
    tcflush( fd, TCIFLUSH );
    if ( tcsetattr ( fd, TCSANOW, &attr ) != 0)
    {
        std::cout << "Error: " << strerror(errno) << " from tcsetattr" << std::endl;
        return 0;
    }
    //Write
    int nw = write(fd, "A\r", 2);
    if ( nw < 0)
    {
         std::cout << "Error: " << strerror(errno) << " from write" << std::endl;
         return 0;
    }
    //Read
    char buff[32];
    memset( &buff, '\0', sizeof(buff) );
    int nr = 0;
    int spot = 0;
    char ch = '\0';
    do 
    {
        nr = read(fd, &ch, 1);
        if (nr < 0 )
        {
              int er = errno;
              std::cout << "Error:  " << er << " " << strerror(er) << " from read" << std::endl;
              return 0;
        }
        sprintf(&buff[spot], "%c", ch);
        spot += nr;
    }
    while( ch != '\r' && nr > 0 );
    close(fd);
    return 0;
}
Answer 1

На порту есть устройство, которое ответит?

Гарантированно из порта можно прочитать после записи (то, что послали), если на него поставить перемычку TX-RX (замкнуть 2-3 контакты разъёма DB-9)

READ ALSO
Проблема с выводом [закрыт]

Проблема с выводом [закрыт]

Только недавно начал изучать Java и решил сделать простенькую игру по угадыванию буквы, но столкнулся с небольшой проблемой, подскажите, в чём...

124
RequestMapping не работает, хотя GetMapping или PostMapping работают

RequestMapping не работает, хотя GetMapping или PostMapping работают

У меня есть Spring MVC приложение, когда я заменяю @GetMapping("/addPhoto") на RequestMapping(name = "/addPhoto",method = RequestMethodGET) у мене просто не стратует программа

130
Фрейм и менеджеры компановки

Фрейм и менеджеры компановки

Можно ли установить для фрейма другой менеджер компановки? Например:

103