0

シリアル ポート経由でデバイスと通信できるように、C でプログラムを作成する必要があります。ポートの構成は、9600BPS スタート ビット:1 データ ビット:8 パリティ ビット:偶数ストップ ビット:1 である必要があります。ポートの構成方法のコピーをお送りしますが、問題があり、解決できます。

100 ~ 200 ミリ秒ごとにステータス リクエストをデバイスに送信すると、タイマーがあるため、デバイスは応答するはずです。電源投入シーケンスでデバイスにコマンドを送信すると、デバイスは応答しますが、いくつかの送受信コマンドの後、送信が停止するため、受信も停止し、書き込みコマンドと読み取りコマンドが送信されることに気付きます-1、その後は何も起きていません。なぜこれが起こっているのですか?

読み取ろうとしていて、読み取るものが何もないため、この場合は-1になりますが、この場合、書き込み後に-1になるのはなぜですか? よろしくお願いします。

int main(int argc, char *argv[]) {

    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, FNDELAY);
        fcntl(fd, F_SETOWN, getpid());
        fcntl(fd, F_SETFL, O_SYNC); 

        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);
        CleanRxBuffer();
        PowerUp();
                ......

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_);
                if (nbytes != sizeof(tx_buffer)) {
                    /* problem! */
                    printf("error writing on serial port!!!");
                }
                sleep(0.2);
                bytes = read(fd, rx_buffer, sizeof(rx_buffer));
                            if (bytes != sizeof(rx_buffer)) {
                                /* problem! */
                                printf("error reading on serial port!!!\n");
                            }
                            printf("%X\n", rx_buffer);
                        }
                        ima = CheckRXbuffer();
                        if ((answer == 0x40) && (ima != 0x00)) {
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0x50) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0x1B) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC0) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC4) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC1) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC2) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC5) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC6) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC7) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0xC3) && (ima != 0x00)){
                            p_commands++;
                            komanda = *p_commands;
                        }
                        if ((answer == 0x11) && (ima != 0x00)){
                            break;
                        }
                        if ((*p_commands) == 0xFF) {
                            break;
                        }
                        CleanRxBuffer();
    }
}
4

1 に答える 1

0

ファイル記述子をノンブロッキング モードに設定しました。

これは、 write() (さらに言えば、読み取り) を行うと、ポートが既にビジー状態である場合、書き込みが完了するのを待ってブロックされないことを意味します。

代わりに、-1 を返し、errno を EAGAIN (または EWOULDBLOCK) に設定します。

したがって、これを修正するには:

    fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);

O_NDELAY を削除します。O_NDELAY は O_NONBLOCK のエイリアスであり、これが read() と write() がご覧のように動作する理由です。

    fcntl(fd, F_SETFL, FNDELAY);

これは O_NDELAY と同じことです (実際、FNDELAY は O_NONBLOCK のエイリアスである O_NDELAY の互換エイリアスです)、フラグを再度設定するだけです。

    fcntl(fd, F_SETFL, O_SYNC); 

これは望ましくありません。しかし、それが物事を著しく傷つけるとは思いません。これにより、書き込みでバッファリングが使用されなくなります。

于 2013-07-16T10:53:43.430 に答える