none
進位轉換與高低位元合併問題,請教各位先進。 RRS feed

  • 問題

  • 最近在硬體開發部分小弟寫了一個程式下命令給儀器,並且讀出回傳值。

    回傳值格式為11個Byte,一次讀出11筆資料為10進位。

    問題在於我要將Roll MSB & LSB 兩個10進位數值合併起來,表示成16bit,數值為 -32768~+32767,第一位元表示正負號。


    Byte1

    標頭位元組,0x0E

    Byte2

    Roll MSB

    Byte3

    Roll LSB

    Byte4

    Pitch MSB

    Byte5

    Pitch LSB

    Byte6

    Yaw MSB

    Byte7

    Yaw LSB

    Byte8

    TimerTicks MSB

    Byte9

    TimerTicks LSB

    Byte10

    Checksum MSB

    Byte11

    Checksum LSB



    S(1 bit)

    MSB(7 Bit)

    LSB(8 Bit)


    問題1: 我要如何將兩個高低位元轉換成2進位?在C#當中是否有類似的函式可以呼叫?類似三角函數那種簡略的寫法?

    如果照目前的想法來寫大概要1.20行以上還不見得寫的完,因此想請教一下各為前輩。

    問題2: 轉換成2進位後,我該用字串型態儲存置陣列中?還是用整數型態儲存呢?字串跟整數在程式辨識上會不會有所不同?

    問題3: 第一個位元 0為正,1為負。這樣在程式中,我該怎麼去表示? 用Bool表示就可以了嗎??

    以下是小弟的程式碼,請多指教。

    private void button9_Click(object sender, EventArgs e)
            {
                if (serialPort1.IsOpen == true)
                {
                     int i;
                    int [] bytes = new int [20];
                  
                    serialPort1.Write(new byte[] { 0x0E }, 0, 1);
                    richTextBox1.Text = "";
                    richTextBox1.Text += "成功的送出了訊息!!" + "\n";
                    for (i = 0; i <= 10; i++)
                    {
                        bytes[i] = serialPort1.ReadByte();
                    }
                    for (i = 0; i <= 10; i++)
                    {
                        richTextBox1.Text += "陣列數值為:" + bytes[i] + "\n";
                    }
                    richTextBox1.Text += "\n";
                }
                else
                    MessageBox.Show("尚未開啟SerialPort", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
    2009年5月14日 上午 05:21

解答

  •             int intValue;
                byte bytMSB;
                byte bytLS;
                bytMSB = 127;
                bytLS = 99;
                intValue = ((int)bytMSB << 8) + (int)bytLS;
                this.textBox1.Text = System.Convert.ToString( intValue);

    MSB是高位元,LSB是低位元嗎?值會超過127嗎?您的想法如上嗎?
    • 已標示為解答 Heracles_Lo 2009年5月15日 上午 07:33
    2009年5月14日 上午 07:05

所有回覆

  •             int intValue;
                byte bytMSB;
                byte bytLS;
                bytMSB = 127;
                bytLS = 99;
                intValue = ((int)bytMSB << 8) + (int)bytLS;
                this.textBox1.Text = System.Convert.ToString( intValue);

    MSB是高位元,LSB是低位元嗎?值會超過127嗎?您的想法如上嗎?
    • 已標示為解答 Heracles_Lo 2009年5月15日 上午 07:33
    2009年5月14日 上午 07:05
  • MSB (most significant bit) 為最高有效位元;LSB (least significant bit) 為最低有效位元

    回傳值的話,是10進位回傳值,數值0~255。

    恩,這樣並沒有問題,如此將陣列中的數值儲存起來左移8個位元就行了。

    原來根本不需要先將近位轉換成2進制就可以直接左移位元了。

    此外如果要設定正負號,可以直接用判斷式MSB是否大於127,如果大於127將加上負號就行了。

    馬上來試試,謝謝前輩指導。

    int intValue;
                byte bytMSB;
                byte bytLS;
                bytMSB = bytes[i];
                bytLS = bytes[i];
                intValue = ((int)bytMSB << 8) + (int)bytLS;
                this.textBox1.Text = System.Convert.ToString( intValue);

    2009年5月14日 上午 08:17