maxims 发表于 2013-10-28 22:31:39

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

本帖最后由 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;
      prts+=comdata;
      prts+=comdata;
      prts+=comdata;
      Serial.println(prts);
      LCMST7920.DisplayStr(1,0,prts);
      comdata = "";
      prts="";
    }
   
}

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

求解。

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

String comdata = "";
String prts = "";
String tmps = "";
int x=0;
unsigned char HexStr1={
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};
unsigned char HexStr2={
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};
unsigned char HexStr3={
0x20,0x7F,0x7E};
void setup()
{
LCMST7920.Init(); // 屏幕初始化
delay(100);
LCMST7920.Init(); // 屏幕初始化
delay(100);
LCMST7920.CLEAR();//清屏
Serial.begin(9600);
}

void loop()
{
while (Serial.available() > 0)
{
    comdata += char(Serial.read());
    delay(2);
}
int comlen=comdata.length()-1;//去掉字串末尾的\0
if ( (comlen > 0) & (comdata==comdata))//判断数据串首和尾是否为标志位
{
    clslcm();
    switch (int(comdata))//根据数据串第三位,判断牌子地址
    {
    case 1:
      HexStr1=0xC7;
      HexStr1=0xB0;
      HexStr1=0xC5;
      HexStr1=0xC6;
      break;
    case 2:
      HexStr1=0xB2;
      HexStr1=0xE0;
      HexStr1=0xC5;
      HexStr1=0xC6;
      break;
    case 3:
      HexStr1=0xBA;
      HexStr1=0xF3;
      HexStr1=0xC5;
      HexStr1=0xC6;
      break;
    case 4:
      HexStr1=0xCC;
      HexStr1=0xF5;
      HexStr1=0xC6;
      HexStr1=0xC1;
      break;
    default:
      HexStr1=0xB4;
      HexStr1=0xED;
      HexStr1=0xCE;
      HexStr1=0xF3;
    }
    if (comdata==0x7F)
    {
      //取出剩余的数据
      for (int i=6;i<=comlen-3;i++)
      {
      prts += comdata;
      }
      x=prts.indexOf(0x2F);
      tmps=prts.substring(0,x);
      prts=prts.substring(x+1,prts.length());
      for (int i=0;i<=tmps.length();i++)
      {
      HexStr1=tmps;
      }
      x=prts.indexOf(0x2F);
      tmps=prts.substring(0,x);
      prts=prts.substring(x+1,prts.length());
      for (int i=0;i<=tmps.length();i++)
      {
      HexStr2=tmps;
      }
      for (int i=0;i<=prts.length();i++)
      {
      HexStr2=prts;
      }
    }
    else
    {
      for (int i=10;i<=comlen-3;i++)
      {
      prts += comdata;
      HexStr2=prts;
      }
    }
    comdata = "";
    prts="";
}
LCMST7920.DisplayString(0,0,HexStr1,AR_SIZE(HexStr1));
LCMST7920.DisplayString(1,0,HexStr2,AR_SIZE(HexStr2));
if ((HexStr1!=0x20)|(HexStr2!=0x20))
{
    delay(400);
    LCMST7920.Roll(0);
    delay(200);
}   
}


void clslcm()
{
       LCMST7920.CLEAR();//清屏
      for (int i=0;i<=36;i++)
    {
      HexStr1=0x20;
      HexStr2=0x20;
    }
}

maxims 发表于 2013-10-29 17:42:19

又被无视了

maxims 发表于 2013-10-30 22:10:27

:(:(:(:(:(
居然真没有人理我。。。

难道是这问题太菜了?

maxims 发表于 2013-11-1 09:48:17

哈哈,通过群里的兄弟帮忙,自己写出来了!

PaulMyao 发表于 2013-11-6 11:27:29

maxims 发表于 2013-11-1 09:48
哈哈,通过群里的兄弟帮忙,自己写出来了!

哈 亮出来看看啊

maxims 发表于 2013-11-6 16:25:54

PaulMyao 发表于 2013-11-6 11:27
哈 亮出来看看啊

好吖!待我整理一下,不准笑话人哦!!!
页: [1]
查看完整版本: 【求助】关于串口接收HEX格式&接收之后的处理