导航

<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

随笔分类

随笔档案

文章档案

相册

就这个破程序居然浪费了我4个小时来调试! 奉献出来免得大家再走弯路。
SendMMS()
{
    HANDLE hCom 
= CreateFile( _T("COM1"),
        GENERIC_READ 
| GENERIC_WRITE,
        
0, NULL, OPEN_EXISTING, 0, NULL );
    
if( NULL == hCom )    return false;

    DCB dcb;
    ::GetCommState( hCom, 
&dcb );
    dcb.BaudRate 
= 9600;
    dcb.ByteSize 
= 8;
    dcb.Parity 
= NOPARITY;
    dcb.StopBits 
= ONESTOPBIT;

    
if!::SetCommState( hCom, &dcb ) )        return false;
    
if!::PurgeComm( hCom, PURGE_RXCLEAR ) )    return false;
    
    DWORD dw;
    ::WriteFile( hCom, 
"AT\r"3&dw, NULL );
    
// 读串口,判断是否正常
                    
// 切换到中文短信方式
    ::WriteFile( hCom, "AT+WSCL=6,4\r"12&dw, NULL );
    
// 读串口,判断是否正常

    ::WriteFile( hCom, 
"AT+CMGF=1\r"10&dw, NULL );
    
// 读串口,判断是否正常

    WCHAR wszTxt[
500];
    ::wcscpy( wszTxt, L
"hello 你好" );

    
int len = (int)::wcslen(wszTxt);// 字符长度
    forint i=0; i<len; i++ )    // 交换高低字节
        wszTxt[i] = MAKEWORD( HIBYTE(wszTxt[i]), LOBYTE(wszTxt[i]) );

    
char szNumber[50];        // 手机号码,内容长度
    ::sprintf( szNumber, "AT+CMGS=\"13901112233\",%d\r", len*2 );
    ::WriteFile( hCom, szNumber, (DWORD)::strlen( szNumber ), 
&dw, NULL );
    ::Sleep(
500);

    ::WriteFile( hCom, wszTxt, len
*2&dw, NULL );
    ::WriteFile( hCom, 
"\x00\x1a\r", 3, &dw, NULL ); // 结束符
        // 读串口,判断是否正常
       ::CloseHandle( hCom );
       return true;
}
posted on 2006-11-11 03:13 杨老师的茅屋 阅读(2290) 评论(8)  编辑 收藏
评论
  • # re: CDMA发送短信
    快乐小胖鸟
    Posted @ 2006-11-11 10:56
    收藏,CDMA的短信格式如此简单?
  • # re: CDMA发送短信
    zuilang
    Posted @ 2006-11-11 13:09
    杨老师,这个应该不会有什么弯路的啊?你碰到什么弯路了?
  • # 弯路是
    杨老师
    Posted @ 2006-11-11 14:02
    1) 每条AT指令结束后面是回车,而不是回车换行,尤其是发送手机号码那条,必须只能是回车,不然它会把多余的换行当作短信内容,导致发送了乱码。
    2) 短信的长度统计是字节,不是字符。
    3) 短信内容结束必须是Ctrl+Z结束符的UNICODE形式,外再加一个回车。
    4) 短信内容的UNICODE编码和intel CPU 相反。
    5) 由于发送中文,所以不能在超级终端上跟踪,只能用程序试验。

    以上这些可能的错误交织在一起,能在4小时内找到正确的处理方式,我算运气好的了:)
  • # re: CDMA发送短信
    teky
    Posted @ 2006-11-13 14:12

    哈,windows mobile 5 发短信好容易:

     SmsMessage message = new SmsMessage(
         TelephoneNumber, "R U Going to the Keynote?");
     SmsMessage message.RequestDeliveryReport = true;
     
    // Send message 
     message.Send();
  • # re: CDMA发送短信
    teky
    Posted @ 2006-11-13 15:08
    sorry,纠正下,上面多了个SmsMessage ,微软msdn上都写错了:)
  • # re: CDMA发送短信
    james
    Posted @ 2007-02-06 11:18
    杨老师,这个网上很多的啊,写程序要先找资料啊
  • # 杨老师:请教一下从EXE向DLL传递HWND的时候出这个错误咋解决?
    非IT
    Posted @ 2007-02-24 13:37
    error C2664: 'show' : cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'

    DLL中
    [helpstring("method show")] HRESULT show([in]HWND hWnd,[in]POINT point,[in]BSTR bstr);
    EXE中
    HWND hWnd = this->GetSafeHwnd();
    spFun->show(hWnd,point,bstr);
  • # 杨老师:请教一下从EXE向DLL传递HWND的时候出这个错误咋解决?
    非IT
    Posted @ 2007-02-24 13:37
    error C2664: 'show' : cannot convert parameter 1 from 'struct HWND__ *' to 'struct _RemotableHandle *'

    DLL中
    [helpstring("method show")] HRESULT show([in]HWND hWnd,[in]POINT point,[in]BSTR bstr);
    EXE中
    HWND hWnd = this->GetSafeHwnd();
    spFun->show(hWnd,point,bstr);
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]

统计