1、我从串口设备获取到一个十六进制数据(接收的是字符串,直接看的话是乱码);
2、我的处理程序:
        
        /// <summary>
        /// 数据接收转换为十六进制字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string StringToHex(string str)
        {
            byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
            string TempStr = "";
            foreach (byte b in ByteFoo)
            {
                TempStr += b.ToString("X2"); //X表示十六进制显示
            }
            return TempStr;
        }3、前后四个怎么变都会转换正确的,就主要中间那部分,每个字节的高位超过7就会被转为 3F
转换正确
     传输的数据:  AA55 0E06 100711182230FFFF(发送数据)
     转出来的数据:AA55 0E06 100711182230FFFF(接收调用StringToHex方法,转换结果)转换错误
     传输的数据:  AA55 E006 100711182230FFFF
     转出来的数据:AA55 3F   100711182230FFFF4、中间的0E06转不会出错,而E006就成了3F; 如果是1E06、2E06...7E06不会出错,但8E06就会被转成3F
5、中间10 07 11 18 22 30这串转化也同(4)的错误,只有AA 55和FF FF前后两个字节不会出错在此跪求高手指点一二,小弟实在没搞懂怎么的。分不够加哈

解决方案 »

  1.   

    //serialPort2是串口控件,不明白为什么参数不以流的形式,而以字符的形式
    byte[] ByteFoo = Convert.FromBase64String(serialPort2.ReadLine());
    string TempStr = "";
    foreach (byte b in ByteFoo)
    {
         TempStr += b.ToString(b); //X表示十六进制显示
    }
      

  2.   

    因为不知道你的str参数做过什么处理,//姑且一试
    byte[] ByteFoo = Convert.FromBase64String(str);
      

  3.   

    串口问题虽然简单,但问题复杂,出错可能的环节多。
    1.你确定信源(下位机或另一个程序)发来的数据是正确的
    2.你要确定硬件是否正常,使用串口调试助手(sscomm32.exe)查看,是否串口收到的数据本来就有错误。
    3.检查你程序如何缓存数据的,看是否会丢失,覆盖,或是错位。
    4.如果数据没有错误,考虑有没有哪里并发操作在你读一半时候吧缓存改写了。你可以考虑参考我博客中的范例,你直接下载可以试试,如果我的范例程序没错,你可以对照检查一下你的程序。希望能给你有些启发。
    C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。 
    C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? 
    C# 串口操作系列(3) -- 协议篇,二进制协议数据解析 
      

  4.   

    串口通讯用多了,但像楼主这种问题却很少见!
    个人认为问题不在串口!其实串口只只是负责帮你把流传出去,如果要确保流的正确性那么需要有一个类似TCP的报文传输控制协议。
    如果没有可能会出这样的问题:
    发送方把一串文字发出去,比如长度为500字节,
    而接收方可能先收到250字节,那么这时反转成字符串时可能不能成功,因为汉字是占两个字节,也有可能某个字的高字节到了,而低字节没到。所以有报文控制协议的话就可以保正数据的完敕性。
    题外话了。如果,楼主只是做测试,那么你
    System.Text.Encoding.Default.GetBytes(str);来发送
    就得用
     System.Text.Encoding.Default.GetString(Buf, 0, n);来解析。
      

  5.   

    再者,你用string来存十六进制数据也不安全,国为"00"会截断字符串。
    还是建议试试5楼“Base64”的方法。
      

  6.   

    //字符串转16进制字节数组
            private static byte[] strToHexByte(string hexString)   
            {   
                hexString = hexString.Replace(" ", "");   
                if ((hexString.Length % 2) != 0)   
                    hexString += " ";   
                byte[] returnBytes = new byte[hexString.Length / 2];   
                for (int i = 0; i < returnBytes.Length; i++)   
                    returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);   
                return returnBytes;   
            }
      

  7.   

    bytes->stringpublic static string BytesToString(byte[] data)
    {
        string s = "";
        data.ToList().ForEach(b => s += b.ToString("X02") + " ");
        return s;
    }
      

  8.   

    对于7楼的我好好研究下你的code,看是否给我一些启示,谢谢哈
      

  9.   

    对于12楼,接收到数据然后
    byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
    这个的时候字节数:
    AA55 0E06 100711182230FFFF  就是正确的12个字节
    AA55 E006 100711182230FFFF  就只有11个字节了
      

  10.   

    给个建议:
    1:先别转成十六进制,也别传String,直接转流,比如:ByteFoo = new {oxAA,ox55.....

    2:再看接收的会不会少?
    3:如果少了,可能是串口有问题、或是设置有误,如:波特率、校验等设置有误。
      

  11.   

    首先,我需要明确一下,到底你接收的是原始数据是什么?
    1、我从串口设备获取到一个十六进制数据(接收的是字符串,直接看的话是乱码);
    你都已经接收到十六进制数据,还需要转换吗?为什么直接看的话是乱码?
    一般,串口传输的应该是byte[]吧,你的string从哪里来的?
      

  12.   

    对于17楼,我收到的就是string类型的,但是值是这样的“猆? "0”
    我需要的是十六进制字符串
      

  13.   


    直接读字节数组就可以了。我博客中不是有完整例子么?
    //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
    int n = comm.BytesToRead;
    //声明一个临时数组存储当前来的串口数据   
    byte[] buf = new byte[n];      
    //读取缓冲数据
    comm.Read(buf, 0, n);   //依次的拼接出16进制字符串   
    foreach (byte b in buf)   
    {   
        builder.Append(b.ToString("X2") + " ");   
    }