当前位置: 技术问答>linux和unix
开发板上调试3G手机模块的问题
来源: 互联网 发布时间:2017-01-23
本文导语: 我在开发板上调试一个3G的手机模块,已经可以识别了,为了测试方便,我想从命令行接受AT指令,然后发往手机模块。 在程序里面有2个线程,一个接收我的输入,一个读取手机模块的输出。我是用fgets从stdin读取数...
我在开发板上调试一个3G的手机模块,已经可以识别了,为了测试方便,我想从命令行接受AT指令,然后发往手机模块。
在程序里面有2个线程,一个接收我的输入,一个读取手机模块的输出。我是用fgets从stdin读取数据的,可无论我在键盘上输入什么,接收线程收到的数据都跟我输入的一模一样。比如我输入:testtest ,接收线程显示读取到的数据也是:testtest
如果我不用fgets从stdin获取命令,而是将AT指令写死在程序里,那么接收线程可以读取到手机模块的响应。
我想问下,这是怎么回事呢?我该怎么改才能做到从键盘接收数据,然后正确的发往手机模块,并让手机模块解析呢,程序代码如下,大家帮忙看看:
在程序里面有2个线程,一个接收我的输入,一个读取手机模块的输出。我是用fgets从stdin读取数据的,可无论我在键盘上输入什么,接收线程收到的数据都跟我输入的一模一样。比如我输入:testtest ,接收线程显示读取到的数据也是:testtest
如果我不用fgets从stdin获取命令,而是将AT指令写死在程序里,那么接收线程可以读取到手机模块的响应。
我想问下,这是怎么回事呢?我该怎么改才能做到从键盘接收数据,然后正确的发往手机模块,并让手机模块解析呢,程序代码如下,大家帮忙看看:
#include
#include
#include
#include
#include
#include
#include
#include
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:%drn",g_fd_usb0);
if(g_fd_usb00)
{
printf("usb0-read:%sn",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)0)
{
printf("(usb0-write:%sn",pBuf);
}
else
{
printf("usb0 write err:%d",iRet);
}
memset(buf_send,0x00,sizeof(buf_send));
iRet=0;
}
return 0;
}
|
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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)