查看: 655|回复: 9

[其他] 串口读取16进制

[复制链接]
  • TA的每日心情
    开心
    2018-6-13 15:43
  • 签到天数: 4 天

    [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的每日心情
    奋斗
    2018-8-11 14:59
  • 签到天数: 61 天

    [LV.6]常住居民II

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

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

    [LV.7]常住居民III

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

    1人打赏

  • TA的每日心情
    擦汗
    2018-8-18 00:32
  • 签到天数: 46 天

    [LV.5]常住居民I

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

    1人打赏

  • TA的每日心情
    开心
    2018-6-13 15:43
  • 签到天数: 4 天

    [LV.2]偶尔看看I

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

    可以帮忙写一下啊?
  • TA的每日心情
    开心
    2018-6-13 15:43
  • 签到天数: 4 天

    [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-8-18 00:32
  • 签到天数: 46 天

    [LV.5]常住居民I

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

    [LV.5]常住居民I

    发表于 2018-6-13 23:52 | 显示全部楼层
    可以参考我贴,算了直接写个吧
    [C++] 纯文本查看 复制代码
    #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[i] != buf[i]) {
            //不等
            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-6-13 15:43
  • 签到天数: 4 天

    [LV.2]偶尔看看I

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

    [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,为什么?
    高级模式  
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    我住长江头,君住长江尾,恰有同道者,千里来相会
    我住长江头,君住长江尾,
    我住长江头,君住长江尾恰有同道者,千里来相会 OneNET开发者交流会邀你来参加啦~活动
    请问这个串口软件是什么
    请问这个串口软件是什么
    问大佬们,如图的串口软件叫什么呢,跟arduino官方IDE好像不太一样,好用吗
    基于红外接收器与1602的简化科学计算器
    基于红外接收器与1602的简
    上图展示效果 硬件: arduino uno r3 红外接收器和遥控器 1602显示屏 面包板 杜邦线
    请教一下安装esp8266扩展问题
    请教一下安装esp8266扩展
    通过这个地址http://arduino.esp8266.com/stable/package_esp8266com_index.json以在
    云闪付为了购物 小伙居然...
    云闪付为了购物 小伙居然.
    驱动云闪付的屏幕 该屏幕是因为熊孩子拆了云闪付pos机,pos机防拆的机制导致损坏,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表