专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 单片机

关于AT指令控制GSM短信猫的有关问题

发布时间:2010-06-14 16:01:55 文章来源:www.iduyao.cn 采编人员:星星草
关于AT指令控制GSM短信猫的问题
C/C++ code

打开串口
BOOL CComm::OpenComm(const char* pPort,
                  int nBaudRate/* = 115200*/,
                  int nParity/* = NOPARITY*/,
                  int nByteSize/* = 8*/,
                  int nStopBits/* = ONESTOPBIT*/)
{
    COMMTIMEOUTS timeouts = {   // 串口超时控制参数
                          100,  // 读字符间隔超时时间: 100 ms
                          1,    // 读操作时每字符的时间: 1 ms(n个字符总为n ms)
                          500,  // 基本的(额外的)读超时时间: 500 ms
                          1,    // 写操作时每字符的时间: 1 ms
                          100   // 基本的(额外的)写超时时间: 100 ms
                          } ;
    m_hComm = ::CreateFileA(       
                    pPort,        // 串口名称或设备路径
                    GENERIC_READ | GENERIC_WRITE, // 读写方式 充许读写
                    0,              // 共享方式: 必须以独占
                    NULL,           // 默认的安全描述符 为0表示该 串口不可被子程序继承
                    OPEN_EXISTING,  // 创建方式
                    0,              // 属性及相关标志,这里使用异步方式应用FILE_FLAG_OVERLAPPED 异步I/O ;0:不需设置文件属性
                    NULL) ;         // 不需参照模板文件 0:不能用模模板打开
                    
    if( m_hComm == INVALID_HANDLE_VALUE )
    {
        ::OutputDebugStringA("打开串口失败!\n");
        return FALSE;
    }

    ::GetCommState(m_hComm,&m_dcb) ;   // 取DCB
    m_dcb.BaudRate = nBaudRate ;    // 串口波特率
    m_dcb.ByteSize = nByteSize ;    // 一个字节的数据位个数,范围5~8
    m_dcb.Parity   = nParity ;      // 校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零
    m_dcb.StopBits = nStopBits ;    // 停止位个数,0~2分别对应1位、1.5位、2位停止位
    ::SetCommState(m_hComm,&m_dcb) ;  // 设置DCB

    ::SetupComm(m_hComm, 4096, 1024) ; //设置输入输出缓冲区大小
    ::SetCommTimeouts(m_hComm, &timeouts) ;//设置超时

    return TRUE ;
}
// 初始化
BOOL CComm::InitGsm()
{
    if ( m_hComm == NULL )
        return FALSE;

    char ans[128] = {0};  // 应答串

    // 测试GSM-MODEM是否存在
    WriteComm("AT\r", 3);
    ReadComm(ans, 128);
    if ( strstr(ans, "OK") == NULL )
        return FALSE;

// 此处代码,要不要都在ATD指令时都无回应
    // ECHO OFF
    //memset(ans, 0x0, sizeof(ans));
    //WriteComm("ATE0\r", 5);
    //ReadComm(ans, 128);

    // 0:PUD模式
    // 1:文本模式
    memset(ans, 0x0, sizeof(ans));
    WriteComm("AT+CMGF=0\n", 10);
    ReadComm(ans, 128);

    //WriteComm("AT+CSMS=1\n", 10);
    //ReadComm(ans, 128);
    //WriteComm("AT+CNMI=2,1\n", 12);
    //ReadComm(ans, 128);

    m_bIsOpen = TRUE;
    return TRUE;
}

// 写数据
int CComm::WriteComm(void *pData, int nLength)
{
    if ( m_hComm == NULL )
        return -1;

    DWORD dwBytes;  // 串口发出的数据长度
    ::WriteFile(m_hComm, pData, (DWORD)nLength, &dwBytes, NULL);
    
    return (int)dwBytes;
}

// 读数据
*/
int CComm::ReadComm(void* pData, int nLength)
{
    if ( m_hComm == NULL )
        return -1;

    DWORD dwNum;    // 串口收到的数据长度
    ::ReadFile(m_hComm, pData,(DWORD)nLength, &dwNum, NULL);

    return (int)dwNum;
}

///// 拨号,实际中是我的真实号码
    char *p = "ATD+8613800138000;\r";
"
    int len = WriteComm(cmd, strlen(cmd));

    char buf[128] = {0};
   // 此处有延时,延时时间比较长,我试过从1秒-30秒
    ReadComm(buf, 128);
/*
    
    详细结果代码       数字化结果代码        说明
    OK                  0                       呼叫成功,公对语音呼叫
    CONNECT<speed>      10,11,12,13,14,15       呼叫成功,对数据电话<speed> 采用模块协商后的值
    BUSY                7                       补叫方忙
    NO ANSWER           8                       固定连接时间到后来检测到挂起信号
    NO CARRIER          3                       呼叫建立失败或远端用户已释放
*/



除接听电话,就会返回OK,其它都没有返回值,请大家帮帮忙这是什么原因。

------解决方案--------------------
探讨
C/C++ code

打开串口
BOOL CComm::OpenComm(const char* pPort,
int nBaudRate/* = 115200*/,
int nParity/* = NOPARITY*/,
int nByteSize/* = 8*/,
……

------解决方案--------------------
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: