关于QByteArray中提取数据

reynoldxu 2011-02-12 05:27:19
有如下数据包格式(16进制)
EA X1 X2 Y1 Y2 Z1 Z2 SUM AE

EA包头,固定

X1,X2为一个16位的二进制补码数(X2高八位,X1低八位)
Y1,Y2为一个16位的二进制补码数(Y2高八位,Y1低八位)
Z1,Z2为一个16位的二进制补码数(Z2高八位,Z1低八位)

SUM=X1+X2+Y1+Y2+Z1+Z2

AE包尾,固定

现在读出串口读出一段数据,存储在QByteArray中(QByteArray temp = myCom->readAll();)
如:
EA EB FF F9 FF 56 00 38 AE
EA E9 FF FD FF 53 00 37 AE
EA E9 FF 00 FF 4C 00 33 AE

问题:
怎么样把里面的XYZ在通过SUM校验正确后,都提取出来?
...全文
3452 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
reynoldxu 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangglemu 的回复:]

QByteArray temp = QByteArray::fromHex("AEEBFFF9FF560038AE");
检验和:
C/C++ code

char sum=0;
for(int i=1; i<7; i++)
{
sum += temp.at(i);
}
Q_ASSERT(sum == temp.at(7));// s……
[/Quote]



试着写了下,但只能读到一个包,第二个包就读不出来了?求教


void Widget::readMyCom() //读取串口数据并显示出来
{
QByteArray temp = myCom->readAll();
qDebug() << "==========start=========";

for(int i=2; i<sizeof(temp); i++)
{
qDebug() << "Loop i=: "<<i;
if((temp[i-2]==174)&&(temp[i-1]==234))//AE=174,EA=234
{
qDebug()<<"Head found";

if(temp.at(i+6)==(temp.at(i)+temp.at(i+1)+temp.at(i+2)+temp.at(i+3)+temp.at(i+4)+temp.at(i+5)))//Check sum
{
qDebug()<<"Check SUM All Right";
qint16 x,y,z;
x=(unsigned char)temp.at(i+1);//X的高位
x = x<<8;; //移到高位
x |= (unsigned char)temp.at(i);//加上X的低位
qDebug() << "X=: "<<x;


y=(unsigned char)temp.at(i+3);//y的高位
y = y<<8;; //移到高位
y |= (unsigned char)temp.at(i+2);//加上y的低位
qDebug() << "Y=: "<<y;

z=(unsigned char)temp.at(i+5);//z的高位
z = z<<8;; //移到高位
z |= (unsigned char)temp.at(i+4);//加上z的低位
qDebug() << "Z=: "<<z;
//i+=7;

qDebug()<<"Date Transformed";

}
else
{
qDebug()<<"Check SUM Failed";
}
}
else
{
qDebug()<<"Head is not right";
qDebug() << "Loop i=: "<<i;
qDebug() << "======================";
}
}

//*/
//读取串口缓冲区的所有数据给临时变量temp
//ui->textBrowser->insertPlainText(temp);
//将串口的数据显示在窗口的文本浏览器中
}


当我发送两个包:
38 AE// EA | E9 FF |FD FF | 53 00 | 37 AE// EA | E9 FF | 00 FF | 4C 00 | 33 AE // EA ED FF FC F
x= -23 y= -3 z= 83 x= -23 y= -256 z= 76
的到如下输出:
==========start=========
Loop i=: 2
Head is not right
Loop i=: 2
======================
Loop i=: 3
Head is not right
Loop i=: 3
======================
==========start=========
Loop i=: 2
Head is not right
Loop i=: 2
======================
Loop i=: 3
Head found
Check SUM All Right
X=: -23
Y=: -3
Z=: 83
Date Transformed
==========start=========
Loop i=: 2
Head is not right
Loop i=: 2
======================
Loop i=: 3
Head is not right
Loop i=: 3
======================
==========start=========
Loop i=: 2
Head is not right
Loop i=: 2
======================

