/* parser.c */
#include <stdlib.h>
#include "parser.h"
/**
* 初始化一个解析器
*
* @_data_header: 数据头指针
* @_header_size: 数据头大小
* @_data_footer: 数据尾指针
* @_foot_size: 数据尾大小
* @_data_frame_size: 一帧完整数据的大小
*
* @return: 解析器
*/
DataParser *parser_init(uint8 *_data_header, uint8 _header_size, uint8 *_data_footer, uint8 _foot_size, uint8 _data_frame_size)
{
DataParser *parser = (DataParser *)malloc(sizeof(DataParser));
if((_header_size+_foot_size) > _data_frame_size || (_header_size+_foot_size) == 0)
return NULL;
parser->parser_queue = init_queue(_data_frame_size);
parser->resule_pointer = NULL;
parser->data_header = _data_header;
parser->header_size = _header_size;
parser->data_footer = _data_footer;
parser->footer_size = _foot_size;
parser->result_size = _data_frame_size - parser->header_size - parser->footer_size;
parser->parserResult = RESULT_FALSE;
while(_data_frame_size-- > 0)
{
en_queue(parser->parser_queue, 0);
}
return parser;
}
/**
* 将数据添加到解析器中进行解析
*
* @_parser: 解析器
* @_data: 要解析的数据
*
* @return: 当前解析结果,返回 RESULT_TRUE 代表成功解析出一帧数据
*/
ParserResult parser_put_data(DataParser *_parser, uint8 _data)
{
uint8 i;
Node *node;
if(_parser == NULL)
return RESULT_FALSE;
en_queue(_parser->parser_queue, _data);
/* 校验数据尾 */
node = _parser->parser_queue->back;
for(i = _parser->footer_size; i > 0; i--)
{
if(node->data != _parser->data_footer[i-1])
goto DATA_FRAME_FALSE;
node = node->pre_node;
}
/* 校验数据头 */
node = _parser->parser_queue->front;
for(i = 0; i < _parser->header_size; i++)
{
if(node->data != _parser->data_header[i])
goto DATA_FRAME_FALSE;
node = node->next_node;
}
if(_parser->resule_pointer == NULL && _parser->result_size > 0)
_parser->resule_pointer = node;
if(_parser->parserResult != RESULT_TRUE)
_parser->parserResult = RESULT_TRUE;
return _parser->parserResult;
DATA_FRAME_FALSE:
if(_parser->resule_pointer != NULL)
_parser->resule_pointer = NULL;
if(_parser->parserResult != RESULT_FALSE)
_parser->parserResult = RESULT_FALSE;
return _parser->parserResult;
}
/**
* 解析成功后从解析器中取出解析结果
*
* @_parser: 解析器
* @_index: 解析结果集合中的第 _index 个数据
*
* @return: 获取解析成功的数据,返回 -1 代表数据获取失败
*/
int parser_get_data(DataParser *_parser, uint8 _index)
{
Node *node;
if(_parser == NULL
|| _parser->parserResult != RESULT_TRUE
|| _index >= _parser->result_size
|| _parser->resule_pointer == NULL)
return -1;
node = _parser->resule_pointer;
while(_index > 0)
{
node = node->next_node;
_index--;
}
return node->data;
}
/**
* 重置解析器
*
* @_parser: 解析器
*/
void parser_reset(DataParser *_parser)
{
uint8 _data_frame_size;
if(_parser == NULL)
return;
_data_frame_size = _parser->parser_queue->size;
while(_data_frame_size-- > 0)
{
en_queue(_parser->parser_queue, 0);
}
_parser->resule_pointer = NULL;
_parser->parserResult = RESULT_FALSE;
}
/**
* 释放解析器
*
* @_parser: 解析器
*/
void parser_release(DataParser *_parser)
{
if(_parser == NULL)
return;
release_queue(_parser->parser_queue);
free(_parser);
_parser = NULL;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
单片机接收数据帧帧头帧尾校验数据解析.zip (50个子文件)
queue
queue
Debug
queue.exe 32KB
queue.pdb 411KB
queue.ilk 310KB
ipch
queue-7f1e603
queue-e1da8591.ipch 1.38MB
queue.sln 882B
queue.suo 13KB
queue.sdf 2.08MB
queue
queue.vcxproj 4KB
queue.vcxproj.user 143B
Debug
link.7576.read.1.tlog 2B
cl.command.1.tlog 2KB
queue.exe.intermediate.manifest 381B
queue.exe.embed.manifest.res 472B
queue.exe.embed.manifest 406B
queue.lastbuildstate 63B
rc.command.1.tlog 496B
CL.read.1.tlog 3KB
queue.obj 7KB
vc100.idb 43KB
mt.read.1.tlog 298B
link-cvtres.read.1.tlog 2B
link.read.1.tlog 3KB
rc.read.1.tlog 270B
link.write.1.tlog 922B
CL.write.1.tlog 1KB
vc100.pdb 60KB
queue.log 2KB
app.obj 7KB
link.command.1.tlog 2KB
queue.write.1.tlog 0B
queue.vcxprojResolveAssemblyReference.cache 713B
link.8064-cvtres.read.1.tlog 2B
link.8064-cvtres.write.1.tlog 2B
link.7576-cvtres.write.1.tlog 2B
link.8064.write.1.tlog 2B
link.7576.write.1.tlog 2B
mt.write.1.tlog 298B
queue_manifest.rc 200B
parser.obj 7KB
mt.command.1.tlog 366B
link.8064.read.1.tlog 2B
rc.write.1.tlog 278B
link-cvtres.write.1.tlog 2B
link.7576-cvtres.read.1.tlog 2B
parser.c 3KB
queue.vcxproj.filters 1KB
queue.c 2KB
queue.h 734B
parser.h 1KB
app.c 3KB
共 50 条
- 1
资源评论
- liu100m2018-10-15还可以,有特点。。。。秋山刀名鱼丶2018-11-25那你不给5分
秋山刀名鱼丶
- 粉丝: 8812
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功