シリアルログアプリケーションでtermiosを使用しています。アプリケーションはシリアルポートを読み取り、データをファイルに保存します。また、標準入力からの入力を受け入れ、それをシリアルポートに送信します。
問題は、アプリケーションが(「q」を押して)終了すると、bash端末の設定が台無しになり、奇妙な文字が出力されることです(画像を参照)。
属性を元に戻すと、次のように成功します: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;}