查看: 1755|回复: 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):
    [C] 纯文本查看 复制代码
    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字符,但是结果运行不正确。

    [C] 纯文本查看 复制代码
    Serial.flush(); //等待,将之前的串口操作指令发送完毕[/align]
    while(Serial.available()) {
      char temp = Serial.read();
    }
    bool connection = false;
    if (temp == 0X00) {
      connection = true;
    } else {
      connection = false;
    [align=left]}

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

    [C] 纯文本查看 复制代码
      if (Serial.find(0X00)) {
        connection = 1;
    }

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

    先在此谢过各路大侠。


  • TA的每日心情
    奋斗
    2018-8-17 09:12
  • 签到天数: 47 天

    [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); 语句转换即可。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    体验OneNET,登录就送好礼
    体验OneNET,登录就送好礼
    OneNET--中国移动物联网开发平台,解决协议适配、海量连接、数据存储、设备管理等物
    初学arduino求助
    初学arduino求助
    大佬们,我想问一下,我现在想做一个程序:按下开关持续时间t,延迟7.77t后点亮led0.
    Arduino模拟USB鼠标
    Arduino模拟USB鼠标
    [md]### 模拟鼠标控制 下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。 [/md] [s
    ATK-esp8266WiFi模块
    ATK-esp8266WiFi模块
    我的esp8266模块以前烧进去过一次,半年没玩了。重新烧就提示错误了[/backcolor] 这是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表