第二个包就不读了???为什么呢
  • 打赏
  • 举报
回复
帮你弄了一个类,可以任意抓包,没注释,相信你能看明白

#include <QtCore/QCoreApplication>
#include <QByteArray>
#include <qdebug.h>
class Data
{
private:
QByteArray temp;
QList<QByteArray> items;
QList<QList<int> > data;
void doItems();
void doData();
public:
Data(QByteArray rd);
QList<QByteArray> getItems();
QList<QList<int> > getData();
};
Data::Data(QByteArray rd)
{
temp = rd;
doItems();
doData();
}
void Data::doItems()
{
unsigned char* s = (unsigned char*)temp.data();
for(int i=0; i<temp.length(); i++)
{
if(*s != 0xEA)
{
s++;
continue;
}
unsigned char* s2 = s;
if(i+8 > temp.length()-1)
return;
s2 += 8;
if(*s2 != 0xAE)
{
s++;
continue;
}
unsigned char *buff = new unsigned char[9];
memcpy(buff, s, 9);
QByteArray ba((const char*)buff, 9);
items.append(ba);
s += 8;
i += 8;
}
}
void Data::doData()
{
foreach(QByteArray ba, items)
{
char sum=0;
for(int i=1; i<7; i++)
{
sum += ba.at(i);
}
Q_ASSERT(sum == ba.at(7));

QList<int> li;
for(int i=1; i<7; i+=2)
{
int x = (unsigned char)ba.at(i+1);
x = x<<8;
x |= ba.at(i);
li.append(x);
}
data.append(li);
}
}
QList<QByteArray> Data::getItems()
{
return items;
}
QList<QList<int> > Data::getData()
{
return data;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray temp = QByteArray::fromHex("458789EAEBFFF9FF560038AE88FDEAEBFFF9FF560038AE67");
Data d(temp);
foreach(QList<int> li, d.getData())
{
qDebug()<<"X:"<<li.at(0)<<"Y:"<<li[1]<<"Z:"<<li[2];
}
return a.exec();
}

reynoldxu 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangglemu 的回复:]

QByteArray temp = QByteArray::fromHex("AEEBFFF9FF560038AE");
检验和:
C/C++ code

char sum=0;
for(int i=1; i<7; i++)
{
sum += temp.at(i);
}
Q_ASSERT(sum == temp.at(7));// s……
[/Quote]

谢谢,拼数据学习了,但是有一句不太明白:
QByteArray temp = QByteArray::fromHex("AEEBFFF9FF560038AE");
这个是对于已知数据,那如果是乱的呢,串口出来总是EA XX XX YY YY ZZ ZZ SUM AE但长度不定,会是
YY YY ZZ ZZ SUM AE EA XX XX YY YY ZZ ZZ SUM AE EA XX XX YY YY这个怎么把一个包取出来?包
  • 打赏
  • 举报
回复
QByteArray temp = QByteArray::fromHex("AEEBFFF9FF560038AE");
检验和:

char sum=0;
for(int i=1; i<7; i++)
{
sum += temp.at(i);
}
Q_ASSERT(sum == temp.at(7));// sum=0x38


提取数据
最简单的:

char* cs = temp.data();
cs++;//去掉包头
qint16 buff[3];
memcpy(buff,cs,6);复制数据

更直观的:

qint16 x;
x=(unsigned char)temp.at(2);//X的高位
x = x<<8;; //移到高位
x |= (unsigned char)temp.at(1);//加上X的低位
qDebug()<<x;


还有:

char* cs = temp.data();
cs++;
for(int i=0;i<3;i++)
{
qint16* t = (qint16*)cs;
qDebug()<<*t;
cs+=2;
}
reynoldxu 2011-02-12
  • 打赏
  • 举报
回复
主要是不会定位
信念 2011-02-12
  • 打赏
  • 举报
回复
怎么写的怎么读---貌似是句废话

16,819

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