У меня проблема при работе с com портом. Делов в том что, на моей маме 2 com порта с одним линукс работает прекрасно и обменивается данными с модемом (модем внешний), с другим нет. Хотя в винде с тем и тем портом все нормально работает. Я перебрал все потрты которые у меня есть в линукс начиная с ttyS1 (как я уже сказал с ttyS0 работае хорошо) и кончая ttyS4 и нефига не ввидит второй com порт как будто линукс и хоть ты тресни. В чем может быть проблема? (просто в линукс я полный ноль).
вот текст тестовой программы: ============================================================ #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/signal.h> #include <sys/types.h>
#define BAUDRATE B38400 #define MODEMDEVICE "/dev/ttyS1" #define FALSE 0 #define TRUE 1
void signal_handler_IO (int status); //definition of signal handler int wait_flag=TRUE; //TRUE while no signal received char devicename[80] = MODEMDEVICE;
long BAUD = BAUDRATE; // derived baud rate from command line long DATABITS = CS8; long STOPBITS = 0; long PARITYON = PARENB; long PARITY = 0;
main(int Parm_Count, char *Parms[]) { int fd, res; struct termios newtio; //place for old and new port settings for serial port struct sigaction saio; //definition of signal action unsigned char buf[255]; //buffer for where data is put
//open the device(com port) to be non-blocking (read will return immediately) fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { perror(devicename); _exit(-1); }
//install the serial handler before making the device asynchronous saio.sa_handler = signal_handler_IO; sigemptyset(&saio.sa_mask); //saio.sa_mask = 0; saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL);
// allow the process to receive SIGIO fcntl(fd, F_SETOWN, getpid()); // Make the file descriptor asynchronous (the manual page says only // O_APPEND and O_NONBLOCK, will work with F_SETFL...) fcntl(fd, F_SETFL, FASYNC);
// set new port settings for canonical input processing newtio.c_cflag = BAUD /*| CRTSCTS*/ | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; //ICANON; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; tcsetattr(fd,TCSANOW,&newtio);
// loop while waiting for input. normally we would do something useful here while (1) { unsigned char a[] = {0x00, 0x00, 0x00, 0x00, 0xe6};
write(fd,&a[0],5); //write 1 byte to the port printf("byte is write! '%02x%02x%02x%02x%02x'\n", a[0],a[1],a[2],a[3],a[4]); // after receiving SIGIO, wait_flag = FALSE, input is available and can be read if (wait_flag==FALSE) //if input is available { res = read(fd,buf,2); printf("%i bytes read! \n", res); wait_flag = TRUE; /* wait for new input */ } //end if wait flag == FALSE
usleep(2000000);
} //while stop==FALSE // restore old port settings close(fd); //close the com port //end if command line entrys were correct } //end of main
/*************************************************************************** * signal handler. sets wait_flag to FALSE, to indicate above loop that * * characters have been received. * ***************************************************************************/
void signal_handler_IO (int status) { //printf("received SIGIO signal.\n"); wait_flag = FALSE; } ============================================================ Спасибо