查看: 2067|回复: 9

[其他] 串口读取16进制

[复制链接]
  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2018-6-12 18:57 来自手机 | 显示全部楼层 |阅读模式
    本帖最后由 shenyunxiao 于 2018-6-13 15:40 编辑

    Arduino 怎么读取16进制  是这样的发送16进制 00 06 0F A0 00 01 4A ED,如果回复00 06 0F A0 00 01 4A ED就说明正常,我要在arduino里面判断如返回00 06 0F A0 00 01 4A ED就结束,不是的话在发送00 06 0F A0 00 01 4A ED,现在发送没有问题,就是接收没有弄好,请高手指导,,
    void setup() {
      Serial.begin(9600);
      Serial.flush();
    }
    void loop() {
      unsigned char Temp25[8] = {0x00,0x06,0x0F,0xA2,0x00,0x19,0xEB,0x27};
    Serial.write(Temp25,8);
    delay(10000);
    unsigned char off[8] = {0x00,0x06,0x0F,0xA0,0x00,0x00,0x8B,0x2D} ;
      Serial.write (off,8);
      delay(10000);


    }

  • TA的每日心情
    奋斗
    2019-3-20 23:34
  • 签到天数: 87 天

    [LV.6]常住居民II

    发表于 2018-6-12 20:00 | 显示全部楼层
    本帖最后由 孤胆枪手 于 2018-6-12 20:01 编辑

    你发送的十六进制或者十进制其实收到就是二进制
    你可以直接把收到的数据当十六进制处理,也可以直接当十进制处理
    打赏作者鼓励一下!
  • TA的每日心情
    奋斗
    2019-3-20 15:55
  • 签到天数: 207 天

    [LV.7]常住居民III

    发表于 2018-6-13 10:32 | 显示全部楼层
    你是要做什么
    校验码?
    还是发送数据包最后要校验和
    参考一下这个吧:
    https://www.arduino.cn/thread-5110-1-1.html
    打赏作者鼓励一下!

    1人打赏

  • TA的每日心情
    擦汗
    2018-9-19 20:22
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2018-6-13 18:45 | 显示全部楼层
    把每个16进制的值,看成一个字符就行了,就和普通读字符串一样的,没有区别
    如果你觉得以上内容帮到了你,你可以打赏支持作者

    1人打赏

  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2018-6-13 21:02 | 显示全部楼层
    coloz 发表于 2018-6-13 18:45
    把每个16进制的值,看成一个字符就行了,就和普通读字符串一样的,没有区别 ...

    可以帮忙写一下啊?
  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2018-6-13 21:05 | 显示全部楼层
    coloz 发表于 2018-6-13 18:45
    把每个16进制的值,看成一个字符就行了,就和普通读字符串一样的,没有区别 ...

    String comdata = "";

    void setup()
    {
        Serial.begin(9600);
    }

    void loop()
    {
        while (Serial.available() > 0)  
        {
            comdata += char(Serial.read());
            delay(2);
        }
        if (comdata.length() > 0)
        {
            Serial.println(comdata);
            comdata = "";
        }
    }用这个,但是读取不到返回的这个00 06 0F A0 00 01 4A ED,
  • TA的每日心情
    擦汗
    2018-9-19 20:22
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2018-6-13 23:32 | 显示全部楼层
    16进制数据,你作为字符串输出,如果不是ascii,就看不到的
    如果你觉得以上内容帮到了你,你可以打赏支持作者
  • TA的每日心情
    慵懒
    2018-11-12 08:58
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2018-6-13 23:52 | 显示全部楼层
    可以参考我贴,算了直接写个吧

    kittenblock中小学创客名师推荐的图形化编程软件

    #define MAX_PACKETSIZE 128 //自定义的缓冲buff长度
    
    char uart_Receive_Buff [ MAX_PACKETSIZE ]; //定义缓冲buff
    
    unsigned int uart_Receive_Index = 0; //收到的字节实际长度
    
    unsigned long preUartTime = 0; //记录读取最好一个字节的时间点
    
    /*
      处理串口数据函数,可以在函数内编写处理函数数据的程序
    */
    void parseUartPackage(char *p , int len) {
    
      if (len != 8) {
        //不是目标长度
        char buf[8] = {0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED};
        send2UART(buf, 8);
      }
      else {
        char buf[8] = {0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED};
        for (int i = 0; i < 8; i++) {
    
          if (p != buf) {
            //不等
            char buf2[8] = {0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED};
            send2UART(buf2, 8);
            break;
          }
        }
        //相等
    
      }
    
    
    }
    
    void send2UART(const char *p, size_t len) {
      Serial.write(p, len);
    }
    /*
            串口数据接受进程
     */
    void doUartTick()
    {
      if (Serial.available())
      { //读取串口数据
        //每次读取一个字节的数据存储在这个buff中
        uart_Receive_Buff [ uart_Receive_Index ++ ] = Serial.read();
        //记录下读取这个数据的时间点
        preUartTime = millis();
    
        //判断读取到的数据长度是否超过设定的记录长度,超过长度时间点往前200ms 立即执行分析函数
        if (uart_Receive_Index >= MAX_PACKETSIZE - 1) {
          uart_Receive_Index = MAX_PACKETSIZE - 2;
          preUartTime = preUartTime - 200;
        }
      }
      //判断收到的最后一个字节后超过100ms开始执行分析函数
      if (uart_Receive_Index > 0 && (millis() - preUartTime >= 100))
      { //处理串口数据
        //把buff最后一个字节设为0,在字符串处理中很有用
        uart_Receive_Buff [ uart_Receive_Index ] = 0x00;
        Serial.flush();
    
        //执行串口数据处理函数
        parseUartPackage(uart_Receive_Buff, uart_Receive_Index);
        uart_Receive_Index = 0;
      }
    }
    
    void setup() {
      Serial.begin(9600);
      char buf[8] = {0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED};
      send2UART(buf, 8);
    }
    
    void loop()
    {
      //调用串口数据处理进程
      doUartTick();
    }
    文章有帮助,可以请我喝杯咖啡

    1人打赏

  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2018-6-19 17:56 | 显示全部楼层
    再串口监视器里输入0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED输出字母J,为什么?
  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2018-6-19 20:17 | 显示全部楼层
    跑龙套的保 发表于 2018-6-13 23:52
    可以参考我贴,算了直接写个吧
    [mw_shl_code=cpp,true]#define MAX_PACKETSIZE 128 //自定义的缓冲buff长度 ...

    再串口监视器里输入0x00, 0x06, 0x0F, 0xA0, 0x00, 0x01, 0x4A, 0xED输出字母J,为什么?
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    AT固件无法正常使用
    AT固件无法正常使用
    按照文档烧入AT固件后,串口(9600)输出如下: 发送AT指令没有反应。
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    数字传感器与模拟传感器的使用
    数字传感器与模拟传感器的
    很多新人问,如何写XX传感器的驱动,这里说说简单只需要读取一个数字信号或者模拟信号
    基于Esp8266的点阵时钟
    基于Esp8266的点阵时钟
    芯片是ESP8266 12F 配合点阵单元板(64*32,单色),实现自动对时,天气预报,农历,
    做个遥控玩具
    做个遥控玩具
    现在我想做个手工,想用这个当5V马达+5V灯光+5V音乐的遥控器 可以实现吗?还需要买Ar
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表