是这样的   我弄了一个编辑框关联一个CString变量  m_str;  这个编辑框内只需要输入数字和小数点。现在我想把这个数据加上一些十六进制的数据通过MSCOMM  以十六进制的格式发送出去。小弟在网络上试了很多方法都不能达到效果   特来此求助下。谢谢各位

解决方案 »

  1.   

    5555555555~~~~    没人理我吗?我把我程序贴出来   大家看下
    UpdateData();
    int n = 0;
    if (m_com.GetPortOpen())
    {
    CString outdata = "",temp;
    char indata[10];
    unsigned char protocoldata[36];
    strcpy(indata,(LPCTSTR)m_firststr);
    protocoldata[0] = 0x0a;
    protocoldata[1] = 0x7b;
    protocoldata[2] = 0x00;
    //protocoldata[3]
    protocoldata[4] = 0x24;
    protocoldata[5] = 0x00;
    protocoldata[6] = 0x00;
    protocoldata[7] = 0x00;
    protocoldata[8] = 0x20;
    protocoldata[9] = 0x00;
    protocoldata[10] = 0x10;
    protocoldata[11] = (unsigned char)m_check;
    for (n = 0; n <= 10; n++)
    {
    protocoldata[n+12] = indata[n];
    }
    protocoldata[22] = 0x00;
    protocoldata[23] = 0xff;
    protocoldata[24] = ((unsigned char)m_flicker << 6) | 0x3f;
    protocoldata[25] = ((unsigned char)m_function + 1);
    protocoldata[26] = (unsigned char)m_key;
    protocoldata[27] = 0x00;
    protocoldata[28] = 0x00;
    protocoldata[29] = 0x00;
    protocoldata[30] = 0x00;
    protocoldata[31] = (unsigned char)m_buzzer;
    protocoldata[32] = (unsigned char)GetCheck(protocoldata);
    protocoldata[33] = (unsigned char)(GetCheck(protocoldata) >> 8);
    protocoldata[34] = 0x7d;
    protocoldata[35] = 0x0b;
      
    for(n = 0; n <= 35; n++)   
    {   
    temp.Format("%x",protocoldata[n]);   
    outdata += temp;   
    }
    m_com.SetOutput(COleVariant(outdata));
    }
    else
    {
    MessageBox("请先打开相应的串口设备!");
    }他最后输出是
    61 37 62 30 63 63 32 34 30 30 30 32 30 30 31 30 31 33 31 33 32 33 33 33 34 33 35 33 36 33 37 33 38 30 63 63 30 66 66 37 66 32 30 30 30 30 30 30 37 35 30 37 64 62
     感觉这个数据拆分掉了一样  又有点不象    !!哪位大侠能给点意见?
      

  2.   

      
    temp.Format("%x",protocoldata[n]);   temp是CString类型,你这样格式化就是,把0X56,给格式化成了56,这样就变成了两个字符了你还是直接发送char 类型的数组,for(n = 0; n <= 35; n++)   
    {  m_com.SetOutput(COleVariant(protocoldata[n]));
    }
      

  3.   

    串口发送直接用char好了,用CString可能会有点问题。
    另外
    for(n = 0; n <= 35; n++)   
    {   
    temp.Format("%x",protocoldata[n]);   
    outdata += temp;   
    }这句话的意思是想实现什么??
      

  4.   

    1、你可以以空格或特定的字符做为间隔,如输入“0x11 0x12 0x13 0x14”
    2、拆分字符串为如此格式:"0x11" "0x12" 等
    3、将拆分出的字符串转换为unsigned char型,可以使用atoi或strtol//16进制格式的字符串,转换使用如0x1E
    unsigned char GHexStr2Int(const CHAR* pStr)
    {
    if(pStr == NULL )
    {
    return 0 ;
    }
    if(GDataIsHex(pStr) == FALSE )
    {
    return  0 ;
    } return (unsigned char)strtol(pStr ,NULL ,16) ;
    }
      

  5.   

    回复:shen_wei
    你那样的话好像是只能发送一个CHAR吧   那我如果想发送一个数组只能用FOR循环了吗?
    回复:xianglitian
    就象shen_wei所说的   0X56变成了5,6.
    回复:ccpaishi
    这句话的意思就是把一串数据CHAR的数据串成CString的字符串
      

  6.   

    还是有问题
    我按照shen_wei说的去改成这样的话  
    for(n = 0; n <= 35; n++)   
    {   
    m_com.SetOutput(COleVariant(protocoldata[n]));
    }
    编译是没有问题   不过运行的时候提示  INVALID PROPERTY value这个是无效的属性值的意思吧!我protocoldata的类型是UNSIGNED CHAR
      

  7.   

    知道楼主出错的原因了.
    你说的数据拆分了,原因是你用了unsigned char 来处理,而非 char 来处理protocoldata[0] = 0x0a;
    protocoldata[1] = 0x7b;这样写,内存里不是 0x0a,0x7b 而是 0x0a,0x00,0x7b,0x00,因为一个protocoldata 占2字节unsigned char protocoldata[36];这个改为 char 试一下吧.
      

  8.   

    之前说错了,那个设成 unsigned char 没问题的.
    然后楼主这个程序的结果,也是对的.
    for(n = 0; n <= 35; n++)   
    {   
    temp.Format("%x",protocoldata[n]);   
    outdata += temp;   
    }
    这个地方,把protocoldata的数挤在一起放.
    看一下前面7个数
    protocoldata[0] = 0x0a;
    protocoldata[1] = 0x7b;
    protocoldata[2] = 0x00;
    //protocoldata[3]
    protocoldata[4] = 0x24;
    protocoldata[5] = 0x00;
    protocoldata[6] = 0x00;
    0x000a,0x007b,0x0000,0x00cc(第三个没赋值),0x0024,0x0000,0x0000
    这些数在执行
    temp.Format("%x",protocoldata[n]);   
    outdata += temp;
    的时候,挤在了一起,变成了
    第n 字节的 0 1 1 2 3 3 4 4 5 6  
    挤在一起后 a 7 b 0 c c 2 4 0 0 
    然后输出 61,37,62,00,63,63,32,34,00,00
    全部都对应得上.
      

  9.   


    用unsigned char来处理会是   0x0a,0x00?  不会吧  应该是我用CString.Format的原因我现在是这样的   我有一串unsigned char的字符数组protocoldata[36],里面还有一些是0x00的数据。
    我想通过MSCOMM控件发送出去   如果是0x12,发送出去就是0x12。我后来改了一下
    用char来发送确实是可以  不过他一碰到0x00就停下来了   就认为字符串已经结束了。就不发送了   郁闷……
      

  10.   


    你那个事对应的上   可惜不是他把里面的字符都转化成ASCII码来发送了
      

  11.   

    原来你的意思是,内存为 0x12 ,发的就是 0x12,而不是说 内存为 0x12 就发 0x31 3x32.那你就不用Format来转,直接发.遇到 0x00 就停,不知道你现在处理发送的代码是怎样的?
    MSCOMM 发的时候,先选BIN模式试试,不要选TEXT模式有0x00的东西,不要用字符串的函数来处理,因为他们遇到0x00就会不再管后面的东西了.
      

  12.   

    恩    没办法啦    我现在只能是用CSerialPort类来处理了    要不就发不出来了!!谢谢楼上诸位的支持
      

  13.   

    15楼,我用过MSCOMM与龚建伟的CSerialPort,都一样可以发 0x00 这些 16进制的.
    如果你的MSCOMM不行,要看看设置的地方了.
      

  14.   


    你的MSCOMM是怎么转化数据的呢??   我用Serialport类也可以   用MSCOMM就是不行!!55~~
      

  15.   


    COleVariant myVar;
    COleSafeArray safearray_inp;
    BYTE byRxBuf;
    myVar.Attach(GetInput());
    safearray_inp = myVar;
    m_byteArr.RemoveAll();
    LONG index = 0;
    //int iLen = safearray_inp.GetElemSize();
    //int iLen = safearray_inp.GetDim();
    int iLen = safearray_inp.GetOneDimSize();
    for (index=0;index<iLen;index++)
    {
    safearray_inp.GetElement(&index,&byRxBuf);
    m_byteArr.Add(byRxBuf);
    }
    这个代码,把数据取出来.用的是MSCOMM