CString comNo;
for(int i = 0; i < 9; i++)
{
comNo.Format(L"COM%d:", i);
// comNo.Format(L"COM%d:", 9);
hCom = CreateFile(comNo, GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
0, NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
continue;
}
else
{
//----------设置串口---------------
DCB comDCB;
comDCB.DCBlength=sizeof(DCB);
GetCommState(hCom,&comDCB);
comDCB.BaudRate = CBR_115200;
// comDCB.BaudRate = 460800;
comDCB.Parity = NOPARITY;
comDCB.StopBits = 1;
comDCB.ByteSize = 8;
SetCommState(hCom,&comDCB);
//-------------设置超时值---------------------
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(hCom,&CommTimeouts);//获得当前的超时值
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
CommTimeouts.WriteTotalTimeoutMultiplier = 10;
SetCommTimeouts(hCom,&CommTimeouts);
//-------------写串口---------------------
CString readCStr, imeiNum;
DWORD cBytes;
char tmp[32] = { '\0' };
CCharEncoder en;
WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
//-------------读串口---------------------
ReadFile(hCom, &tmp, 64, &cBytes, NULL );
readCStr = en.CharsToCStringUTF8(tmp);
if(-1 == readCStr.Find(L"OK"))
{
continue;
}
else
{
WriteFile(hCom, "AT+CGSN\r", sizeof("AT+CGSN\r"), &cBytes, NULL );//写串
Sleep(1000);
//清空字符串缓存
memset(tmp, 0, sizeof(tmp));
readCStr.Empty();
ReadFile(hCom, &tmp, 64, &cBytes, NULL );//读串
readCStr = en.CharsToCStringUTF8(tmp);
for(int i = 0; i < readCStr.GetLength(); i++)
{
if('0' <= readCStr.GetAt(i) && '9' >= readCStr.GetAt(i))
{
imeiNum += readCStr.GetAt(i);
}
}
CloseHandle(hCom);
// AfxMessageBox(imeiNum,NULL,NULL);
return imeiNum;
}
}
}
CloseHandle(hCom);
return L"null";
谁来解救我啊?要疯了!
18 个解决方案
#1
GPRS串口号,不是指定的?
#2
嗯 有几个
#3
我通过串口调试工具看见几个都是SIM900 GPRS的
#4
单步跟踪或者打印出LOG,看看运行到哪里,不行了。
#5
我单步跟踪了 其中有几个串口可用 但是向他们发送AT的时候没有返回OK 但是我用串口调试工具发送AT是肯定会返回OK的!
#6
那几个可用的串口 没有返回OK 程序就最后返回NULL了
#7
波特率呢?
WriteFile , 成功了么?
WriteFile , 成功了么?
#8
我也怀疑是波特率的问题,但是我用串口调试工具也是用的115200 刚加上判断发现WriteFile也是写成功了的
DWORD isok;
isok = WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
if(isok!=0)
{
AfxMessageBox(L"成功啦",NULL,NULL);
}
else
{
AfxMessageBox(L"失败啦!",NULL,NULL);
}
弹出成功!。。。
DWORD isok;
isok = WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
if(isok!=0)
{
AfxMessageBox(L"成功啦",NULL,NULL);
}
else
{
AfxMessageBox(L"失败啦!",NULL,NULL);
}
弹出成功!。。。
#9
写串口之后,你就去读了。写串口之后,你sleep一下,或者线程去读串口试试。
#10
sleep还是不行 要疯了!啊啊啊
#11
找到问题了 但是怎么解决啊 ! 我写入AT\r返回AT 我发送AT1\r 返回AT1 发送AT123 返回AT123 也就是说\r没有写入 AT\r\n AT\n 全部没用! 跪求大神!
#12
求大神解决 分不是问题啊 不够可以加!
#13
你先发一个ATE0或者是ATE0V1看看,这个是取消回显的,不知道是否是你的模块在开机状态下默认是回显的,但是从你后面说的好像是回显的。只能说试试,
#14
问题就是你说的这个问题,开机状态是有回显的 怎么取消啊 我通过串口工具发ATE0 但是重启之后又不行了!
#15
那你每次开机的时候都发这个命令啊
#16
//-------------写串口---------------------
CString readCStr, imeiNum;
DWORD cBytes;
char tmp[64] = { '\0' };
CCharEncoder en;
WriteFile(hCom, "ATE0", sizeof("ATEO"), &cBytes, NULL );
Sleep(1000);
WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
Sleep(1000);
//-------------读串口---------------------
ReadFile(hCom, &tmp, 64, &cBytes, NULL );
readCStr = en.CharsToCStringUTF8(tmp);
if(-1 == readCStr.Find(L"OK"))
{
continue;
}
else
{
WriteFile(hCom, "AT+CGSN\r", sizeof("AT+CGSN\r"), &cBytes, NULL );//写串
Sleep(1000);
//清空字符串缓存
memset(tmp, 0, sizeof(tmp));
readCStr.Empty();
ReadFile(hCom, &tmp, 64, &cBytes, NULL );//读串
这样写发送ATE0 不行啊 什么原因!
#17
估计是你的结束符出了问题.我使用的模块,发送命令都是以回车换行结束.你好好看看文档,查询一下,结束符对不对.
#18
嗯 问题已经解决了 就是结束符出的问题!谢谢大家了!
#1
GPRS串口号,不是指定的?
#2
嗯 有几个
#3
我通过串口调试工具看见几个都是SIM900 GPRS的
#4
单步跟踪或者打印出LOG,看看运行到哪里,不行了。
#5
我单步跟踪了 其中有几个串口可用 但是向他们发送AT的时候没有返回OK 但是我用串口调试工具发送AT是肯定会返回OK的!
#6
那几个可用的串口 没有返回OK 程序就最后返回NULL了
#7
波特率呢?
WriteFile , 成功了么?
WriteFile , 成功了么?
#8
我也怀疑是波特率的问题,但是我用串口调试工具也是用的115200 刚加上判断发现WriteFile也是写成功了的
DWORD isok;
isok = WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
if(isok!=0)
{
AfxMessageBox(L"成功啦",NULL,NULL);
}
else
{
AfxMessageBox(L"失败啦!",NULL,NULL);
}
弹出成功!。。。
DWORD isok;
isok = WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
if(isok!=0)
{
AfxMessageBox(L"成功啦",NULL,NULL);
}
else
{
AfxMessageBox(L"失败啦!",NULL,NULL);
}
弹出成功!。。。
#9
写串口之后,你就去读了。写串口之后,你sleep一下,或者线程去读串口试试。
#10
sleep还是不行 要疯了!啊啊啊
#11
找到问题了 但是怎么解决啊 ! 我写入AT\r返回AT 我发送AT1\r 返回AT1 发送AT123 返回AT123 也就是说\r没有写入 AT\r\n AT\n 全部没用! 跪求大神!
#12
求大神解决 分不是问题啊 不够可以加!
#13
你先发一个ATE0或者是ATE0V1看看,这个是取消回显的,不知道是否是你的模块在开机状态下默认是回显的,但是从你后面说的好像是回显的。只能说试试,
#14
问题就是你说的这个问题,开机状态是有回显的 怎么取消啊 我通过串口工具发ATE0 但是重启之后又不行了!
#15
那你每次开机的时候都发这个命令啊
#16
//-------------写串口---------------------
CString readCStr, imeiNum;
DWORD cBytes;
char tmp[64] = { '\0' };
CCharEncoder en;
WriteFile(hCom, "ATE0", sizeof("ATEO"), &cBytes, NULL );
Sleep(1000);
WriteFile(hCom, "AT\r", sizeof("AT\r"), &cBytes, NULL );
Sleep(1000);
//-------------读串口---------------------
ReadFile(hCom, &tmp, 64, &cBytes, NULL );
readCStr = en.CharsToCStringUTF8(tmp);
if(-1 == readCStr.Find(L"OK"))
{
continue;
}
else
{
WriteFile(hCom, "AT+CGSN\r", sizeof("AT+CGSN\r"), &cBytes, NULL );//写串
Sleep(1000);
//清空字符串缓存
memset(tmp, 0, sizeof(tmp));
readCStr.Empty();
ReadFile(hCom, &tmp, 64, &cBytes, NULL );//读串
这样写发送ATE0 不行啊 什么原因!
#17
估计是你的结束符出了问题.我使用的模块,发送命令都是以回车换行结束.你好好看看文档,查询一下,结束符对不对.
#18
嗯 问题已经解决了 就是结束符出的问题!谢谢大家了!