2011-08-17 118 views
1

我正在開發一個與舊系統通信的程序。我爲此使用System.IO.Ports.SerialPort。問題在於,當我發送更長的消息時,消息被損壞。我使用線路監聽器,並得到下面的結果通過串口傳輸數據時出現數據損壞

我送什麼

aa 01 00 00 12 03 06 18 02 c1 94 02 c1 94 00 00 00 00 00 00 00 00 00 00 00 00 1e fd 

我得到

c2 aa 01 00 00 12 03 06 18 02 c3 81 c2 94 02 c3 81 c2 94 00 00 00 00 00 00 00 00 00 00 00 00 1e c3 bd 

我正在使用的代碼是

_comPort.Encoding = new UTF8Encoding(); 
_comPort.PortName = PortName; //Com1 
_comPort.BaudRate = BaudRate; //9600 
_comPort.StopBits = StopBits; //1 
_comPort.DataBits = DataBits; //8 
_comPort.Parity = Parity; //None 
_comPort.Open(); 

_comPort.Write(messageStr); 

爲什麼數據損壞,我該如何解決這個問題?

+0

不要在字符串中存儲二進制數據。當你傳遞一個字節[]時,SerialPort.Write()在* ascii中不會*編碼,不需要對字節進行編碼。 –

回答

4

我的猜測是messageStr是一個字符串,你會看到編碼問題。你已經明確指定了UTF-8編碼,所以這就是你得到的 - 但我懷疑這不是你真正想要的。

你已經證明二進制數據,所以我假設你真的想送正是二進制數據 - 在這種情況下,你應該使用Write(byte[], int, int)超載。

如果你真的想寫文本數據,你可能只需要選擇正確的編碼 - 但你需要給我們更多的信息,以幫助我們做出正確的選擇。

+0

是的,它是我想發送的二進制數據。問題是Write(byte [],int,int)和Write(string)默認使用ASCIIEncoding來對字符進行編碼,然後它不能處理大於127(0x7F)的字符。我有幾個比這更大的位。這就是爲什麼我改變了Encoding。我應該使用什麼編碼? – magol

+0

@magol如果這是真的,你可能需要使用base-64(Convert.ToBase64String);但是,我希望寫(字節[],...)寫入二進制 –

+0

如寫入(字節[],int,int)手冊中所示,我需要編碼。但我會嘗試。 – magol