C# 发送16进制串口数据


一个困扰两天的问题:
需要通过串口向设备发送的数据:0A010 7e 08 00 11 00 00 7e 76 7f
我先将每个16进制字符转换成10进制,再将其转换成ASCII码对应的字符。

        /// <summary>
        /// 16进制数组转ASCII字符串
        /// </summary>
        /// <param name="strArrHex"></param>
        /// <returns></returns>
        public static string ConvertHexArrToString(string strHex)
        {
            StringBuilder sb = new StringBuilder();
            string[] strArrHex = strHex.Split(' ');
            foreach (string item in strArrHex)
            {
                //将十六进制转换成10进制
                int ten = Convert.ToInt32(item, 16);
                char cc = (char)ten;
                sb.Append(cc);
            }
            string s = sb.ToString();
            return s;
        }
View Code

这个没有问题,但是7e 08 00 22 00 01 01 74 f4 7f就有问题了
通过Wireshark抓包发现,只要包含a开头的十六进制数都变成了3f。
捣鼓两天查各种资料终于找到了问题的根源:合法的ASCII码只到0x7F,也就是说,大于0x7F的数你转成字符再发送的话,都会变成问号,也即0x3F。
找到问题了就好解决:不能将其转换成字符,而是把要发送的内容转换成16进制字节发送。

//在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换
        public  static  byte[] HexStringToBytes(string hs)
        {
            string[] strArr = hs.Trim().Split(' ');
            byte[] b = new byte[strArr.Length];
            //逐个字符变为16进制字节数据
            for (int i = 0; i < strArr.Length; i++)
            {
                b[i] = Convert.ToByte(strArr[i], 16);
            }
            //按照指定编码将字节数组变为字符串
            return b;
        }
字符转换成16进制字节

要发送的数据“0A010 7e 08 00 22 00 01 01 74 f4 7f”
首先将0A010转换成16进制的ASCII码即30 41 30 31 00
然后将30 41 30 31 00 7e 08 00 22 00 01 01 74 f4 7f 通过HexStringToBytes方法转换成字节发送。
我考,终于搞定了!!!

原文地址:https://www.cnblogs.com/huangzhen22/p/4742031.html