m_send="AT+CMGL=4\r"
WriteFile(hCom,m_send,dwCount,&dwCount,NULL);
char ans1[1000];
ReadComm(ans1, 1000); .........m_send="AT\r"
WriteFile(hCom,m_send,dwCount,&dwCount,NULL);
char ans2[1000]; // 应答串

ReadComm(ans2, 1000);AfxMessageBox(ans2);其实偶只想得到AT返回的OK结果,现在是多了,AT+CMGL=4后取得的结果.是否这样表述正确,就是怎么把
"m_send="AT+CMGL=4\r"
WriteFile(hCom,m_send,dwCount,&dwCount,NULL);
""
这一句的执行后的串口数据清理干净。。

解决方案 »

  1.   

    // 上一次ReadFile()或者WriteFile()之后,PurgeComm()清理输入缓冲区。
      

  2.   

    DCB dcb; // 串口控制块
    COMMTIMEOUTS timeouts = { // 串口超时控制参数
    1000, // 读字符间隔超时时间: 100 ms
    1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
    500, // 基本的(额外的)读超时时间: 500 ms
    100, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
    500}; // 基本的(额外的)写超时时间: 100 ms hCom = CreateFile(pPort, // 串口名称或设备路径
    GENERIC_READ | GENERIC_WRITE, // 读写方式
    0, // 共享方式:独占
    NULL, // 默认的安全描述符
    OPEN_EXISTING, // 创建方式
    0, // 不需设置文件属性
    NULL); // 不需参照模板文件

    if(hCom == INVALID_HANDLE_VALUE) // 打开串口失败
    {
    MessageBox("打开端口失败,请重新选择端口!","第1房产无线应用平台",MB_ICONQUESTION);
    m_nConfig=0;
    return FALSE;
    } GetCommState(hCom, &dcb); // 取DCB dcb.BaudRate=nBaudRate;
    dcb.ByteSize=nByteSize;
    dcb.Parity=NOPARITY;
    dcb.StopBits=ONESTOPBIT;
    dcb.fBinary=TRUE;
    dcb.fParity=FALSE; SetCommState(hCom,&dcb); // 设置DCB SetupComm(hCom, 2480, 2480); // 设置输入输出缓冲区大小 SetCommTimeouts(hCom, &timeouts); // 设置超时 Sleep(1000); // 测试GSM-MODEM的存在性
    char ans[128];
    CString strTemp;
    strTemp="AT\r";
    dwCount=strTemp.GetLength(); PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); WriteFile(hCom,strTemp,dwCount,&dwCount,NULL);
    Sleep(3000);
    ReadComm(ans, 128); if (strstr(ans, "OK") != NULL)
    {
    MessageBox("成功");
    }
    else
    {
    MessageBox("失败");
    }
    结果是这样的,为什么开电脑一连接始终是失败如果用windows超级终端连接一下串口,再用这段代码连接就成功了?难道需要预热.....
      

  3.   

    // 可能是DCB设置的问题。
    // 用AccessPort之类的软件监视一下串口动作。
      

  4.   


    占用的情况应该可能性小,如果被占用,用windows超级终端也会连不起阿.如果用超级终端AT一下,或者根本不用AT只要连接成功,再反回来用程序连接就成功了.
      

  5.   


    dcb.BaudRate=115200;
    dcb.ByteSize=8;
    dcb.Parity=NOPARITY;
    dcb.StopBits=ONESTOPBIT;
    dcb.fBinary=TRUE;
    dcb.fParity=FALSE;这个跟超级终端一样的参数.超级终端用这个参加连接是成功的.