首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2012-02-05 
关于AT指令控制GSM短信猫的问题C/C++ code打开串口BOOL CComm::OpenComm(const char* pPort,int nBaudRate

关于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*/,
……

------解决方案--------------------


楼主先用串口调试工具测试一下,发一些常用命令。
比如AT、设置波特率、打电话、挂电话、查询新号强度等等。
看看回显都正不正确。
这一步是确定GSM模块有没有问题

如果GSM模块正常,再来调程序。你这是个PC程序
在PC通过“虚拟串口对”来测试。
比如建一对虚拟串口COM3/COM4。程序中向COM3发送AT指令,
用串口调试工具打开COM4查看接收数据,看看你发出的指令是否正确。

另外ATE1指令是开回显,ATE0是关回显

char *p = "ATD+8613800138000;\r";
这块我记得ATD后面没有+号吧。

热点排行