2015-10-27 28 views
3

我開發了一個應用程序來從C#中的SerialPort讀取數據。它的工作正常。但是從SerialPort讀取的數據與我預期的不同。如何在沒有任何編碼的情況下從串口讀取二進制數據?

當我讀到使用XCTU或Matlab會給出類似下面的數據端口,

00 00 e2 00 40 74 95 07 02 25 14 00 8a 92 00 77 ff 

但是當我從C#應用程序讀取同樣的數據也給出了,

8C3F275A483F 

我期待C#應用程序的結果數據,如Matlab和XCTU的結果。我曾嘗試使用SerialPort編碼(ASCIIEncoding,Unicode,Latin)。但沒有任何工作。幫我。這是我的代碼,

//DataReceived event handler 
public event EventHandler<SerialDataEventArgs> NewSerialDataRecieved; 
//Serial Port Initialization 
SerialPort _serialPort = new SerialPort("COM3",9600,Parity.None,8,StopBits.One); 
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); 
_serialPort.Open(); 

//DataReceived event 
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    int dataLength = _serialPort.BytesToRead; 
    byte[] data = new byte[dataLength]; 
    int nbrDataRead = _serialPort.Read(data, 0, dataLength); 
    if (nbrDataRead == 0) 
     return; 

    if (NewSerialDataRecieved != null) 
     NewSerialDataRecieved(this, new SerialDataEventArgs(data)); 
} 

//class SerialDataEventArgs 
public class SerialDataEventArgs : EventArgs 
{ 
    public string Data; 
    public SerialDataEventArgs(string dataInByteArray) 
    { 
     Data = dataInByteArray; 
    } 

} 

//printing the read data 
string str = BitConverter.ToString(e.Data); 
txtData.AppendText(str);//txtData is a TextBox 
+0

1.您發佈了兩個數據示例:它們是兩個不同程序讀取的相同數據嗎? 2.你想讀什麼設備?設備是否有關於它發送給你的文件? – nicomp

回答

1

你的代碼是從一個字節數組,這將試圖形成從使用默認的編碼字節,不管這恰好是你的系統上的有效文本值構造一個System.String實例。

要麼你需要改變你的SerialDataEventArgs類使用byte[]代替string或字節數組轉換爲使用BitConverter.ToString(data)或類似的十六進制數字的字符串。例如:

//class SerialDataEventArgs 
public class SerialDataEventArgs : EventArgs 
{ 
    public string Data; 
    public SerialDataEventArgs(byte dataInByteArray) 
    { 
     Data = BitConverter.ToString(dataInByteArray).Replace("-", " "); 
    } 
} 

這會給你字節的十六進制值,每個字節用空格分隔。就我個人而言,我認爲這會失去一些實用性......如果要將數據寫入屏幕供用戶查看,但將其保存爲實際數據處理的字節數組,則可以更好地從字節數組中進行轉換。

+0

謝謝Corey,我試過這個,但是它給出了像8C3F275A483F這樣的數據。其實我正在用rfid讀卡器閱讀一張rfid卡片,當它用matlab閱讀時,它會給出類似於00 00 e 72 00 40 74 95 07 02 25 14 00 8a 92 00 77ff的信息,而使用我的c#應用程序讀取同一張卡片時,它會給出如8C3F275A483F的輸出。我無法理解這兩個數據之間的關係。 Matlab提供的原始數據,它需要從我的C#應用​​程序的原始數據,有沒有什麼辦法來實現這一目標? –

+0

在讀取之後,您能否確認數據緩衝區包含字節'8C 3F 27 5A 48 3F'?如果是這樣,那麼你的串口初始化代碼可能有問題。檢查數據速率和成幀位...如果讀卡器以9600波特發送8N1,並且您正在接收其他格式或數據速率以解釋不同的接收數據。 – Corey

相關問題