write()函数返回errno = 4串口comunication stop.how来解决这个问题?

时间:2013-07-07 14:50:43

标签: c linux serial-port

    configuration of my serial port is:

        timer_t tid = 0;
            struct itimerspec it;

            fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);
            if (fd == -1) {
                perror("open_port: Unable to open /dev/ttyS0\n");
                exit(1);
            }

            satimer.sa_handler = signal_handler_TIMER;
            satimer.sa_flags = 0;
            satimer.sa_restorer = NULL;
            sigaction(SIGALRM, &satimer, NULL);

            it.it_value.tv_sec = 0;
            it.it_value.tv_nsec = 10000000;
            it.it_interval.tv_sec = 0;
            it.it_interval.tv_nsec = 10000000;
            if (timer_create(CLOCK_REALTIME, NULL, &tid) == -1)
                fprintf(stderr, "error in timer_create \n");
            // printf("timer ID is 0x%lx\n", (long) tid);
            if (timer_settime(tid, 0, &it, NULL) == -1)
                fprintf(stderr, "error in settime \n");

            fcntl(fd, F_SETFL, 0);
            fcntl(fd, F_SETOWN, getpid());
            fcntl(fd, F_SETFL, O_SYNC); /**<<<<<<------This line made it work.**/

            tcgetattr(fd, &termAttr);
            //baudRate = B115200;          /* Not needed */
            cfsetispeed(&termAttr, B9600);
            cfsetospeed(&termAttr, B9600);
            termAttr.c_cflag |= PARENB;
            termAttr.c_cflag &= ~PARODD;
            termAttr.c_cflag &= ~CSTOPB;
            termAttr.c_cflag &= ~CSIZE;
            termAttr.c_cflag |= CS8;
            termAttr.c_cflag |= (CLOCAL | CREAD);
            termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
            termAttr.c_iflag &= ~(IXON | IXOFF | IXANY);
            termAttr.c_oflag &= ~OPOST;
            termAttr.c_cc[VMIN] = 5;
            termAttr.c_cc[VTIME] = 5;
            tcsetattr(fd, TCSANOW, &termAttr);
    ...................
    void PowerUp(void){
        unsigned char *p_commands,ima,komanda = STATUS_REQUEST;
        p_commands = &comandi[0];
        unsigned char *p_tx_buffer_;
        for (;;) {
                if ((milisekundi == 10) || (milisekundi == 30) || (milisekundi == 50)
                        || (milisekundi == 70) || (milisekundi == 90)) {
                    makeTXpaket(0x00);
                    makeTXpaket(komanda);
                    p_tx_buffer_ = &tx_buffer[1];
                    nbytes = write(fd, tx_buffer, *p_tx_buffer_);
                                printf("%d"errno);
                    if (nbytes != sizeof(tx_buffer)) {

                    }
                    sleep(0.2);
                    bytes = read(fd, rx_buffer, sizeof(rx_buffer));
                                printf("%d"errno);
                                if (bytes != sizeof(rx_buffer)) {
                                }
                                printf("%X\n", rx_buffer);
                            }
.....................

经过n次写入和读取串行串口通信停止和errno = 4如何解决这个问题?为什么串口通信停止?我的定时器中断了write()函数,这就是这个原因?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

那是EINTR,这意味着您的程序在write能够写入数据之前发出信号。

由于程序中有一个基于信号的计时器,可能是那个中断通话的信号。

您可能需要在SA_RESTART中设置satimer.sa_flags标记。阅读signal(7) manual page中有关信号和SA_RESTART标志的更多信息。