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; }
这个没有问题,但是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; }