开发板上调试3G手机模块的问题
我在开发板上调试一个3G的手机模块,已经可以识别了,为了测试方便,我想从命令行接受AT指令,然后发往手机模块。
在程序里面有2个线程,一个接收我的输入,一个读取手机模块的输出。我是用fgets从stdin读取数据的,可无论我在键盘上输入什么,接收线程收到的数据都跟我输入的一模一样。比如我输入:testtest ,接收线程显示读取到的数据也是:testtest
如果我不用fgets从stdin获取命令,而是将AT指令写死在程序里,那么接收线程可以读取到手机模块的响应。
我想问下,这是怎么回事呢?我该怎么改才能做到从键盘接收数据,然后正确的发往手机模块,并让手机模块解析呢,程序代码如下,大家帮忙看看:
- C/C++ code
#include<stdio.h>#include<stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <termios.h>#include <unistd.h>#include <pthread.h>char buf_send[8192];char buf_recv[8192];void* (read_usb0_thread)(void* );void* (write_usb0_thread)(void* );int g_iExit=0;int g_fd_usb0;int main(int argc ,char *argv[]){ struct termios options; g_fd_usb0=open("/dev/ttyUSB0",O_RDWR); printf("open file:%d\r\n",g_fd_usb0); if(g_fd_usb0<0) { printf("open file err:%d\n",g_fd_usb0); return 0; } if(tcgetattr(g_fd_usb0, &options) != 0) { printf("GetSerialAttr"); return 0; } options.c_iflag &= ~(IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IUCLC|IXON|IXOFF|IXANY); options.c_lflag &= ~(ECHO|ECHONL|ISIG|IEXTEN|ICANON); options.c_oflag &= ~OPOST; if (tcsetattr(g_fd_usb0,TCSANOW,&options) != 0) { printf("SetSerialAttr"); return 0; } memset(buf_send,0x00,sizeof(buf_send)); memset(buf_recv,0x00,sizeof(buf_recv)); int iResult=0; pthread_t iUsb0RecvTheadID; pthread_t iUsb0SendTheadID; iResult = pthread_create(&iUsb0RecvTheadID, NULL, read_usb0_thread, NULL); if(0 !=iResult) { printf("create ttyusb0 read thread error:%d\n",iResult); return 0; } else { printf("create ttyUSB0 read thread sus,thread id:%d\n",iUsb0RecvTheadID); } iResult = pthread_create(&iUsb0SendTheadID, NULL, write_usb0_thread, NULL); if(0 !=iResult) { printf("create ttyusb0 write thread error:%d\n",iResult); return 0; } else { printf("create ttyUSB0 write thread sus,thread id:%d\n",iUsb0SendTheadID); } while (1) { if (g_iExit) { break; } usleep(500*1000); static int iCnt=0; iCnt++; if (iCnt%20==0) { printf("main running\n"); } } printf("program exits\n"); return 0;}void* (read_usb0_thread)(void* param){ int iResult=0; while (1) { if (g_iExit) { printf("exit usb0 read thread"); break; } memset(buf_recv,0x00,sizeof(buf_recv)); iResult = read(g_fd_usb0, buf_recv, sizeof(buf_recv)); // if (iResult>0) { printf("usb0-read:%s\n",buf_recv); } else { usleep(100*1000); } } return 0;}void* (write_usb0_thread)(void* param){ char *pBuf=NULL; int bPrintfMsg=0; int num=0; int iRet=0; while (1) { pBuf=fgets(buf_send,sizeof(buf_send)-1,stdin); if (NULL==pBuf) { printf("get:null,continue"); usleep(100*1000); continue; } if (strstr(pBuf,"quit") && strlen(pBuf)<=strlen("quit\r\n") ) { printf("receive quit command\n"); g_iExit=1; break; } if(NULL==strstr(pBuf,"\n")) { strcat(pBuf,"\n"); } iRet=write(g_fd_usb0, buf_send,strlen(buf_send)); if (iRet>0) { printf("(usb0-write:%s\n",pBuf); } else { printf("usb0 write err:%d",iRet); } memset(buf_send,0x00,sizeof(buf_send)); iRet=0; } return 0;}
[解决办法]
#include <stdlib.h>
#include <termios.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc,char**argv)
{
int fd=2,len=0,maxfd=0,iofd=0;
int flag=0,n=0,i;
struct termios tio;
fd_set write_fd,read_fd;
unsigned char buf[1500],buf2[128];
struct timeval over_timer;
speed_t spt=B9600;
if(argc>1)
fd=atoi(argv[1]);
if(argc>2)
switch(atoi(argv[2]))
{
case 2400:spt=B2400;break;
case 4800:spt=B4800;break;
case 9600:spt=B9600;break;
case 19200:spt=B19200;break;
case 38400:spt=B38400;break;
case 57600:spt=B57600;break;
case 115200:spt=B115200;break;
case 230400:spt=B230400;break;
}
if(argc>3)
flag=atoi(argv[3]);
memset(buf,0,sizeof(buf));
sprintf(buf,"/dev/ttyS%d",fd);
fd=open(buf,O_RDWR|O_NOCTTY);
tcgetattr(fd,&tio);
cfmakeraw(&tio);
cfsetispeed(&tio,spt);
cfsetospeed(&tio,spt);
tcsetattr(fd,TCSANOW,&tio);
memset(buf,0,sizeof(buf));
iofd=fileno(stdin);
while(1)
{
FD_ZERO(&write_fd);
FD_ZERO(&read_fd);
FD_SET(fd,&read_fd);
FD_SET(iofd,&read_fd);
if(fd>iofd)maxfd=fd;
else maxfd=iofd;
over_timer.tv_sec=5;
over_timer.tv_usec=0;
//FD_SET(fd,&write_fd);
if(len=select(maxfd+1,&read_fd,NULL, NULL, &over_timer) <= 0)
continue;
if(FD_ISSET(fd,&read_fd))
{
memset(buf,0,sizeof(buf));
sleep(1);
n=read(fd,buf,sizeof(buf));
printf("%s\n",buf+1);
if(flag){
printf("-----------------------\n");
for(i=0;i<n;i++)
{
printf("%02x ",buf[i]);
printf("\n");
}
}
}
if(FD_ISSET(iofd,&read_fd))
{
printf("-------------------------------------\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(strlen(buf)==0)continue;
strcat(buf,"\r\n");
len=write(fd,buf,strlen(buf));
printf(">%d >>%s\n",len,buf);
}
}
sleep(2);
close(fd);
}
这个是我以前调试板子上接的gprs模块时用的,你可以试下。