我想从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命令来获得你想要的东西好像不太现实。