помогите с COM портом (прием какой то кривой)

Модератор: Модераторы разделов

vesel
Сообщения: 98

помогите с COM портом

Сообщение vesel »

Подключено к сотовому телефону.
Прием какой то кривой ((
принимает правильно только каждую 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;
    }
Спасибо сказали:
Serik
Сообщения: 149
ОС: SuSE Linux

Re: помогите с COM портом

Сообщение Serik »

Вполне возможно, что дело в настройках порта.
Я запускал под wine корректно работающую программу, и смотрел как она открывает com-порт.
Спасибо сказали: