Сериен порт (UART) c++ четене

Имам малък проблем с функцията за четене в 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 се задава само когато програмата отваря порта с отвореното повикване, последвано от 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
Поискахте неблокиращ IO, но изглежда не чакате данните да пристигнат.   -  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
Защо смятате, че имате нужда от асинхронен I/O? Вашата програма дефинира и инсталира манипулатор на сигнали, но wait_flag никога не се използва в main. Изглежда, че просто копирате/използвате повторно код, без да изучавате какво прави кодът. Премахнете обаждането fcntl(fd, F_SETFL, FASYNC) и нещата може да работят по-близо до това, което очаквате. Ако не, тогава трябва да добавите новата версия на вашия код към първоначалния си въпрос.   -  person sawdust    schedule 07.05.2014