每次和硬件层进行调试的时候,就容易遇到数据格式问题。这不,继上次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;
    }
  }
}

关于Arduino串口读写HEX的更多相关文章

  1. Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍

    声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...

  2. 修改Arduino串口缓冲区大小(转)

    本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区       在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...

  3. win10上使用php与python实现与arduino串口通信

    注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...

  4. Arduino串口的一些高级用法

    1.配置串口通信数据位.校验位.停止位通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率.而使用Serial.begin(speed, config) ...

  5. Arduino 串口的一些高级用法

    来源: 1.配置串口通信数据位.校验位.停止位 通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 而使用Serial.begin(speed, c ...

  6. Arduino - 串口操作函数与示例代码大全

    来源:https://blog.csdn.net/iracer/article/details/50334041 Arduino - 串口操作函数与示例代码大全 本文总结了Arduino常用串口操作函 ...

  7. 如何用Java语言向串口读写数据

    原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...

  8. 关于Matlab串口发送HEX格式字符

    终于想起来更新一下关于使用Matlab串口发送HEX格式字符.这个用法主要来自于我使用Matlab对机器人进行实时轨迹跟踪的绘制,由于底层限制,自己又不想在中间增加转换模块,就需要直接发送HEX格式指 ...

  9. 第十六章 IIC协议详解+UART串口读写EEPROM

    十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...

随机推荐

  1. 怎样才能做好SNS社区网站

    顺应历史潮流,大批的网络社区SNS(Social Networking Services)发展起来. SNS旨在构建一个网络上的人际关系网,让公众足不出户即可实现社交意愿.SNS满足了人的交流欲望,成 ...

  2. 跟微软保持适当距离--Hessian + .net 实现RPC体系的企业应用

    同在一个产业链园区的XX厂因为5台Window2003服务器收到了律师函并且被迫下了12万$的采购单,虽然100万对XXX厂来数不是大数目,但是总有种被打劫的感觉. 在企业ERP应用中服务层一般都是做 ...

  3. Golang使用pkg-config自动获取头文件和链接库的方法

    为了能够重用已有的C语言库,我们在使用Golang开发项目或系统的时候难免会遇到Go和C语言混合编程,这时很多人都会选择使用cgo. 话说cgo这个东西可算得上是让人又爱又恨,好处在于它可以让你快速重 ...

  4. Plupload 上传详细讲解,Plupload 多实例上传,Plupload多个上传按钮--推荐使用

    今天帮朋友解决  Plupload  上传的问题,查了很多资料,资料还是挺全的,但是有点零零散散的,故整理好,合并发出来. 本教程包括: Plupload  上传详细讲. Plupload  多实例上 ...

  5. linux每天一小步---mkdir命令详解

    1 命令功能 mkdir命令用于创建单个目录或者多级目录,但前提在于用户对于当前目录有写权限. 2 命令语法 mkdir  [选项]  [目录名] 3 命令参数 -m 在创建目录的同时设定目录权限(而 ...

  6. 这可能是AI、机器学习和大数据领域覆盖最全的一份速查表

    https://mp.weixin.qq.com/s?__biz=MjM5ODE1NDYyMA==&mid=2653390110&idx=1&sn=b3e5d6e946b719 ...

  7. Android-有序广播是可以中断的

    在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现: 有序广播:接收者 可以 ...

  8. 三部曲搭建本地nuget服务器(图文版)

    下载Demo: 1.新建web的空项目 2.引入nuget包 3.修改配置文件config(可以默认) 运行效果:

  9. Android DatePicker / TimePicker 占空间太大的解决办法

    DatePicker 与 TimePicker 控件占用的空间是固定的,没有参数可以更改. 如果修改 length 和 width 属性,只会让控件被切割,显示将不完整.很多人说可以使用 scale ...

  10. Android 屏幕,语言,API版本 适配和兼容性

    Supporting Different Languages http://developer.android.com/training/basics/supporting-devices/langu ...