|
|
本帖最后由 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存储器也比较麻烦吧。
求解。
最后的解码代码,未优化
- /*协议解码程序*/
- #include "LCM14432_SPI.h"
- #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
- String comdata = "";
- String prts = "";
- String tmps = "";
- int x=0;
- unsigned char HexStr1[36]={
- 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[36]={
- 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[3]={
- 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[0]==comdata[comlen]))//判断数据串首和尾是否为标志位
- {
- clslcm();
- switch (int(comdata[2]))//根据数据串第三位,判断牌子地址
- {
- case 1:
- HexStr1[0]=0xC7;
- HexStr1[1]=0xB0;
- HexStr1[2]=0xC5;
- HexStr1[3]=0xC6;
- break;
- case 2:
- HexStr1[0]=0xB2;
- HexStr1[1]=0xE0;
- HexStr1[2]=0xC5;
- HexStr1[3]=0xC6;
- break;
- case 3:
- HexStr1[0]=0xBA;
- HexStr1[1]=0xF3;
- HexStr1[2]=0xC5;
- HexStr1[3]=0xC6;
- break;
- case 4:
- HexStr1[0]=0xCC;
- HexStr1[1]=0xF5;
- HexStr1[2]=0xC6;
- HexStr1[3]=0xC1;
- break;
- default:
- HexStr1[0]=0xB4;
- HexStr1[1]=0xED;
- HexStr1[2]=0xCE;
- HexStr1[3]=0xF3;
- }
- if (comdata[0]==0x7F)
- {
- //取出剩余的数据
- for (int i=6;i<=comlen-3;i++)
- {
- prts += comdata[i];
- }
- 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[i+6]=tmps[i];
- }
- 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[i]=tmps[i];
- }
- for (int i=0;i<=prts.length();i++)
- {
- HexStr2[i+tmps.length()]=prts[i];
- }
- }
- else
- {
- for (int i=10;i<=comlen-3;i++)
- {
- prts += comdata[i];
- HexStr2[i-10]=prts[i-10];
- }
- }
- comdata = "";
- prts="";
- }
- LCMST7920.DisplayString(0,0,HexStr1,AR_SIZE(HexStr1));
- LCMST7920.DisplayString(1,0,HexStr2,AR_SIZE(HexStr2));
- if ((HexStr1[19]!=0x20)|(HexStr2[19]!=0x20))
- {
- delay(400);
- LCMST7920.Roll(0);
- delay(200);
- }
- }
- void clslcm()
- {
- LCMST7920.CLEAR();//清屏
- for (int i=0;i<=36;i++)
- {
- HexStr1[i]=0x20;
- HexStr2[i]=0x20;
- }
- }
复制代码 |
|