Имам малък проблем с функцията за четене в 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;
}
fcntl(fd, F_SETFL, FASYNC)
и нещата може да работят по-близо до това, което очаквате. Ако не, тогава трябва да добавите новата версия на вашия код към първоначалния си въпрос. - person sawdust   schedule 07.05.2014