⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 非 标准输入.c

📁 linux串口编程示例3
💻 C
字号:
/*
3.2 非標準輸入程序  
在非標準的輸入程序模式下, 輸入的資料不會被組合成一行而輸入後的處理功能 (清除, 殺掉, 刪除, 等等.) 都不能使用. 這個模式有兩個功能控制參數: c_cc[VTIME] 設定字元輸入時間計時器, 及 c_cc[VMIN] 設定滿足讀取功能的最低字元接收個數.  

如果 MIN > 0 且 TIME = 0, MIN 設定為滿足讀取功能的最低字元接收個數. 由於 TIME 是 零, 所以計時器將不被使用.  

如果 MIN = 0 且 TIME > 0, TIME 將被當做逾時設定值. 滿足讀取功能的情況為讀取到單一字元, 或者超過 TIME 所定義的時間 (t = TIME *0.1 s). 如果超過 TIME 所定義的時間, 則不會傳回任何字元.  

如果 MIN > 0 且 TIME > 0, TIME 將被當做一個分割字元組的計時器. 滿足讀取功能的條件為 接收到 MIN 個數的字元, 或兩個字元的間隔時間超過 TIME 所定義的值. 計時器會在每讀到一個字元後重新計時, 且只會在第一個字元收到後才會啟動.  

如果 MIN = 0 且 TIME = 0, 讀取功能就馬上被滿足. 目前所存在的字元組個數, 或者 將回傳的字元組個數. 根據 Antonino (參考 貢獻) 所說, 你可以用 fcntl(fd, F_SETFL, FNDELAY); 在讀取前得到相同的結果.  

藉由修改 newtio.c_cc[VTIME] 及 newtio.c_cc[VMIN] 上述的模式就可以測試了.  

*/
#include  
#include  
#include  
#include  
#include  

#define BAUDRATE B38400 
#define MODEMDEVICE "/dev/ttyS1" 
#define _POSIX_SOURCE 1 /* POSIX 系統相容 */ 
#define FALSE 0 
#define TRUE 1 

volatile int STOP=FALSE;  

main() 
{ 
  int fd,c, res; 
  struct termios oldtio,newtio; 
  char buf[255]; 

 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );  
 if (fd <0) {perror(MODEMDEVICE); exit(-1); } 

 tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定 */ 

 bzero(&newtio, sizeof(newtio)); 
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; 
 newtio.c_iflag = IGNPAR; 
 newtio.c_oflag = 0; 

 /* 設定輸入模式 (非標準型, 不回應,...) */ 
 newtio.c_lflag = 0; 
  
 newtio.c_cc[VTIME]    = 0;   /* 不使用分割字元組計時器 */ 
 newtio.c_cc[VMIN]     = 5;   /* 在讀取到 5 個字元前先停止 */ 

 tcflush(fd, TCIFLUSH); 
 tcsetattr(fd,TCSANOW,&newtio); 


 while (STOP==FALSE) {       /* 輸入回圈 */ 
   res = read(fd,buf,255);   /* 在輸入 5 個字元後即返回 */ 
   buf[res]=0;               /* 所以我們能用 printf... */ 
   printf(":%s:%d\n", buf, res); 
   if (buf[0]=='z') STOP=TRUE; 
 } 
 tcsetattr(fd,TCSANOW,&oldtio); 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -