查看: 8694|回復: 30
打印 上一主題 下一主題

[未解決] Arduino串口接收16進制,如何轉換成10進制?

[復制鏈接]
  • TA的每日心情
    郁悶
    2018-6-2 08:43
  • 簽到天數: 15 天

    [LV.4]偶爾看看III

    跳轉到指定樓層
    樓主
    發表于 2018-5-30 17:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
    本帖最后由 kmaxzm 于 2018-5-30 17:37 編輯

    一個甲醛傳感器串口接收一串16進制數據,例如 FF,17,04,00,01,1a,07,D0,0E,其中01,1a為高位和低位的2個數據,為16進制,公式為 ((hi*256)+low)/1000;。
    在樹莓派上用java很容易實現:  //hcho格式:FF,17,04,00,01,1a,07,D0,0E
    String asd[] = hcho.split(",");
    hi = Integer.parseInt(asd[4],16);low = Integer.parseInt(asd[5],16);
    rzt = ((hi*256)+low)/1000;
    fin = String.format("%.3f",rzt);  


    fin即最終結果。

    這段代碼請問如何在Arduino上實現?謝謝!




  • TA的每日心情
    無聊
    2019-10-22 10:37
  • 簽到天數: 29 天

    [LV.4]偶爾看看III

    推薦
    發表于 2018-7-24 16:17 | 只看該作者
    本帖最后由 fairsky888 于 2018-7-24 16:33 編輯
    t1k2 發表于 2018-7-24 14:22
    非常感謝。但有兩個問題請教:1,我要求是時時同步的,所以,這一句是否改為:(comdata.length()>0){
    int ...

    當然是Arduino啦!!我不知道你用的什么氣體傳感器,我用過測甲醛,一氧化碳,臭氧的傳感器,他們有兩種模式,一種是問答式和主動上傳式。應該默認是主動上傳方式。一秒鐘上傳一次。ARDUINO只要接收信號, 然后分解出來就可以了,當然是時時同步的!!!。當然你可以為了是數據準確,你也可以做校驗。我之前做的一個測臭氧的。

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(12, 13); // RX, TX
    String comdata="";
    unsigned char DEC1,DEC2;float o3Val;
    int CheckSum;
    byte Command[]={0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47};//主動上傳
    byte Command1[]={0xFF,0x01,0x78,0x41,0x00,0x00,0x00,0x00,0x46};//問答上傳
    byte Command2[]={0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//問答讀取
    void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    delay(1000);
    mySerial.write(Command,9);
    }
    void loop() {
     while(mySerial.available()>0){
        comdata+=char(mySerial.read());
         delay(2);
      } 
     if(comdata.length()>0){
      CheckSum=0x00;
      for(int x=0;x<comdata.length();x++){
      if(x<8)CheckSum+=comdata[x];   //計算校驗和
      myPtHex(comdata[x]);  //16進制串口輸出。接收的是什么代碼。
      }   
      CheckSum=~(CheckSum&&0xFF);  //取反
      if(comdata[8]==CheckSum){
       DEC1=comdata[4];
       DEC2=comdata[5];
       int o3val=DEC1*256+DEC2;
       o3Val=o3val/1000.0;  
      }
      Serial.println(o3Val,3);
      comdata="";
     }   
    }
    void myPtHex(int g){ // 把 g 最右邊 byte 印成 Hex 倆位
      int a = g& 0xf0;  // 左邊 4 bits
      a = a >> 4;  // 右移 4 bits
      int b = g& 0x0f;  // 右邊 4 bits
      char c = a < 10 ? a + '0' : a + 'A' - 10;
      Serial.write(c);
      c = b < 10 ? b + '0' : b + 'A' - 10;
      Serial.write(c);
    }



  • TA的每日心情
    無聊
    2019-10-22 10:37
  • 簽到天數: 29 天

    [LV.4]偶爾看看III

    推薦
    發表于 2018-7-24 18:52 | 只看該作者
    t1k2 發表于 2018-7-24 17:04
    另外,返回的16位二氧化碳濃度值出現在第2,3位,如:FF 86 04 05 50 00 00 00 21(紅字)。 ...

    雖然沒有看到說明書,這已經很明顯了啦,第一位FF是固定的開頭,第二位86或第五位50應該是氣體類型的一個代碼,最后一位是校檢碼,算法是前8位累加再取反。和我用的傳感器差不多的,只是你的數據在2,3位。你只要把我們面的程式的數組4,5改成2,3就可以了。你如果要想WIN桌面軟件來實現我幫不了你,如果用ARDUINO我可以幫你改一下。

    kittenblock中小學創客名師推薦的圖形化編程軟件

    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(12, 13); // RX, TX
    String comdata="";
    unsigned char DEC1,DEC2;
    char CheckSum;
    float o3Val;
    //byte Command[]={0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47};//主動上傳
    //byte Command1[]={0xFF,0x01,0x78,0x41,0x00,0x00,0x00,0x00,0x46};//問答上傳
    byte Command2[]={0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//問答讀取
    void setup() {
    Serial.begin(9600);
    mySerial.begin(9600);
    //delay(1000);
    //mySerial.write(Command,9);
    }
    void loop() {
     mySerial.write(Command2,9); 
     while(mySerial.available()>0){
        comdata+=char(mySerial.read());
         delay(2);
      } 
     if(comdata.length()>0){
      CheckSum=0x00;
      for(int x=0;x<comdata.length();x++){
      if(x<8)CheckSum+=comdata[x];   //計算校驗和
     // myPtHex(comdata[x]);  //16進制串口輸出。接收的是什么代碼。
      }
      CheckSum=~(CheckSum&&0xFF);  //取反
      if(comdata[8]==CheckSum){
       DEC1=comdata[2];
       DEC2=comdata[3];
       int o3val=DEC1*256+DEC2;
       o3Val=o3val/1000.0;  
      }
      Serial.println(o3Val,3);
      comdata="";
     }
     delay(1000);   
    }
    void myPtHex(int g){ // 把 g 最右邊 byte 印成 Hex 倆位
      int a = g& 0xf0;  // 左邊 4 bits
      a = a >> 4;  // 右移 4 bits
      int b = g& 0x0f;  // 右邊 4 bits
      char c = a < 10 ? a + '0' : a + 'A' - 10;
      Serial.write(c);
      c = b < 10 ? b + '0' : b + 'A' - 10;
      Serial.write(c);
    }

    點評

    高手!留個QQ號,請教關于串口讀取的數據處理。我的QQ:263522492  發表于 2018-9-8 14:22
    非常專業!  發表于 2018-7-25 10:04
  • TA的每日心情
    難過
    2018-4-20 11:07
  • 簽到天數: 1 天

    [LV.1]初來乍到

    沙發
    發表于 2018-5-31 09:08 | 只看該作者
    給你講一下思路。
    Serial.readString(),接收到字符串。
    確定有無浮點。
    把字符串里的數字提出來,把字符串變成int型。
    把浮點加進去轉化成float。
  • TA的每日心情
    慵懶
    2018-11-12 08:58
  • 簽到天數: 37 天

    [LV.5]常住居民I

    板凳
    發表于 2018-5-31 14:13 | 只看該作者
    接收為一個數組,,比如為p={0xFF,0x17,0x04,0x00,0x01,0x1a,0x07,0xD0,0x0E}然后直接操作該字節
    float val = (p[4]*256+p[5])/1000.00;
  • TA的每日心情
    郁悶
    2018-6-2 08:43
  • 簽到天數: 15 天

    [LV.4]偶爾看看III

    地板
     樓主| 發表于 2018-5-31 17:08 | 只看該作者
    跑龍套的保 發表于 2018-5-31 14:13
    接收為一個數組,,比如為p={0xFF,0x17,0x04,0x00,0x01,0x1a,0x07,0xD0,0x0E}然后直接操作該字節
    float val ...

    感謝回復,如何操作才能將接受到的這些hex寫進一個數組呢?
  • TA的每日心情
    慵懶
    2018-11-12 08:58
  • 簽到天數: 37 天

    [LV.5]常住居民I

    5#
    發表于 2018-5-31 18:07 | 只看該作者
    kmaxzm 發表于 2018-5-31 17:08
    感謝回復,如何操作才能將接受到的這些hex寫進一個數組呢?

    http://www.ogzcha.live/forum.php?mod=viewthread&tid=46248
    第二段代碼
  • TA的每日心情
    開心
    2018-7-25 21:40
  • 簽到天數: 1 天

    [LV.1]初來乍到

    6#
    發表于 2018-7-23 17:13 | 只看該作者
    版主,我有一個非常類似的需求。也是氣體傳感器的16進制數據時時同步轉換成10進制。要求在win7以上(含)電腦屏幕顯示(彈窗方式即可,如有應用程序界面更好)。
  • TA的每日心情
    開心
    2018-7-25 21:40
  • 簽到天數: 1 天

    [LV.1]初來乍到

    7#
    發表于 2018-7-23 17:24 | 只看該作者
    FF 86 04 05 50 00 00 00 21
  • TA的每日心情
    開心
    2018-7-25 21:40
  • 簽到天數: 1 天

    [LV.1]初來乍到

    8#
    發表于 2018-7-23 17:26 | 只看該作者
    8位,16進制,需要的數據在第2,3位(即紅色字體)。
  • TA的每日心情
    開心
    2018-7-25 21:40
  • 簽到天數: 1 天

    [LV.1]初來乍到

    9#
    發表于 2018-7-23 17:28 | 只看該作者
    要求開放源代碼。先預估費用和支付條件。
  • TA的每日心情
    無聊
    2019-10-22 10:37
  • 簽到天數: 29 天

    [LV.4]偶爾看看III

    10#
    發表于 2018-7-23 18:05 | 只看該作者
    本帖最后由 fairsky888 于 2018-7-23 18:21 編輯

    嘿嘿,

    kittenblock中小學創客名師推薦的圖形化編程軟件

    String comdata="";
    void setup() {
    Serial.begin(9600);
    Serial1.begin(9600);
    }
    void loop()
    {
    
    while(Serial1.available()>0){
       comdata+=char(Serial.read());
        delay(2);
    }  
    if(comdata.length()>0){
    int data=comdata[4]*256+comdata[5];Serial.print(data);
    comdata="";
    }
    }
    
    


    僅供參考
    您需要登錄后才可以回帖 登錄 | 立即注冊  

    本版積分規則

    熱門推薦

    為拍月亮而生的便攜望遠鏡系統。
    為拍月亮而生的便攜望遠鏡
    參賽項目: 便攜望遠鏡系統 參賽組員: 1人 布丁:嵌入式軟件、上位機軟件、電路、結
    基于機器視覺的智能分揀機械臂
    基于機器視覺的智能分揀機
    本作品是一個基于機器視覺的智能機械臂操作平臺,其采用atmega32單片機作為主控制系統
    小白求助
    小白求助
    也許我這個問題也許看起來有些幼稚。。。 還在入門的路上打滾,在看《愛上Arduino》這
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    關于SpiderRobot 項目實行方案 之前有人推薦我做這個項目,于是乎就有了這個 h
    沒有合適的模塊,想到自己焊接芯片
    沒有合適的模塊,想到自己
    有些模塊沒有加工過的模塊銷售,想著自己要是能把芯片焊在一起也是一樣的。只是這個尺
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   
    快速回復 返回頂部 返回列表
    北京快乐8论坛