zoukankan      html  css  js  c++  java
  • 关于Arduino串口读写HEX

    每次和硬件层进行调试的时候,就容易遇到数据格式问题。这不,继上次Matlab上的hex发送后,又遇到了Arduino上接收hex,并进行对比处理的问题。由于单片机级别的处理器只能以字节形式接收,因此无法使用缓存和字符串的形式进行读取判断。网上找来找去,终于找到一个类似的,加以修改,就成了满足我们测试需求了。以下是源码。

     

    byte variable[80];
    byte index = 0;
    /////////////////////////////////////////////////////////////
    void setup() {
      Serial.begin(9600);
      delay(1000);
      }
    /////////////////////////////////////////////////////////////
    void loop() {
      while (Serial.available() > 0) {
        byte b = Serial.read();
        variable[index++] = b;
      }
      if (index == 2) {
        Serial.print(variable[0], HEX);Serial.println(variable[1], HEX);
     
        if (variable[0] == 0x40 && variable[1] == 0x05) {
          Serial.println("Matched!!!");
        }
        else Serial.println("Not Matched!");
        index = 0;
      }
    }
     
    至于比较的内容和长度,完全可以改成数组形式,使用for循环对比!
     
    早上修改了一下,对数组的比较,可以供大家使用了。
     
    byte variable[80];
    byte index = 0;
    byte forward[] = {0xC2, 0x9A, 0x01, 0x00, 0x09, 0xDC, 0x05, 0x24, 0xFA, 0x75};
    int j = 0;
    /////////////////////////////////////////////////////////////
    void setup() {
      Serial.begin(9600);
      delay(1000);
      }
    /////////////////////////////////////////////////////////////
    void loop() {
      while (Serial.available() > 0) {
        byte b = Serial.read();
        variable[index++] = b;
      if (index == 10) {
        //Serial.print(variable[0], HEX);Serial.println(variable[1], HEX);
        //if (variable[0] == 0x40 && variable[1] == 0x05) {
        //Serial.println("Matched!!!");
        for(int i=0; i < index;  i++){
            if(variable[i] == forward[i]){
              j++;
              }
        }
        if(j == 10){
             Serial.println("Matched!!!");
             j=0;
        }
        else Serial.println("Not Matched!");
        index = 0;
        j = 0;
        }
      }
    }
     
    再更新一版,可以随意字节长度,只要包含对的数组,就能识别,不再因为之前输入的数组长度干扰后面正确的数组识别。其实就是将数组左移,保证数组第一个能匹配,然后再进行后面的读取,这样就能将中间不对的字节逐渐剔除掉。话不多说,上源码,这次带上了LED灯的指示。
     
    #define LED 13
     
    byte variable[80];
    byte index = 0;
    byte forward[] = {0xC2, 0x9A, 0x01, 0x00, 0x09, 0xDC, 0x05, 0x24, 0xFA, 0x75};
    int j = 0;
    /////////////////////////////////////////////////////////////
    void setup() {
      pinMode(LED, OUTPUT);
      Serial.begin(9600);
      delay(1000);
      }
    /////////////////////////////////////////////////////////////
    void loop() {
      while (Serial.available() > 0) {
        byte b = Serial.read();
        variable[index++] = b;
    xunhuan:
        if((variable[0] != forward[0]) && index >= 1 ){
              for(int i=0; i < index;  i++)
              {
                variable[i] = variable[i+1];
                }
                index--;
                goto xunhuan;
              }
      if (index >= 10) {
        //Serial.print(variable[0], HEX);Serial.println(variable[1], HEX);
        //if (variable[0] == 0x40 && variable[1] == 0x05) {
        //Serial.println("Matched!!!");
        for(int i=0; i<10; i++){
            if(variable[i] == forward[i]){
              j++;
              }
        }
        if(j == 10){
             Serial.println("F+000000025+000000025A");
             j=0;
             digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
             delay(1000);                       // wait for a second
             digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
             delay(1000);                       // wait for a second
        }
        else Serial.println("F00000000000000000000A");
        index = 0;
        j = 0;
        }
      }
    }
  • 相关阅读:
    Excel导入导出DataGridView
    博客开通第一天
    windows10 VM12 安装Mac OS X 10.11
    js判断IE浏览器及版本
    C# MD5 加密
    WindowsErrorCode
    localStorage,sessionStorage的使用
    js实现页面锚点定位动画滚动
    纯js实现页面返回顶部的动画
    HTML table固定表头
  • 原文地址:https://www.cnblogs.com/qiuya/p/10790604.html
Copyright © 2011-2022 走看看