2017-09-23 78 views
0

我正在寫一個C#應用程序,它將從3個不同的COM端口接收串行數據,配置8位UART,無奇偶校驗。其他設備將發送和接收二進制編碼的HEX ex。 AF01h = 10101010 00000001每個字節兩個字符。我設置了虛擬COM端口和一個用於測試目的的簡單應用程序,並且在我連接設備之前來回發送數據。我發現數據在發送和接收時默認爲ASCII編碼,但我需要二進制編碼HEX。我沒有在編碼類中看到該選項,並且不希望該應用程序使用與其他3個設備完全不同的編碼。現在,我使用這個代碼將字符串轉換時,它被送到null或十六進制串行端口編碼

string binarystring = String.Join(String.Empty, hexstring.Select(c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); 
sport.Write(binarystring); 
txtReceive.AppendText("[" + dtn + "] " + "Sent: " + binarystring + "\n"); 

這適用於測試傳輸現在,但我最終將改變代碼直接放置兩位數的十六進制數字轉換爲字節數組。

此代碼將允許我輸入AF01h = 1010101000000001,但在應用程序的接收端,我獲得16個字節的ASCII編碼字符。有沒有一種方法可以將應用程序與其他設備放在同一頁面上?

+0

不要使用Write(string)過載。使用byte []來確保正確編碼二進制數據。 –

+0

在我將它們移動到Byte []之前,我不得不從文本框中對ASCII字符進行編碼?一旦我發送字節,ASCII編碼/解碼是否仍然適用? –

回答

0

想出了一個辦法。只需要十六進制的長字符串轉換爲兩個十六進制字符字節整數

string hex = txtDatatoSend.Text; //"F1AAAF1234BA01" 
int numOfBytes = HEX.Length; 
byte[] outbuffer = new byte[numOfBytes/2]; 
for (int i = 0; i < numOfBytes; i += 2) 
{ 
outbuffer[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
} 
sport.Write(outbuffer, 0, outbuffer.Length); 
sport.DiscardOutBuffer() 

唯一需要注意的是你必須在偶數字符

在另一端的輸入數據被正確放置回到Byte []中,我可以像這樣解碼它。

byte[] inbuffer = new byte[sport.BytesToRead]; 
sport.Read(inbuffer, 0, inbuffer.Length); 
txtReceive.AppendText("[" + dtn + "] " + "Received: " + inbuffer.Length + " bytes "); 
for (int i = 0; i < inbuffer.Length; i++) 
{ 
string hexValue = inbuffer[i].ToString("X2"); 
txtReceive.AppendText(inbuffer[i] + " is " + hexValue + "HEX "); 
} 
txtReceive.AppendText("\n"); 
sport.DiscardInBuffer();