极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18128|回复: 5

【求助】关于串口接收HEX格式&接收之后的处理

[复制链接]
发表于 2013-10-28 22:31:39 | 显示全部楼层 |阅读模式
本帖最后由 maxims 于 2013-11-6 22:09 编辑

从外部通过串口发送一串HEX数值到UNO板。
“7F 00 03 10 80 01 C1 FA BB AA D0 A1 C7 F8 2F A3 B8 A3 B5 A3 B7 2F BD F0 C9 B3 B8 DB CD E5 00 93 7F ”

这串HEX是有一定格式的
7F 00 # 10 80 01 # 2F # 2F # 00 # 7F

这里的#号是不固定长度和内容的数值,其他的数值是固定下了的。

当UNO收到这串数值之后,把它按照上边的格式拆分,拆分之后按照一定的格式存储起来,其中的一部分需要送到LCM进行显示。

研究了一个晚上,得到以下代码
void loop()
{
while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);
    }
    if (comdata.length() > 0)
    {  
        LCMST7920.DisplayStr(1,0,comdata);
        prts+=comdata[6];
        prts+=comdata[7];
        prts+=comdata[8];
        prts+=comdata[9];
        Serial.println(prts);
        LCMST7920.DisplayStr(1,0,prts);
        comdata = "";
        prts="";
    }
   
}


但是,感觉这个处理方法不是很妥当,效率太低,并且数据的再加工难度也比较大,存到SPI存储器也比较麻烦吧。

求解。

最后的解码代码,未优化
  1. /*协议解码程序*/
  2. #include "LCM14432_SPI.h"
  3. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )

  4. String comdata = "";
  5. String prts = "";
  6. String tmps = "";
  7. int x=0;
  8. unsigned char HexStr1[36]={
  9.   0X20,0X20,0X20,0X20,0x20,0x20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0x20,0x20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
  10. unsigned char HexStr2[36]={
  11.   0X20,0X20,0X20,0X20,0x20,0x20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0x20,0x20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20};
  12. unsigned char HexStr3[3]={
  13.   0x20,0x7F,0x7E};
  14. void setup()
  15. {
  16.   LCMST7920.Init(); // 屏幕初始化
  17.   delay(100);
  18.   LCMST7920.Init(); // 屏幕初始化
  19.   delay(100);
  20.   LCMST7920.CLEAR();//清屏
  21.   Serial.begin(9600);
  22. }

  23. void loop()
  24. {
  25.   while (Serial.available() > 0)  
  26.   {
  27.     comdata += char(Serial.read());
  28.     delay(2);
  29.   }
  30.   int comlen=comdata.length()-1;//去掉字串末尾的\0
  31.   if ( (comlen > 0) & (comdata[0]==comdata[comlen]))//判断数据串首和尾是否为标志位
  32.   {  
  33.     clslcm();
  34.     switch (int(comdata[2]))//根据数据串第三位,判断牌子地址
  35.     {
  36.     case 1:
  37.       HexStr1[0]=0xC7;
  38.       HexStr1[1]=0xB0;
  39.       HexStr1[2]=0xC5;
  40.       HexStr1[3]=0xC6;
  41.       break;
  42.     case 2:
  43.       HexStr1[0]=0xB2;
  44.       HexStr1[1]=0xE0;
  45.       HexStr1[2]=0xC5;
  46.       HexStr1[3]=0xC6;
  47.       break;
  48.     case 3:
  49.       HexStr1[0]=0xBA;
  50.       HexStr1[1]=0xF3;
  51.       HexStr1[2]=0xC5;
  52.       HexStr1[3]=0xC6;
  53.       break;
  54.     case 4:
  55.       HexStr1[0]=0xCC;
  56.       HexStr1[1]=0xF5;
  57.       HexStr1[2]=0xC6;
  58.       HexStr1[3]=0xC1;
  59.       break;
  60.     default:
  61.       HexStr1[0]=0xB4;
  62.       HexStr1[1]=0xED;
  63.       HexStr1[2]=0xCE;
  64.       HexStr1[3]=0xF3;
  65.     }
  66.     if (comdata[0]==0x7F)
  67.     {
  68.       //取出剩余的数据
  69.       for (int i=6;i<=comlen-3;i++)
  70.       {
  71.         prts += comdata[i];
  72.       }
  73.       x=prts.indexOf(0x2F);
  74.       tmps=prts.substring(0,x);
  75.       prts=prts.substring(x+1,prts.length());
  76.       for (int i=0;i<=tmps.length();i++)
  77.       {
  78.         HexStr1[i+6]=tmps[i];
  79.       }
  80.       x=prts.indexOf(0x2F);
  81.       tmps=prts.substring(0,x);
  82.       prts=prts.substring(x+1,prts.length());
  83.       for (int i=0;i<=tmps.length();i++)
  84.       {
  85.         HexStr2[i]=tmps[i];
  86.       }
  87.       for (int i=0;i<=prts.length();i++)
  88.       {
  89.         HexStr2[i+tmps.length()]=prts[i];
  90.       }
  91.     }
  92.     else
  93.     {
  94.       for (int i=10;i<=comlen-3;i++)
  95.       {
  96.         prts += comdata[i];
  97.         HexStr2[i-10]=prts[i-10];
  98.         }
  99.     }
  100.     comdata = "";
  101.     prts="";
  102.   }
  103.   LCMST7920.DisplayString(0,0,HexStr1,AR_SIZE(HexStr1));
  104.   LCMST7920.DisplayString(1,0,HexStr2,AR_SIZE(HexStr2));
  105.   if ((HexStr1[19]!=0x20)|(HexStr2[19]!=0x20))
  106.   {
  107.     delay(400);
  108.     LCMST7920.Roll(0);
  109.     delay(200);
  110.   }   
  111. }


  112. void clslcm()
  113. {
  114.        LCMST7920.CLEAR();//清屏
  115.       for (int i=0;i<=36;i++)
  116.     {
  117.       HexStr1[i]=0x20;
  118.       HexStr2[i]=0x20;
  119.     }
  120.   }
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-10-29 17:42:19 来自手机 | 显示全部楼层
又被无视了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-30 22:10:27 | 显示全部楼层

居然真没有人理我。。。

难道是这问题太菜了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-1 09:48:17 来自手机 | 显示全部楼层
哈哈,通过群里的兄弟帮忙,自己写出来了!
回复 支持 反对

使用道具 举报

发表于 2013-11-6 11:27:29 来自手机 | 显示全部楼层
maxims 发表于 2013-11-1 09:48
哈哈,通过群里的兄弟帮忙,自己写出来了!

哈 亮出来看看啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-6 16:25:54 来自手机 | 显示全部楼层
PaulMyao 发表于 2013-11-6 11:27
哈 亮出来看看啊

好吖!待我整理一下,不准笑话人哦!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 23:00 , Processed in 0.041291 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表