2016-09-21 142 views
0

我有一個程序,我有數據通過串口進入,我將這個數據轉換成字節數組,然後詢問每個字節。但是,例如有6個字節(字節[0]到字節[5]),這些都意味着各種各樣的東西。但由於某種原因,最後一個字節(字節[5])在程序中總是返回一個0x63,即使通過端口輸入的數據也會有所不同。我已經檢查了與範圍進來的數據以確認問題。下面是代碼的相關部分:SerialPort字節數組始終在字節[5]上返回0x63?

 SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One); 
     rxString = mySerialPort.ReadExisting(); 
     byte[] bytes = Encoding.ASCII.GetBytes(rxString); 
     textbox1.Clear(); 

     if (bytes[0] == 0x12)       //Header 
     { 
      if (bytes[1] == 0xA6)      //Header 
      { 
       if (bytes[2] == address)    //Address 
       { 
        byte A = bytes[3]; 
        byte B = bytes[4]; 
        var checksum = ((address + A + B)^0xFF) & 0xFF; 

        if (checksum == bytes[5]) 
        { 
         textbox1.AppendText("Connected OK!!!"); 
        } 
        else 
        { 
         textbox1.AppendText("Byte 5 = " + bytes[5]); 
        } 

       } 
      } 
      } 

而且我發現,如果我在文本框中顯示我的計算校驗和它是一樣的示波器上的校驗和是什麼(以字節[5])。所以它必須在代碼的某個地方,字節[5]變爲0x63。

謝謝,您的幫助表示讚賞...

+0

您的代碼似乎並不完整 - 例如,您不會顯示您定義了「 mySerialPort',而你打開'port'並從不使用它。你也錯過了一些右括號。如果您顯示完整的代碼打印輸出,通常幫助您更容易。 – Guss

+0

對不起,我拿出了一些我覺得不相干的東西...... – Graham

+1

63是一個神奇的數字,與0x63不同,它是'?'的ASCII碼。當必須將字節值> = 0x80轉換時,由ASCIIEncoding類生成。它是SerialPort.Encoding屬性的默認值。切勿使用ReadExisting()讀取二進制數據,而應使用Read()方法。不要忽略它的返回值。 –

回答

1

很可能是什麼問題@Hans帕桑特簡稱 - 如果你想讀的二進制數據(即不關心它們是如何編碼的文本的字節字符串),則不應使用SerialPortString讀取方法。

您應該使用Read(Byte[], Int32, Int32)將您的字節直接放入字節數組中。代碼可能是這樣的:

SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One); 
byte[] bytes = new byte[10]; 
int read = mySerialport.Read(bytes, 0, 10); 

它通常是一個好主意,分配比你期望得到什麼稍大的數組,然後參考read值,以瞭解有多少實際的數組中的字節包含真實的數據。另一方面,如果你知道你的串口設備總是生成固定大小的數據包(例如對於你的情況可能是5),那麼你可以分配一個你需要的大小的字節數組,並確保它您每次都閱讀完整數據包 - 如果您沒有收到完整數據包,可能會重複讀取:

int read = 0; 
while (read < packet_size) { 
    read += mySerialport.Read(bytes, read, bytes.Length); 
} 
+0

嘿Guss,謝謝。我設法使用Read()來使它工作。似乎進展順利,謝謝... – Graham

+0

@格拉漢姆,如果答案適合你,請批准它。謝謝 :-) – Guss

相關問題