<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                【126.1 同步通信與異步通信。】 既然芯片之間通信離不開“數據”和“時鐘”這兩種信號,那么是不是說,通信必須至少兩根線(雙線)以上?不是。單線也可以通信,繼續拿甲乙兩人的肢體通信做比喻,這一次只允許用一只“手”不許用“腳”,“手”繼續做數據信號,那么時鐘信號在哪?時鐘信號在甲乙兩人各自的“心跳”。用兩個人的“心跳”作為時鐘信號就有兩個時鐘節拍,初學者可能在這里會有疑惑,這兩人的“心跳”頻率可能不一致,時鐘節拍可能不同步,怎么能進行通信呢?說到這里,恰好通訊界有兩個專業的概念,一個是“同步通信”另一個是“異步通信”。像上一節講那種用腳的動作“踢一腳”作為時鐘信號,這個時鐘信號只有一個,對于通訊的甲乙雙方是實時“同步的”時鐘信號,因此這種通信叫做“同步通信”。而本節提到的用兩個人各自的“心跳”做時鐘信號,有兩個時鐘源,時鐘信號是“不同步的”,這種通信叫做“異步通信”。 【126.2 異步通信的原理。】 既然兩人各自的“心跳”不同步(異步),而且“心跳”是從甲乙兩人出生開始就一直持續存在不停跳動的,那么發送一個字節的數據是從什么時候開始到什么時候結束就必須事先有一個約定。他們是這樣約定的: (1) 平時的待命狀態。甲是發送方,乙是接收方,平時待命沒有發送數據的時候,甲手的狀態一直是“松開”的(電平1)。 (2) 1個開始位與8個數據位。當甲要發送數據給乙的時候,第1個心跳甲先“握緊”(電平0)代表“開始位”,“開始位”用來通知乙方請做好接收數據的準備,然后第2個到第9個心跳甲依次靠手的狀態發送8個位的字節數據(數據位),乙方因為“甲的開始位”的存在已經做好了接收第2個心跳數據的準備,因此乙方能完全接收第2個心跳至第9個心跳的數據位的數據。 (3) 1個停止位。甲發送了第9個心跳的數據后,必須馬上恢復到待命的狀態“松開”(電平1),以便為下一次發送數據時能正確發送“開始位”,但是這個待命的狀態“松開”至少應該持續多長的時間呢?至少持續1個“心跳”的時間以上。這樣,雖然兩個人的“心跳”不同步并且頻率也不一樣,但是只要8個“心跳”的累加誤差不超過1個“心跳”的停止位時間,數據就肯定不會錯位。這個至少持續1個“心跳”的待命狀態就起到消除累加誤差的作用。 【126.3 異步的肢體通信的例子。】 “手”可以產生“兩種”狀態“握緊”和“松開”,甲發送數據給乙,乙每“心跳”一次就去判斷一次手的狀態,“握緊”代表二進制的0,“松開”代表二進制的1,這樣,如果他們之間想傳輸一個字節的十六進制數據0x59,只需把十六進制的數據0x59展開成二進制01011001,從右到左(從低位到高位)以“位”為單位挨個發送,過程如下: 平時手的狀態一直處于“松開”的待命狀態,直到手第一次出現“握緊”的狀態...... 第一次“心跳”:手的狀態是“握緊”,開始位,通知乙作好接收即將過來的8個“心跳”數據位。 第二次“心跳”:手的狀態是“松開”,數據位bit0,記錄1。 第三次“心跳”:手的狀態是“握緊”,數據位bit1,記錄0。 第四次“心跳”:手的狀態是“握緊”,數據位bit2,記錄0。 第五次“心跳”:手的狀態是“松開”,數據位bit3,記錄1。 第六次“心跳”:手的狀態是“松開”,數據位bit4,記錄1。 第七次“心跳”:手的狀態是“握緊”,數據位bit5,記錄0。 第八次“心跳”:手的狀態是“松開”,數據位bit6,記錄1。 第九次“心跳”:手的狀態是“握緊”,數據位bit7,記錄0。 第十次“心跳”:手的狀態是“松開”,停止位,至少持續1個“心跳”的待命狀態。 現在把上述的“單線”(異步)的肢體通信過程翻譯成C語言代碼,甲發送數據的代碼如下: sbit Hand\_DATA=P2^6; //手的數據線 void SendByte(unsiged char u8Data) //甲發送數據的發送函數 { static unsigned char i; Hand\_DATA=0; //開始位。0代表“握緊” Delay(); //甲的心跳間隔時間 for(i=0;i<8;i++) //發送8個數據位 { if(0==(u8Data&0x01)) //根據數據的每一位狀態,發送對應的位數據。 { Hand\_DATA=0; //0代表“握緊” } else { Hand\_DATA=1; //1代表“松開” } Delay(); //甲的心跳間隔時間 u8Data=u8Data>>1; //右移一位,為即將發送下一位做準備 } Hand\_DATA=1; //停止位。1代表“松開” Delay(); //甲的心跳間隔時間 }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看