串口数据包解析

ruanyirun 2013-10-22 12:00:58
//先描述一下问题的背景,我用3个已知坐标的传感器,去定位一个未知的传感器,得到的坐标信息通过一个网关(硬件)传给pc串口,但是传过来一堆数据如0C C0 E0 67 2E E6 02 22 E4 92 00 18 10 00 00 00 F8 FF 代表的是x坐标=1.0 其后的00 00代表的是y坐标=0,但我不知道具体是怎么换算的,下面是具体的数据打包发送程序

//cc2430传感器作为网关给pc串口发送数据,LocDongle_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )函数的功能是处理各个节点的数据
static void LocDongle_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )
{
#if defined ( ZBIT )
switch ( pkt->clusterId )
{
case LOCATION_BLINDNODE_RESPONSE: //定位节点应答
case LOCATION_BLINDNODE_CONFIG://定位节点配置
blindNodes[0].addr = pkt->srcAddr.addr.shortAddr;
blindNodes[0].ep = pkt->srcAddr.endPoint;
break;

default:
break;
}
#else
#include "SPIMgr.h"
//所有引入信息从串口发送给pc
// All incoming messages are sent out the serial port as a SYS_APP_MSG.
uint16 cmd = SPI_RESPONSE_BIT | SPI_CMD_SYS_APP_MSG;
// DstEP + SrcAddr + SrcEP + cId + len = 1+2+1+2+1
uint8 buf[SPI_0DATA_MSG_LEN + 7];
uint8 *pBuf = buf;
uint8 succ = FALSE;

*pBuf++ = SOP_VALUE; // 操作系统值0X02
*pBuf++ = (uint8)(HI_UINT16( cmd )); //0X10
*pBuf++ = (uint8)(LO_UINT16( cmd )); //0X10
*pBuf++ = pkt->cmd.DataLength + 7; //数据长度

*pBuf++ = LOCATION_DONGLE_ENDPOINT; //0XCB
*pBuf++ = LO_UINT16( pkt->srcAddr.addr.shortAddr );//
*pBuf++ = HI_UINT16( pkt->srcAddr.addr.shortAddr );//网络地址
*pBuf++ = pkt->srcAddr.endPoint; //终端地址
*pBuf++ = LO_UINT16( pkt->clusterId ); //串ID
*pBuf++ = HI_UINT16( pkt->clusterId ); //
*pBuf++ = pkt->cmd.DataLength; //坐标数据长度


//(void)HalUARTWrite( SPI_MGR_DEFAULT_PORT, buf, 11 );
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, buf, 11 ) )
{
//(void)HalUARTWrite( SPI_MGR_DEFAULT_PORT, pkt->cmd.Data, pkt->cmd.DataLength);
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, pkt->cmd.Data, pkt->cmd.DataLength) )
{
cmd = SPIMgr_CalcFCS( buf+1, 10 ) ^
SPIMgr_CalcFCS( pkt->cmd.Data, pkt->cmd.DataLength );
//去除buf第一位操作系统值,然后进行异或校验(这一块我看的稀里糊涂的,尽管有注释我还是不明白,有没有高手用如上面所给的数据具体操作一下,是在看不明白最后是怎么异或操作的)
if ( HalUARTWrite( SPI_MGR_DEFAULT_PORT, (uint8 *)(&cmd), 1 ) )//发送数据位
{
succ = TRUE;
}
}
}
#endif
}
//上面的程序代码是用来处理各个节点发送给网关的有效数据,包括参考节点的配置数据,定位节点的配置数据等,这些数据包含了操作系统值,节点网络地址,有效数据长度,串ID,坐标数据长度,坐标信息等,这些数据被收集以后,首先通过串口发送给pc,然后对这些数据进行校验,校验的方法是去除数据操作系统值,即第一位,对各位数据进行异或计算,校验计算程序清单如下:
byte SPIMgr_CalcFCS(unit8 *msg_ptr, unit8 len)
{
byte x;
byte xorResult;
xorResult=0;
for(x=0;x<len;x++,msg_ptr++)
xorResult =xorResult^*msg_ptr;//异或计算
return(xorResult);//返回校验值

}
...全文
571 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-10-23
  • 打赏
  • 举报
回复
推荐使用软件portmon辅助调试串口通讯程序。
ruanyirun 2013-10-22
  • 打赏
  • 举报
回复
可是我不知道怎么组包收啊,上面那段程序应该就是组包发送的过程了,我用C#编了一个串口调试程序主要函数如下: void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增加接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString()); //修改接收计数 labelGetCount.Text = "Get:" + received_count.ToString(); })); } private void buttonOpenClose_Click(object sender, EventArgs e) { //根据当前串口对象,来判断操作 if (comm.IsOpen) { //打开时点击,则关闭串口 comm.Close(); } else { //关闭时点击,则设置好端口,波特率后打开 comm.PortName = comboPortName.Text; comm.BaudRate = int.Parse(comboBaudrate.Text); try { comm.Open(); } catch(Exception ex) { //捕获到异常信息,创建一个新的comm对象,之前的不能用了。 comm = new SerialPort(); //现实异常信息给客户。 MessageBox.Show(ex.Message); } } 有没有大神能给我补一段程序用于解析数据得到原来的数据值吗
modyaj 2013-10-22
  • 打赏
  • 举报
回复
发送和接收需要使用同一个协议吧!他们怎么组包发 你就怎么收
buyong 2013-10-22
  • 打赏
  • 举报
回复
但是传过来一堆数据如0C C0 E0 67 2E E6 02 22 E4 92 00 18 10 00 00 00 F8 FF 代表的是x坐标=1.0 其后的00 00代表的是y坐标=0 ?? 看具体协议的规格说明
ruanyirun 2013-10-22
  • 打赏
  • 举报
回复
自己顶一下,急急急!!!
ruanyirun 2013-10-22
  • 打赏
  • 举报
回复
有没有大神啊
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip 激光雷达hls_flcd2的python调试工具(可进行串口调试,数据包解析,使用pygame绘制可视化点云数据).zip

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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