所要实现的功能:  向手机号为13734608118中发送两条命令 一条是字符0000 一条是一个号码为01234567890 的手机号 并且设置短消息到达自动提示
出现的问题: 在ReadComm的时候机器就死了,我的写的代码有好多的地方是不完善的能否指点一下。
代码:
void CDlgInfo1::OnButton() 
{
// TODO: Add your control notification handler code here BOOL   ComB;   
//打开串口
ComB=OpenSendComm(); if (!ComB)
{
return;
}
//初始MODERN并发送信息
if (!gsmInit())
{
return ;
}

CloseHandle(portID);}
BOOL CDlgInfo1::OpenSendComm()
{
char sIni[2000];
ComVcFunction::GetCurDir(sIni);
strcat(sIni,"\\setup.ini");
int SENDCOM=GetPrivateProfileInt("SYS","SENDCOM",2,sIni);
SENDCOM=(SENDCOM==0)?2:SENDCOM;
wsprintf( ComName, "COM%d", SENDCOM );
portID = CreateFile( ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL ); if(portID == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;}
BOOL CDlgInfo1::gsmInit()
{
char ans[128]; // 应答串 // 测试GSM-MODEM的存在性
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL)  return FALSE; // 关闭回显
WriteComm("ATE0\r", 5);
ReadComm(ans, 128); // TXT模式
WriteComm("AT+CMGF=1\r", 10);
ReadComm(ans, 128); // 设置对方号码
WriteComm("AT+CMGS=<13734608118>\r", 20); //要发送的内容
WriteComm("AT+IDNT=0000\r", 13);
WriteComm("AT+PHON=11111111111\r", 20); //设置短消息到达自动提示
WriteComm("AT+CNMI=1,1,0,0,1()\r", 13);
return TRUE;
}int CDlgInfoXiangbian::WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度 WriteFile(portID, pData, (DWORD)nLength, &dwNumWrite, NULL); return (int)dwNumWrite;
}
// 读串口
// 输入: pData - 待读的数据缓冲区指针
//       nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int CDlgInfoXiangbian::ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度 ReadFile(portID, pData, (DWORD)nLength, &dwNumRead, NULL);

return (int)dwNumRead;
}

解决方案 »

  1.   

    先UP 一下 是那个ReadCom出错 指下地方
      

  2.   

    如果是第一个就出错的话 你最好看下ReadCom函数里面那写错了 自己跟踪下~
    或者看WriteComm里面数据是否写成功了?
      

  3.   

    是在第一个ReadComm就 死了,WriteComm里面数据是成功的 
      

  4.   

    是不是ReadComm在等待返回?
    串口超时设置的短一些。
      

  5.   

    应该先看一下缓冲区有多少数据,然后就读多少,你这样写一直要读128个字节才返回,所以一直在等待,估计是modem驱动的问题,我也遇见过类似的情况   struct _COMSTAT status;
        int             n; 
        unsigned long   etat;    n = 0;    if (serial_handle!=INVALID_HANDLE_VALUE)
        {
            ClearCommError(serial_handle, &etat, &status);
            n = status.cbInQue;
        }其中n就是现在缓冲区的数据
      

  6.   

    int CDlgInfoXiangbian::ReadComm(void* pData, int nLength) 
    为什么第一个参数以Void *传递而不以char *的方式?
      

  7.   

    SetCommTimeouts() //设置串口超时
      

  8.   

    还有,最好贴一下ReadComm()的代码
      

  9.   

    if(!ReadFile(portID, pData, (DWORD)nLength, &dwNumRead, NULL))
      DWORD dwError = GetLastError();  //看看是串口错误还是一直在等待。return (int)dwNumRead; 
      

  10.   

    问一下 再MFC中 CTRL键和Z键 怎么表示 不好意思 我才学MFC不到3周
      

  11.   

    BOOL CDlgInfoXiangbian::gsmInit()
    { WriteComm("AT\r", 3); WriteComm("ATE0\r", 5); // TXT模式
    WriteComm("AT+CMGF=1\r", 10); // 设置对方号码
    WriteComm("AT+CMGS=<13734608118>\r", 22); Sleep(2000); //要发送的内容
    WriteComm("AT+IDNT=0000", 12);
    WriteComm("\26", 1);
    WriteComm("\r", 1); //设置短消息到达自动提示
    WriteComm("AT+CNMI=1,1,0,0,1()\r", 13);
    return TRUE;
    }
    我把程序该成这样了 干脆就不等返回值了  但是还没发送成功 这是为什么呢  还有 我不会把超时设短 不好意思:)
      

  12.   

    AT
    ATE0
    AT+CMGF=1
    AT+CMGS=<13734608118>
    AT+IDNT=0000
    AT+CNMI=1,1,0这是我通过串口调试助手 得到的东西  
      

  13.   

    谢谢大家 的指点 我的问题解决了一部分 尤其要谢谢 LFCHEN 。不过我还有个问题 呵呵::
    就是第一个READCOMM的时候还是死机 但是当我用超级终端调试一次以后 程序就可以运行了,等到机器重启后又出现了那个问题 请大家指点一下
      

  14.   

    写过类似的程序
    源代码在公司楼主用串口助手发AT命令给那个GSM的东西看看能不能成功
    一步一步查。。