我在做串口通信程序,在使用16进制收发时,我使用的方法是:把所有待发送字符先转换成BCD码,再将连续的两个单字符组合,保存到UCHAR型数组中,再使用WiteFile发送。当输入的一字节字符为“00”时,转换结果为空字符,其后的字符得不到处理,当然也不会被发送出去,其他所有的16进制字符转换均没有问题,可以正常收发,请问怎么处理这个ASCII为0的字符才能得到正确的结果?

解决方案 »

  1.   

    你的空字符是啥意思,NULL的ASCII码就是O
      

  2.   

    ASCII 十六进制
     0      30
     1      31
      

  3.   

    从你提问来看已正常发送和接收,UCHAR 数组已保存有含0字符,如果显示会被截断。检查ReadFile 返回值即可(例 lstrlen 肯定小于返回值)。
      

  4.   

    dwr 
    发送时dwl不能用 lstrlen(因为有0)  要用实际的发送字节大小。 
    WriteFile(,,dwl,&dwr,0);
    接收时检查dwr值 ReadFile(, ,,&dwr,0);
      

  5.   

    不懂,能不能说的再明白些,谢谢了。
    在字符到16进制数据转换时,遇到0,其后的字符的处理结果根本没有保存下来(我在调试过程中已证实),所以,不管发送之前使用不使用lstrlen数据都不会发送出去。我是这样认为的,对吗?
      

  6.   

    发送时dwl不能用 lstrlen(因为有0) 要用实际的发送字节大小。
    ----------------------------------------------------------------
    char pc[8]={'a','b','\0','c','\0','d','e','\0'};
    WriteFile(hf,pc,8,dwr,0);
    dwr = 8;
    WriteFile(hf,pc,strlen(pc),dwr,0);
    dwr = 2;
    这样试试就知道为什么了。如果发送8个,dwr = 8表示成功
    接收时
    ReadFile(hf,pc,8,dwr,0);
    如果dwr = 8,pc必然是pc[8]={'a','b','\0','c','\0','d','e','\0'};
    如果你msg 当然只显示"ab"了。
    你可以保存到文件就知道了,这么简单的问题,如你所说,发送int 10 接收都会出错,因为int 10有4位前3位都是0。
      

  7.   

    解决了,谢谢大家,尤其是3jaja