串口编程,怎么得到设备中存储的值如 AT+CMGL(读取短信)?int WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度 WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL); return (int)dwNumWrite;
}int ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度 ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);

return (int)dwNumRead;
}
没看懂  ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
nLength怎么会知道?不是设备中的字符长度吗?

解决方案 »

  1.   

    这个nLength是你自己定义的,表示你这次ReadFile要读取多长的数据
      

  2.   

    ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL); 
    // nLength是指要读取的长度, dwNumRead指实际读取的长度
    // msdn上写的很清楚
      

  3.   

    数据呢?pData里?
    nLength 是不是大概估计一个值,如一条短信最多70个字
    nLength =160就午了,pData可以是什么类型?
    CString 
    char
    int?
      

  4.   

    // pData可以是BYTE*,char*,int*
    // 如果应用在短信开发的话,char*最常用
      

  5.   

    hCom=CreateFile("COM4",//COM1口
    GENERIC_READ|GENERIC_WRITE,//允许读和写
    0,//独占方式
    NULL,
    OPEN_EXISTING,//打开而不是创建
    0,//同步方式
    NULL);
    if(hCom==INVALID_HANDLE_VALUE)
    {
    AfxMessageBox("打开COM失败!");
    }

    DCB dcb;
    GetCommState(hCom,&dcb);
    dcb.BaudRate=9600;
    dcb.ByteSize=8;
    dcb.Parity=NOPARITY;
    dcb.StopBits=ONESTOPBIT;
    dcb.fBinary=TRUE;
    dcb.fParity=FALSE;
    SetCommState(hCom,&dcb);
    SetupComm(hCom,1024,1024);
    CString m_send,str; m_send="AT+CMGF=0"+CHAR(13);
    dwCount=m_send.GetLength(); WriteFile(hCom,m_send,dwCount,&dwCount,NULL);
    m_send="AT+CMGL=4"+CHAR(13);
    dwCount=m_send.GetLength();
    dwCount=m_send.GetLength();
        char *cReadMessage;
    ReadFile(hCom,cReadMessage,(DWORD)200,&dwCount,NULL);CString strs;
    strs.Format("%c",*cReadMessage);
    MessageBox(strs);错误的.....
      

  6.   

    CString m_send,str; m_send="AT+CMGF=0"+CHAR(13); // CHAR(13),自定义函数?
    dwCount=m_send.GetLength(); // 不认为m_send作为参数能正确给GSM模块发送命令
    // WriteFile(hCom,m_send,dwCount,&dwCount,NULL); 
    WriteFile(hCom, m_send.GetBuffer(0), dwCount, &dwCount, NULL);
    m_send.ReleaseBuffer();m_send="AT+CMGL=4"+CHAR(13); 
    dwCount=m_send.GetLength(); 
    dwCount=m_send.GetLength(); 
    char *cReadMessage; 
    ReadFile(hCom,cReadMessage,(DWORD)200,&dwCount,NULL); CString strs; 
    //"%c", *cReadMessage?
    //strs.Format("%c",*cReadMessage);
    strs.Format("%s", cReadMessage); 
      

  7.   

    MessageBox(strs); 
    这一句
      

  8.   


    //很奇怪啊。
    // 单步调试的时候,在输出窗口看strs的值是什么...
      

  9.   

    一条AT命令的 回应数据应该是\r\n\r\n结束的,你就一直收到\r\n\r\n,或者接收一个比较大的数,比如1024
    ,然后再分割数据
      

  10.   

    CString m_send,str;

    m_send="AT+CMGF=0"+CHAR(13);
    dwCount=m_send.GetLength(); WriteFile(hCom,m_send,dwCount,&dwCount,NULL); m_send="AT+CMGL=4\r";
    dwCount=m_send.GetLength();
    WriteFile(hCom,m_send,dwCount,&dwCount,NULL);
    char ans[1000]; ReadComm(ans, 1000);
        AfxMessageBox(ans);
    可以读取出来,但有点不确定char ans[1000]到底要多大才适合?int CSMSPDUDlg::ReadComm(void *pData, int nLength)
    {
    DWORD dwNumRead; // 串口收到的数据长度 ReadFile(hCom, pData, (DWORD)nLength, &dwNumRead, NULL);

    return (int)dwNumRead;
    }
      

  11.   

    你用do While循环啊,条件是dwNumRead!=0
      

  12.   

    还有如何解码7-bit的短信编码!