Прием какой то кривой ((
принимает правильно только каждую 4 посылку. То есть при передаче телефоном строки RING ,на экране показывает следующее.
incoming
receive is :1 bytes
a
incoming
receive is:5 bytes
RING
52
incoming
receive is:1 bytes
a
и так далее. RING принимается только каждую 4ую посылку ... После слова bytes на экране видно что проскакивают еще 2 символа новой строки (????). Есть подозрение что на момент чтения из порта нужно запрещать прерывание ...но как правильно это сделать? На AVR все уже давно отлажено и пройдено
Код: Выделить всё
#define BAUDRATE B57600
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); //обьявление обработчика сигнала
int wait_flag=TRUE; // TRUE пока не получен сигнал
main()
{
int fd,c,res,nbytes;
struct termios oldtio,newtio;
struct sigaction saio; //обьявление действия сигнала (signal action)
unsigned char buff[128];
unsigned char *bufptr=malloc(128);
//open port as nonblocked (вызов read будет возвращать управление немедленно)
fd = open(MODEMDEVICE,O_RDWR |O_NOCTTY | O_NONBLOCK);
if (fd < 0) {perror(MODEMDEVICE);exit(-1);}
//устанавливаем обработчик сигнала перед установкой устройсва как асинхронного
saio.sa_handler = signal_handler_IO;
//saio.sa_mask = 0;
//memset(&saio.sa_mask,0,sizeof(sigset_t));
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
// enable get SIGIO
fcntl(fd,F_SETOWN,getpid());
//делаем файловый дескриптор асинхронным
fcntl(fd,F_SETFL,FASYNC);
tcgetattr(fd,&oldtio); //сохраняем текущие установки порта
//устанавливаем новые параметры порта
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
//цикл ожидания ввода. Обчно мы будем делать здесь чегонибудь полезное
while (STOP==FALSE)
{
if(wait_flag == FALSE)
{
printf("incoming\n");
bufptr=buff;
while((nbytes=read(fd,bufptr,buff+sizeof(buff)-bufptr-1))>0)
{
bufptr += nbytes;
if(bufptr[-1] == '\n' || bufptr[-1]=='\r')
break;
}
*bufptr='\0';
printf("received is : %d bytes\n",nbytes);
printf("%s\n",buff);
printf("%x\n",buff[0]);
wait_flag = TRUE;
}
}
//restore old settings port
tcsetattr(fd,TCSANOW,&oldtio);
}
//обработчик сигнала. Устанавливает wait_flag in FALSE для индикации вышеприведенному циклу,что есть принятый символ
void signal_handler_IO (int status)
{
// printf("received SIGIO signal.\n");
wait_flag = FALSE;
}