亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問有人遇到過這樣的錯誤嗎?是什么原因啊?

請問有人遇到過這樣的錯誤嗎?是什么原因???

PHP
富國滬深 2023-03-19 21:17:18
想從串口中讀取數據,在調用tcgetattr(fd,&ttys)時總是出現"Input/output error"這樣的錯誤,不知道為什么。
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

用tcgetattr函數與tcsetattr函數控制終端
為了便于通過程序來獲得和修改終端參數,Linux還提供了tcgetattr函數和tcsetattr函數。tcgetattr用于獲取終端的相關參數,而tcsetattr函數用于設置終端參數。

頭文件 <termios.h><unistd.h> 
函數形式 int tcgetattr(int fd, struct termios *termios_p);int tcsetattr(int fd, int optional_actions, const struct termios *termios_p); 
返回值 成功 失敗 是否設置errno 
0 ?1 是 

說明:tcgetattr函數用于獲取與終端相關的參數。參數fd為終端的文件描述符,返回的結果保存在termios結構體中,該結構體一般包括如下的成員

tcflag_t c_iflag; c_iflag:輸入模式標志,控制終端輸入方式 
tcflag_t c_oflag; oflag:輸出模式標志,控制終端輸出方式 
tcflag_t c_cflag; c_cflag:控制模式標志,指定終端硬件控制信息
tcflag_t c_lflag; c_lflag:本地模式標志,控制終端編輯功能
cc_t c_cc[NCCS]; c_cc[NCCS]:控制字符,用于保存終端驅動程序中的特殊字符,如輸入結束符等

tcsetattr函數用于設置終端的相關參數。參數fd為打開的終端文件描述符,參數optional_actions用于控制修改起作用的時間,而結構體termios_p中保存了要修改的參數。
optional_actions可以取如下的值。

TCSANOW:不等數據傳輸完畢就立即改變屬性。
TCSADRAIN:等待所有數據傳輸結束才改變屬性。
TCSAFLUSH:清空輸入輸出緩沖區才改變屬性。錯誤信息:
EBADF:非法的文件描述符。
EINTR:tcsetattr函數調用被信號中斷。
EINVAL:參數optional_actions使用了非法值,或參數termios中使用了非法值。
ENCTTY:非終端的文件描述符。實例演練:
程序p6.2.c通過修改終端控制字符,將終端輸入結束符由“Ctrl+D”,修改成了“Ctrl+G”。首先,程序調用tcgetattr函數獲得標準輸入的termios信息,將termios結構體中的c_cc[VEOF]控制字符的修改成0x07(即Ctrl+G);然后,使用tcsetattr函數將修改后的termios參數設置到終端中。具體代碼如下所示:
//p6.2.c 修改終端控制字符示例
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>

int main(void){
//term用于存儲獲得的終端參數信息
struct termios term;
int err;//獲得標準輸入的終端參數,將獲得的信息保存在term變量中
if(tcgetattr(STDIN_FILENO,&term)==-1){
perror("Cannot get standard input description");
return 1;
}//修改獲得的終端信息的結束控制字符
term.c_cc[VEOF]=(cc_t)0x07;//使用tcsetattr函數將修改后的終端參數設置到標準輸入中
//err用于保存函數調用后的結果
err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);//如果err為-1或是出現EINTR錯誤(函數執行被信號中斷),
//給出相關出錯信息
if(err==-1 && err==EINTR){
perror("Failed to change EOF character");
return 1;
}return 0;
}
使用gcc編譯p6.2.c程序,得到名為p6.2的可執行程序。在執行p6.2程序前,按“Ctrl+D”可以使終端結束。執行p6.2程序后,按“Ctrl+D”失去了作用,而輸入“Ctrl+G”實現了原來“Ctrl+D”的功能。


查看完整回答
反對 回復 2023-03-22
  • 1 回答
  • 0 關注
  • 252 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號