2017-03-29 88 views
0

我想略微修改讀取串行數據的USB設備的一些示例代碼。數據顯示的當前方式非常混亂。該設備讀取30位數據。以下代碼段是我試圖操作的...C#中的數據操作 - 字符串

private string GetDataString() 
     { 
      string strTemp; 

      strTemp = ""; 

      if ((m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_RTR) == TPCANMessageType.PCAN_MESSAGE_RTR) 
       return "Remote Request"; 
      else 
       // UNCOMMENT FOR DECIMAL 
       for (int i = Form1.GetLengthFromDLC(m_Msg.DLC, (m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_FD) == 0) - 1; i >= 0; i--) 
        strTemp += string.Format("{0:000} ", m_Msg.DATA[i]); 

       //// UNCOMMENT FOR HEX 
       //for (int i = Form1.GetLengthFromDLC(m_Msg.DLC, (m_Msg.MSGTYPE & TPCANMessageType.PCAN_MESSAGE_FD) == 0) - 1; i >= 0; i--) 
       // strTemp += string.Format("{0:X2} ", m_Msg.DATA[i]); 

      return strTemp; 
     } 

返回的字符串是兩種格式之一,具體取決於我取消註釋的部分。下面是在每個格式讀出的樣品:

「000 000 123 255」(十進制)

「00 00 7B FF」(十六進制)

的問題是,有編碼信息的兩個部分這裏:最右邊的12位數據(稱爲ST)和接下來的18位(稱爲這些MT)。數據以little-endian格式顯示(LSB在右邊)。我正在嘗試修改這部分代碼以通過其相應的十進制值顯示每個部分。

所以上面的例子將被顯示爲:

「7 3071」

(MT)(ST)

關於如何執行此轉換的任何建議?如果這是一個愚蠢的問題,我很抱歉,但我對C#編程經驗不足。

+0

http://stackoverflow.com/questions/17523699/how-to-work-with-the-bits-in-a-byte可能會有所幫助 – Chris

回答

3

你必須做一些按位操作。這將是這個樣子:

uint MT, ST; 

    MT = (uint)((m_MSG.DATA[3] & 0x3F) << 12); 
    MT |= (uint)(m_MSG.DATA[2] << 4); 
    MT |= (uint)((m_MSG.DATA[1] & 0xF0) >> 4); 

    ST = (uint)((m_MSG.DATA[1] & 0x0F) << 8); 
    ST |= m_MSG.DATA[0]; 
+0

這並獲得成功。謝謝!我一直拉着我的頭髮試圖讓這個工作幾個小時。 – cjswish