1

シリアルログアプリケーションでtermiosを使用しています。アプリケーションはシリアルポートを読み取り、データをファイルに保存します。また、標準入力からの入力を受け入れ、それをシリアルポートに送信します。

問題は、アプリケーションが(「q」を押して)終了すると、bash端末の設定が台無しになり、奇妙な文字が出力されることです(画像を参照)。

中央のシリアルポートからの端末出力データ、およびqを押すと奇妙な端末の動作

属性を元に戻すと、次のように成功します:resultsetatr = tcsetattr(STDIN_FILENO、TCSAFLUSH、&oldstdio); そして失敗します:resultsetatr = tcsetattr(STDIN_FILENO、TCSAFLUSH、&oldstdio);

プログラムが終了する前に示されているように。

プログラムは、USB-シリアルアダプタを備えたRaspberrypiで実行されています。

関連するコードは次のとおりです。

     void setup_termios()
      { memset(&stdio,0,sizeof(stdio));
        stdio.c_iflag=0;
        stdio.c_oflag=0;
        stdio.c_cflag=0;
        stdio.c_lflag=0;
        stdio.c_cc[VMIN]=1;
        stdio.c_cc[VTIME]=0;

        int resultsetatr;
        resultsetatr=tcgetattr(STDIN_FILENO,&oldstdio); //get old settings
        printf("get att stdin = %d\n",resultsetatr);
    resultsetatr=tcsetattr(STDIN_FILENO,TCSANOW,&stdio);
    printf("set att stdin = %d\n",resultsetatr);

        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking



    // This is the actual Serial Port termios structure
        memset(&tio,0,sizeof(tio));
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;
        tio.c_cc[VTIME]=5;

    //Opening the serial port
        tty_fd=open(DEVICE, O_RDWR | O_NONBLOCK | O_NOCTTY | O_NDELAY);

        if (tty_fd < 0) {
            perror(DEVICE);
            printf("\ryou dont have permission to open serial port, use : sudo     ./seriallog\r\n");
        close(tty_fd);
        tcsetattr(tty_fd,TCSANOW,&oldtio);
        tcsetattr(STDIN_FILENO,TCSANOW,&oldstdio);
        exit(-1);
        }      

    cfsetospeed(&tio,BAUD);            // 9600 baud
        cfsetispeed(&tio,BAUD);            // 9600 baud

    tcgetattr(tty_fd,&oldtio); //get old settings
        tcsetattr(tty_fd,TCSANOW,&tio);//set to new settings
}

int main(){
    time(&t1);
    setup_termios(); 
    create_logfile();
        while (rx_char!='q')
        {
                if (read(tty_fd,&rx_char,1)>0)        
                {
                    rx_char = rx_char & 0xff;


                    //if ( rx_char < 0 || rx_char > 126) rx_char =' ';  
                    time(&t2); //take time 2
                    dt = difftime(t2,t1);
                    if (dt>1800) {tx_char ='A';write(tty_fd,&tx_char,1); t1=t2;}  
                    putc(rx_char,stdout);
                    fputc(rx_char,output_file);              
                    if (rx_char == '\r') write_date_and_time_line(1);
                    check_for_next_day_file();

                }
                if (read(STDIN_FILENO,&tx_char,1)>0)  write(tty_fd,&tx_char,1);                     

        }

        puts("\r\n");
        close(tty_fd);
        fclose(output_file);

        int resultsetatr;

        //resultsetatr=tcsetattr(tty_fd,TCSANOW,&oldtio);
        //printf("tty : %d\n\r",resultsetatr);

        resultsetatr=tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldstdio);
        printf("set stdin att : %d\n",resultsetatr);

        resultsetatr=tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldstdio);
        printf("set stdin att : %d\n",resultsetatr);



        return 0;}
4

0 に答える 0