查看: 2024|回复: 5

[已解决] 关于Arduino串口16进制读取的问题

[复制链接]
  • TA的每日心情
    开心
    2017-5-10 16:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2017-4-23 12:57 | 显示全部楼层 |阅读模式
    本帖最后由 Spico 于 2017-4-24 22:13 编辑

    近日在使用OneNet平台时遇到了关于Arduino串口16进制读取的问题。具体问题描述如下:
    1. 根据平台特性,连接成功后会返回一组十六进制数:0X20 0X02 0X00 0X00, 失败后会返回: 0X40 0X01 0X3C;
    2. 在串口输入时,调试ESP8266进入透传模式后可以直接使用如下代码方式进行链接(IDE版本:1.6.12):

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

    unsigned char connectData[50] = {
     0X10,0X30,0X00,0X03,0X45,0X44,0X50, 0X01,0X40,0X01,0X5C,0X00,0X07,0X34,
     0X39,0X33,0X33,0X37,0X38,0X37,0X00,
     0X1C,0X43,0X53,0X48,0X68,0X59,0X39,
     0X4F,0X35,0X6F,0X79,0X51,0X55,0X6E,
     0X41,0X33,0X5B,0X78,0X4B,0X3F,0X48,
     0X45,0X5B,0X59,0X44,0X73,0X50,0X30,
     0X3F
      };
      Serial.write(connectData, 50);
    3. 根据实际需要,我需要判断返回的数据,即如(1)中所说,要判断连接情况,以便执行正确操作。在使用串口工具,不使用Arduino时,对于这方面的操作可以选择“HEX显示”以查看结果,显示结果如下(如果不勾选的话就什么也不会显示):

    串口工具

    串口工具


    那么问题来了,在Arduino的程序之中怎么判断16进制返回值?

    尝试1:先Serial.read(),再判断最后一个数据,但是这个读取的是一个char字符,但是结果运行不正确。

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

    Serial.flush(); //等待,将之前的串口操作指令发送完毕
    while(Serial.available()) {   char temp = Serial.read(); } bool connection = false; if (temp == 0X00) {   connection = true; } else {   connection = false;
    }

    后来又尝试了Serial.find(),但是结果也不尽人意:

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

      if (Serial.find(0X00)) {
        connection = 1;
    }

    提问:如何正确地读取16进制数据并进行判断?

    先在此谢过各路大侠。


  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2017-4-23 15:42 | 显示全部楼层
    字太多,没全看,但我觉得你可能是没意识到串口监视器发送来的是字符串

    首先,进制只是数值的表现形式
    0x00=0
    0xFF=255
    如果传来的是0,那temp == 0X00就是成立的

    你确定你传入的是0?你可能是把字符串“0x00”和数值 0 搞混了
    如果以上内容对你有帮助,你可以通过打赏支持作者

    1人打赏

  • TA的每日心情
    开心
    2017-5-10 16:06
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2017-4-24 22:11 来自手机 | 显示全部楼层
    奈何col 发表于 2017-4-23 15:42
    字太多,没全看,但我觉得你可能是没意识到串口监视器发送来的是字符串

    首先,进制只是数值的表现形式

    谢谢您的指导,我确实是在基础问题的理解上面出现了偏差。
  • TA的每日心情
    开心
    2018-9-20 20:22
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2018-6-12 21:16 | 显示全部楼层
    怎么解决的啊。可以交流一下,同样问题!!!
  • TA的每日心情
    开心
    2017-5-10 16:06
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2018-6-24 18:16 | 显示全部楼层
    shenyunxiao 发表于 2018-6-12 21:16
    怎么解决的啊。可以交流一下,同样问题!!!

    可以将char类型的数组转为byte类型的数组,之后使用readBytes或者readBytesUntil函数即可读出。之后直接判断数组的值就好了。如果是想转换为可见的十六进制字符串,则直接使用String(str, HEX); 语句转换即可。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    【原创】制作一套USB电流采样板
    【原创】制作一套USB电流
    以前用 0.1Ω(R1J)曾经做过一个 USB 电流采集器,基本原理和 USB 电流表一致, 唯一
    arduino数字输出端低电平不稳定
    arduino数字输出端低电平
    我在做的功能: 用一个光电开关(买好的现成元件),发出高电平信号输入给arduino,然
    [Arduino物联网开发实战2]数据反馈
    [Arduino物联网开发实战2]
    [md]上一篇:(https://www.arduino.cn/thread-83177-1-1.html) ### 添加DIY组件
    博哥零基础教你玩转ESP8266(十四) ESP8266HTTPClient 连接世界
    博哥零基础教你玩转ESP826
    帖子导航帖 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表