读书人

开发板上调试3G手机模块的有关问题

发布时间: 2012-03-13 11:21:11 作者: rapoo

开发板上调试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模块时用的,你可以试下。

读书人网 >UNIXLINUX

热点推荐