一個困擾兩天的問題:
需要通過串口向設備發送的數據: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; }
要發送的數據“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方法轉換成字節發送。
我考,終於搞定了!!!