当前位置: 代码迷 >> Windows Mobile >> 怎么确定 AT 指令使用的COM
  详细解决方案

怎么确定 AT 指令使用的COM

热度:7   发布时间:2016-04-25 07:42:21.0
如何确定 AT 指令使用的COM ?
我想从Windows Mobile 6.0 (dopod p900) 上通过AT指令获得CELLID,(想获得当前位置接收到的所有的CellID信息,而RIL 只能获得一个,通过AT指令来实现,这种思路对吗?)
第一步:我如何找到可以发送AT 指令的串口?
第二步:如何去设置串口?
下面有段代码,是小弟东抄抄,西抄抄的,还不可以用,第一步就串口打不开。
C/C++ code
char* GetCNSE( char * comPort){    TCHAR IMEI[24] = {L'\0'};   TCHAR AT_IMEI[] = L"AT+CGSN\n"; //查看产品 IMEI 序列号   TCHAR CGSN[] = L"CGSN";   TCHAR *p;   TCHAR tempbuf[64] = { L'\0' };   int i = 0;   HANDLE hCom;   DCB dcb;   DWORD nWritten;   DWORD nRead;      hCom= CreateFile( L"COM9:" ,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);   if (hCom==NULL || hCom==INVALID_HANDLE_VALUE)    {      hCom= NULL;      return "";    }       // BYTE comdevcmd[2]= {0x84, 0x00};    if (!GetCommState(hCom, &dcb))    {      return "ERROR:GetCommState Failed";          }    dcb.BaudRate= CBR_115200;    dcb.ByteSize= 8;    dcb.fParity= false;    dcb.StopBits= ONESTOPBIT;    if (!SetCommState(hCom, &dcb))    {      return "ERROR:SetCommState Failed";           }    Sleep(2000);//   WritePort(AT_IMEI, lstrlen(AT_IMEI));    // 写串口函数   WriteFile(hCom, AT_IMEI, lstrlen(AT_IMEI), &nWritten, NULL);   Sleep(2000);   memset (tempbuf, L'\0', sizeof(tempbuf) >> 1);// i = ReadPort(tempbuf, sizeof(tempbuf) >> 1);  //读串口函数   ReadFile(hCom, tempbuf, sizeof(tempbuf), &nRead, NULL);   p = wcsstr(tempbuf, CGSN);   memcpy(IMEI, p + 7, 15);      //这为什么是这样,我也不知道    if (hCom!=NULL)    {        CloseHandle(hCom);        hCom= NULL;    }    return "OK";}


------解决方案--------------------
1、用at指令无法得到所有的CellID,只能得到当前的。
2、你可以参考CellTrack for wince 开源的程序。是通过读内存中的cell数据。
------解决方案--------------------
dcb.BaudRate= CBR_115200; 
dcb.ByteSize= 8; 
dcb.fParity= false; 
dcb.StopBits= ONESTOPBIT; 

COM口要设置正确的波特率才能写,由于不同的机器用的通讯芯片不同,所用来发送AT指令的COM口及其波特率也有所差异,所以这种方法的通用性也不高。如果你有办法反编译CPS,MTS等专业的CellID手机定位软件,把它们选项里面各种机型的配置信息读取并分析出来的话,则它们能支持的机型你用这种方法也可能支持。
------解决方案--------------------
RIL使用的串口驱动可以查注册表获得
记得好像是类似
[HKEY_LOCAL_MACHINE\Drivers\BuildIn\RIL]

[HKEY_LOCAL_MACHINE\Software\Microsoft\RIL]
能找到有用的信息

还有一点,AT命令并不一定从实际的物理串口获得,也有可能从共享内存获取,典型的多普达大量采用的OMAP730和850架构的手机,就是AP和BP之间共享内存交换AT数据,但windows mobile会把其抽象成一个串口驱动
------解决方案--------------------
我觉得这个有问题的,RIL首先会占用了它所要使用的COM口,所以,你open的时候它会报错的,错误号应该是此文件已经被打开或者被占用的。。。
所以,想通过AT命令来获得你想要的东西好像不太现实。
  相关解决方案