想给自己的西门子3618编写一个方便一点的控制程序,各位仁兄有没有现成的代码作为参考,如果通过测试就给分,只要试验成功一个命令字就可以了,多谢!我刚才用超级终端试验了一下AT控制命令字,是不是手机上这些命令字都是unicode格式的?

解决方案 »

  1.   

    如下有例子代码,
    http://www.vchelp.net/vchelp/file2002_2/CEMobile.zip但是在读取返回数据的时候不能通过,例如一开始关闭echo那个命令字,等待返回就没有等到。
      

  2.   

    搞定那个代码了,似乎是作者故意设置的一个bug,让整个代码不能用,不过修改一个小小的地方就能用了上面那个地址我贴错了,不好意思,应该是这个,这个是源代码的:
    http://www.vchelp.net/vchelp/file2002_2/CEMobile.rar
      

  3.   

    http://www.vchelp.net/vchelp/file2002_2/CEMobile.rar
      

  4.   

    我已经写了一个发送和接收短消息的代码。虽然有些编码是文本的HEX 的UNCODE编码,但是传送的命令字符串是ANSI的。
    有空可以交流
      

  5.   

    刚路过这里,学习学习,看来很高深那。
    顺便问一下,是不是WINDOWCE编程,电脑如何与手机通讯,程序怎样输入到手机中的
    请高手指点
      

  6.   

    现在串口遇到一个头疼的问题,就是因为例如短消息到来或者来电是,手机会发出AT命令字提示,所以要单开线程查询。
    但是接收到的数据往往不是一整个包,而也许是和上一个半拉叠加在一起了,主动发出的AT返回命令字也有这种问题。不知大家是如何解决的?
      

  7.   

    找找资料,我忘了在那找的了.挺容易的.我就一天搞定了.附上英文的编码和解码函数.我写的,,可能很糗..
    public string EncodeEnglish(string inputstr)
    {
    //n移动位数;len字符串长度;cur当前字符的值。
    int n=0,len=0,cur=0;
    //tempstr当前字符,临时;returnstr返回字符串
    string tempstr="",returnstr="";
    //mid1、mid2分别取当前字符和下一字符
    char[] mid1=new char[2];
    char[] mid2=new char[2]; len=inputstr.Length ; for (int i=0;i<len;i++)
    {
    if (i<len-1)
    {
    mid1=inputstr.ToCharArray(i,1); //取当前字符
    mid2=inputstr.ToCharArray(i+1,1); //取下一个字符
    cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff); //当前字符右移n位  与  下一字符左移n位
    }
    else
    {
    mid1=inputstr.ToCharArray(i,1); //如果是最后一个字符,只需取最后一个字符
    cur=(mid1[0]>>n)& 0x7f; //右移n位后补0 }
    tempstr=Convert.ToString(cur,16);
    if (tempstr.Length==1) tempstr="0" + tempstr;
    returnstr=returnstr+tempstr;
    n=(n+1)%7;
    if (n==0) i++;
    }
    return returnstr;
    } public string DecodeEnglish(string inputstr)
    {
    string returnstr="";
    string s1="",s2="",s="";
    int t1=0,t2=0,Point=0;
    int t=0,t0=0;
    int n=inputstr.Length;
    byte[] array = new byte[1];  for (int i=0;i<n;i=i+2)
    {
    s1=inputstr.Substring(i,2);
    t1=Convert.ToInt16(s1,16);
    if(Point==0)
    t=t1 & ReturnHex(Point);
    else
    {
    s2=inputstr.Substring(i-2,2);
    t2=Convert.ToInt16(s2,16);
    t=((t1 & ReturnHex(Point))<<Point) | (t2>>(8-Point));
    }
    array[0]=(byte)t;
    s=System.Text.Encoding.Default.GetString(array);
    returnstr=returnstr+s;
    if(Point%7==0&&Point!=0)
    {
    i=i-2;
    Point=0;
    }
    else
    Point=Point+1;  }
    return returnstr; }
      

  8.   

    private int ReturnHex(int Value)
    {
    switch (Value)
    {
    case 0:
    Value=0x7f;
    break;
    case 1:
    Value=0x3f;
    break;
    case 2:
    Value=0x1f;
    break;
    case 3:
    Value=0x0f;
    break;
    case 4:
    Value=0x07;
    break;
    case 5:
    Value=0x03;
    break;
    case 6:
    Value=0x01;
    break;
    case 7:
    Value=0x00;
    break;
    }
    return Value;
    }
      

  9.   

    TO:qiaochang(joe) 不会吧!
    “超级终端”,是一个软件,一个微软在操作系统NT时代就有的一个附件。
    当然现在的WIN2000中还在。
    “开始”->程序->附件->通信
      

  10.   

    请教大虾:“CTRL+Z”在VC中如何表示,就是PDU数据的结尾字符,谢谢。
      

  11.   

    这里讨论的好热闹啊,串口收发短消息,可参考以下文章,有源码:
    http://www.csdn.net/develop/read_article.asp?id=17465
    http://www.csdn.net/develop/read_article.asp?id=17574
      

  12.   

    谢谢大家参与讨论,这几天忙于其它事情,一直没有来这里,抱歉我那个问题就是由于手机在来电或者来短消息的时候会向串口发送数据,例如西门子3618。也就是程序必须监视是否有消息过来。有两种方法:
    1。消息方式
    2。线程读取方式,要用overlapped方式,以实现双工这两个方法都需要构造一个FIFO,并识别出一个完整的命令字。我今天晚上试试调试一个,到时把代码贴出来一起分析
      

  13.   

    我认为FIFO方式太麻烦,你还要自己不断去识别出一个完整的命令;不如用“超时”控制好,利用两次命令的间隔大于连续字符间隔,一次性读取一个完整的命令。