【求助】关于串口接收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-11-1 09:48
哈哈,通过群里的兄弟帮忙,自己写出来了!
哈 亮出来看看啊 PaulMyao 发表于 2013-11-6 11:27
哈 亮出来看看啊
好吖!待我整理一下,不准笑话人哦!!!
页:
[1]