2011-07-04 38 views
0

試圖通過linux中的串口讀取sms消息,從一張安裝在華爲3g USB調制解調器內的SIM卡讀取。我必須在屏幕上顯示一些短信之前執行腳本。有時它顯示不尋常的字符。我想要做的就是使用AT命令,c和串行端口從SIM卡中讀取短信。以下是我正在使用的代碼。在Linux下使用串口讀取SIM卡上的SMS消息使用C

int main(){ 
int fd; 
struct termios options; 

/* open the port */ 
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); 
if (fd == -1) 
{ /* Could not open the port */ 
fprintf(stderr, "open_port: Unable to open /dev/ttyS1 - %s\n",strerror(errno)); 
}else{ 
printf("port opened\n"); 
} 
fcntl(fd, F_SETFL, 0); 

/* get the current options */ 
tcgetattr(fd, &options); 

/* set raw input, 1 second timeout */ 
options.c_cflag |= (CLOCAL | CREAD); 
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_oflag &= ~OPOST; 
options.c_cc[VMIN] = 0; 
options.c_cc[VTIME] = 10; 

/* set the options */ 
tcsetattr(fd, TCSANOW, &options); 

char buffer[400]; /* Input buffer */ 
char *bufptr; /* Current char in buffer */ 
int nbytes; /* Number of bytes read */ 
int tries; /* Number of tries so far */ 

for (tries = 0; tries < 1; tries ++) 
{ 
/* send an AT command*/ 
if (write(fd, "AT+CMGL=\"ALL\"\r", strlen("AT+CMGL=\"ALL\"\r")) < 3){ 
printf("command sent\n"); 
continue; 
} 

/* read characters into our string buffer*/ 
bufptr = buffer; 

nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1); 
printf("%s\n",bufptr); 

char *p; 

p = strstr(buffer, "tin"); 
printf("%s",p); 

p = strstr(buffer, "server"); 
if(p == NULL) printf("not from server\n"); 

*bufptr = '\0'; 

} 
return 0; 
} 

回答

0

首先,您需要檢查返回值read。基本上read永遠不會保證給你你想要的。由於超時或被信號中斷(儘管您沒有任何信號處理程序,因此這裏不存在問題),或者只給予部分讀取,它可能會提前返回而沒有任何讀取。您需要使用返回值來提高您的緩衝區指針並閱讀更多內容,直到您確定自己已經閱讀了所有要查找的數據。

除此之外,你可能不應該只看SMS中的固定文本來確認發件人的ID。如果你需要知道它真的從你覺得送了它的服務器來我會簽署公鑰密碼的短信......

0

Appearently Gnokii項目支持華爲設備 - http://wiki.gnokii.org/index.php/Huawei

我要麼去gnokii,正是這種簡單:

$ gnokii --getsms 

,或者至少看看gnokii來源,因爲這個問題你描述的外觀一定會喜歡的同步或等待換輸出的問題,他們幾乎可以肯定已經有一個很好的和測試解決方案。