我正试图通过linux中的串口读取sms消息,这张消息来自我放在huawei 3g usb调制解调器中的sim卡。在屏幕上显示某些短信之前,我必须执行该脚本很多次。有时它会显示不寻常的字符。我想要做的就是使用AT命令,c和串口从sim读取短信。以下是我正在使用的代码。
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 :(得分:0)
首先,您需要检查read
的返回值。基本上read
永远不能保证给你你想要的东西。它可能会提前返回,因为您的超时或被信号中断而没有读取任何内容(尽管您没有任何信号处理程序,因此这不是问题)或者只是部分读取。您需要使用返回值来推进缓冲区指针并阅读更多内容,直到您确定已读取所需的所有数据为止。
除此之外,您可能不应该只查看短信中的固定文本来确认发件人的ID。如果您需要知道它真的来自您认为发送它的服务器,我会使用公钥加密签署SMS ...
答案 1 :(得分:0)
显然Gnokii项目支持华为设备 - http://wiki.gnokii.org/index.php/Huawei
我要么选择gnokii,就这么简单:
$ gnokii --getsms
或至少查看gnokii来源,因为您所描述的问题看起来肯定像是同步或等待输出问题,而且他们几乎肯定已经有了一个很好的测试解决方案。