Последовательный порт (UART) c++ чтение

У меня есть небольшая проблема с функцией чтения в С++. Я пытаюсь прочитать данные, доступные на порту RxD UART.

при запуске этого кода я получаю результат (прочитано ‹0), поэтому он отображает мне ошибку сообщения об ошибке при чтении. что нужно сделать, чтобы иметь возможность читать и отображать данные из чтения. Я уверен, что на порту RxD есть данные, я проверил их с помощью осциллографа.

#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/ioctl.h>

#define BAUDRATE B19200
#define PORT "/dev/ttyO4"
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;

void signal_handler_IO(int status);
int wait_flag = TRUE;



main ()
{
    int fd=0, res=0, result=0;


    char SYNC  [] = {0x55};
    char PID [] = {0x6A};

    struct termios oldtio, newtio;
    struct sigaction saio;
    char buff[255];

    fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd<0) {perror(PORT); exit(-1);}

    saio.sa_handler=signal_handler_IO;
    saio.sa_flags=0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO, &saio,NULL);
    fcntl(fd, F_SETFL, FASYNC);
    tcgetattr(fd, &oldtio);

    newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    //newtio.c_lflag = 0;
    newtio.c_cc[VMIN]=1;
    newtio.c_cc[VTIME]=0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);

    ioctl(fd, TIOCSBRK);
    usleep(1300);

    ioctl(fd,TIOCCBRK);
    usleep(200);

    write(fd, SYNC, sizeof(SYNC));
    write(fd,PID, sizeof(PID));

    res = read(fd, buff,255);

    if (res < 0)
    {
        printf("read error\n");
    }
    else if (res ==0)
    {
        printf("read = 0 \n");
    }
   else
    {
        sprintf(result, "%x",res);
        buff[res]=0;
        printf(": %s :%d :%d\n", buff,result,res);

    }
    close (fd);

}

void signal_handler_IO(int status)
{
    printf("received the signal\n");
wait_flag=FALSE;
}

person Anders    schedule 05.05.2014    source источник
comment
устанавливается ли erno при сбое чтения?   -  person Michael J    schedule 05.05.2014
comment
привет, нет, это не установлено, когда он читает порт. errno устанавливается только тогда, когда программа открывает порт вызовом open, за которым следует error(PORT);.   -  person Anders    schedule 05.05.2014
comment
Какое сообщение об ошибке вы получаете? У вас есть права доступа к устройству?   -  person Alan Stokes    schedule 05.05.2014
comment
Я думал, вы сказали, что open() работает успешно. Вызов open() не работает? Что такое errno после open()?   -  person Michael J    schedule 05.05.2014
comment
Да, у меня есть права доступа к устройству. Я могу легко писать на устройство. Выполняя функцию записи в этом коде: write(fd, SYNC, sizeof(SYNC)); запись(fd,PID, sizeof(PID)); Я прошу устройство вернуть мне его текущие настройки. Просто когда я читаю, он возвращает read ‹ 0; это означает, что я не смог ничего прочитать.   -  person Anders    schedule 05.05.2014
comment
open выполняется успешно и не блокируется. тогда я могу писать и на устройство, но у меня проблемы с чтением с устройства.   -  person Anders    schedule 05.05.2014
comment
Вы запросили неблокирующий ввод-вывод, но, похоже, не ждете поступления данных.   -  person Alan Stokes    schedule 05.05.2014
comment
errno при чтении — прерванный системный вызов.   -  person Anders    schedule 05.05.2014
comment
поэтому, чтобы дождаться поступления данных, мне нужно создать цикл ожидания, аналогичный tldp. org/HOWTO/Serial-Programming-HOWTO/x115.html   -  person Anders    schedule 05.05.2014
comment
Структура newtio не была должным образом инициализирована вызовом tcgetattr() перед использованием. Ваш код выполняет полные назначения. См. Правильная настройка режимов терминала на правильной технике. Вам необходимо проверить код возврата всех системных вызовов, таких как tc[gs]etattr(() и write(), точно так же, как open()< /b> и read(). Если вы собираетесь добавлять циклы ожидания, то вместо этого удалите параметр O_NONBLOCK. В упомянутой вами ссылке есть плохо написанные примеры; используйте на свой страх и риск.   -  person sawdust    schedule 05.05.2014
comment
Спасибо за помощь @sawdust, поправил настройки newtio. Но я все еще не могу ничего прочитать из порта, когда он не отображает ошибку errno=EINTR, я все еще вижу пустой экран. есть ли какое-нибудь онлайн-руководство, которое могло бы помочь мне заставить работать функцию чтения.   -  person Anders    schedule 06.05.2014
comment
Как вы думаете, зачем вам нужен асинхронный ввод-вывод? Ваша программа определяет и устанавливает обработчик сигнала, но wait_flag никогда не используется в main. Похоже, вы просто копируете/повторно используете код, не изучая, что делает код. Удалите вызов fcntl(fd, F_SETFL, FASYNC), и все может работать ближе к тому, что вы ожидаете. Если нет, то вы должны добавить новую версию своего кода к исходному вопросу.   -  person sawdust    schedule 07.05.2014