历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | 第六种串口协议实现

发布者:码梦创想 来源: eefocus关键字:第六种  串口协议  STM32 手机看文章 扫描二维码
随时随地手机看文章

编写语言:C++


编写平台:VS


运用平台:STM32和PC


非常实用的一个解析程序,自己编写的也简单。


*.h


#define BUF_LEN 1024 //buf长度

#define CONF_BUF_LEN 128 //保存代解析数据

#define DATA_BUF_LEN 100 //保存解析数据 //此处为最大传输数据

#define CONF_BUF_BEST_LEN 4 //基本数据长度

 

 

 

/*/////////////////协议定义//////////////////////

//   0x6B 0x66 长度 数据 校验(长度+数据的和)

//最基本的数据 0x6B 0x66 0x01 0x01 0x2

用法:1.调用add();函数,在中断函数,或者线程

  2.调用checke_con();函数,在主函数或者线程,中断

*/

//针头

#define ZT1 0x6B

#define ZT2 0x66

 

 

///////////////////////////////////////////////

 

class uart

{

 

public:

uart(void);

~uart(void);

 

private:

unsigned char buf[BUF_LEN]; //buf队列

unsigned char conf_buf[CONF_BUF_LEN]; //代解析到的数据

unsigned int conf_buf_len; //代解析数据长度

public:

unsigned char data_buf[DATA_BUF_LEN]; //解析数据:长度+数据

unsigned char data_buf_len;

unsigned int buf_len; //buf长度

unsigned char *in; //队列头

unsigned char *out; //队列未

public:

//添加数据到队列

void add(unsigned char temp);

 

//出队数据到队列

unsigned char del();

 

//检查命令

int checke_con();

 

 

 

};

.cpp


#include "stdafx.h"

#include "uart.h"

#include "string.h"

 

uart::uart(void)

{

in=buf;

out=buf;

buf_len=0;

conf_buf_len=0;

data_buf_len=0;

memset(buf,0,BUF_LEN);

}

 

 

uart::~uart(void)

{

}

 

//添加数据到队列

void uart::add(unsigned char temp)

{

 

*in++=temp;

 

buf_len++;

 

if(in==(buf+BUF_LEN))in=buf;

 

//printf("buf:%sn",buf);

}

 

//出队数据到队列

unsigned char uart::del()

{

unsigned char ch;

 

if(buf_len>0)

{

 

 

buf_len--;

ch=*out++;

if(out==(buf+BUF_LEN))out=buf;

 

return ch;

}

 

 

return 0;

}

 

//检查命令

int uart::checke_con()

{

 

int len=0;

int data_len=0;

unsigned char c=0;

 

if(buf_len>0)

{

c=del();

//printf("(1):%x n",c);

conf_buf[conf_buf_len++]=c;

if(conf_buf_len>DATA_BUF_LEN+CONF_BUF_BEST_LEN)conf_buf_len=0;

}

else return 0;

 

if(conf_buf_len>=CONF_BUF_BEST_LEN)

{

int i=0;

 

if(conf_buf[2]>DATA_BUF_LEN) //长度不大于可用长度

{

for(i=0;i {

conf_buf[i]=conf_buf[i+1];

}

conf_buf_len-=1;

return 0;

}

 

//while(i //{

// printf("%x ",conf_buf[i]);

// i++;

//}

//printf("n");

 

if(conf_buf[len]!=ZT1) //判断针头

{

for(i=0;i {

conf_buf[i]=conf_buf[i+1];

}

conf_buf_len-=1;

return 0;

}

 

if(conf_buf[len+1]!=ZT2) //判断针头

{

for(i=0;i {

conf_buf[i]=conf_buf[i+1];

}

conf_buf_len-=1;

return 0;

}

 

len+=2;

 

data_len=conf_buf[len]; //数据长度

//printf("len:%dn",data_len);

//printf("buf_len:%dn",conf_buf_len);

 

 

 

if((data_len+CONF_BUF_BEST_LEN)<=(conf_buf_len)) //数据包长度刚和等于数据长度加基本数据包

{

 

int N=len;

int sum=0;

data_buf_len=0;

 

 

while(N<=data_len+len)

{

data_buf[data_buf_len++]=conf_buf[N];

sum+=conf_buf[N++];

}

data_buf[data_buf_len]=0;

 

//printf("sum:%dn",sum);

 

if(sum==conf_buf[N]) //判断校验

{

for(i=0;i<(data_len+CONF_BUF_BEST_LEN);i++)

{

conf_buf[i]=conf_buf[i+data_len+CONF_BUF_BEST_LEN];

}

conf_buf_len-=(data_len+CONF_BUF_BEST_LEN);

return 1;

 

}else   //检验失败

{

for(i=0;i {

conf_buf[i]=conf_buf[i+1];

}

conf_buf_len-=1;

 

}

 

}

 

 

}

 

 

return 0;

}

main.c


// 串口协议0.6.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include "uart.h"

#include "windows.h"

#include "conio.h"

 

uart U;

 

//子线程函数    

DWORD WINAPI ThreadFun(LPVOID pM)    

{    

int v=0;

        while(1)  

        {  

//if(U.buf_len>0)

//{

// printf("%x ",U.del());

// v++;

// if(v==12)printf("n"),v=0;

//}

if(U.checke_con())

{

printf("解析出数据--------ok:");

for(int i=0;i {

printf("%x ",U.data_buf[i]);

}

printf("n");

}

Sleep(2);  

        }  

}   

 

int _tmain(int argc, _TCHAR* argv[])

{

char ch;

int n=1;

int chi=10;

unsigned char str[]={0x6b,0x43,0x66,0x6B,0x66,0x03,0x02,0x1,0x21,0x27,0x12,0x66,0x32,0x12,0x6B,0x66,0x01,0x02,0x3};

unsigned char str1[]={0x6B,0x66,0x03,0x02,0x1,0x21,0x27,0x6B,0x66,0x01,0x02,0x3};

HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);  

 

while(chi--)

{

for(int i=0;i<12;i++)

 

U.add(str1[i]);

 

Sleep(100);

//getch();

 

//printf("n");

//printf("nadd:%dn",n++);

}

 

while(1);

 

return 0;

}

 


运行效果:

关键字:第六种  串口协议  STM32 引用地址:第六种串口协议实现

上一篇:使用sublime开发python
下一篇:串口命令解析

推荐阅读

日本号称“机器人王国”,自20世纪80年代以来,无论是在机器人的生产、出口和使用方面都居世界前列。今天,就让我们一起来鉴赏一下那些日本出品的全球最顶尖的机器人产品。工业机器人独占鳌头根据2017年数据显示,在工业机器人领域,全球前十大机器人厂商瓜分了90%的市场。而这之中,日本企业有五家,分别是:发那科、安川、那智不二越、爱普生以及川崎。...
图片来自“特定授权”结束位于上海的世界人工智能大会的首展后,中国首款车规级人工智能芯片又“驶”向海外。9月中旬,这款由地平线研发的“征程二代”(Journey 2)车规级AI芯片首次在海外——法兰克福车展亮相。与2017年发布征程一代相同,征程二代芯片同样基于地平线自主创新研发的高性能计算架构BPU打造而成,但在BPU由1.0变为2.0的基础上,征程二代...
今天,一加手机官方微博透露,一加8T将采用65超级闪充,充电速度是上代的两倍以上,能够在39分钟内将一加 8T的4500mAh电池充满。 一加创始人刘作虎表示,一加8T配备了65W闪充,我们还给它配上了4500mAh大电池。这是一加史上最大一次充电升级,20分钟就能充回70%的电。怎么样,可以痛痛快快换新机了。据悉,一加8T内置双电芯以实现65W闪充技术,两款电池同...
据新华社9月25日消息:经中国政府不懈努力,当地时间9月24日,孟晚舟女士已经乘坐中国政府包机离开加拿大,即将回到祖国,并与家人团聚。孟晚舟(资料图 来源:央视新闻)孟晚舟在中国政府包机上发布的感言:月是故乡明,心安是归途舷窗外一片漆黑,机翼上的航行灯闪烁不停,在寂静的夜空中,这些许的微光显得格外温暖。此刻,我正飞越北极上空,向着家的...

史海拾趣

问答坊 | AI 解惑

变频电机资料谁有啊??????、、

变频电机资料谁有啊??????、、变频电机资料谁有啊??????、、变频电机资料谁有啊??????、、变频电机资料谁有啊??????、、变频电机资料谁有啊??????、、变频电机资料谁有啊??????、、变频电机资料谁有啊???? ...…

查看全部问答∨

关于方波转换成正弦波

我的电路能够得到一系列的方波信号,但是占空比不一样。因为占空比不一样,如果我直接加不可调的低通滤波器转换成正弦波的话,得到的正弦波有些就不能做到关于时间轴对称。那么如果我要实现所有的正弦波都关于时间轴对称(即对任意占空比的方波都能 ...…

查看全部问答∨

谁知道论文的格式啊???

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 写多少页,字号之类的 啊 ,谢谢啦  …

查看全部问答∨

操作系统热启动的问题

本人用的是PPC440的CPU,操作系统起来后,其余的好像都正常,网络,串口都能正常工作, 可是热启动(ctrl+x)后,操作系统就死了, 这时候没有一点反应, 不知道是什么原因,其中romInit.s中一部分内容如下: FUNC_LABEL(_romInitWarm) FUNC_L ...…

查看全部问答∨

求UC/OS-II方面的论文

不需要代码,只要论文,基本的可以自己搞,就是不知道具体的要做个什么东西,希望好心人指点下,提供这方面的资料借鉴下~! 邮箱:wleuler@163.com…

查看全部问答∨

EVC中如何改变编辑框中的字体大小

EVC中如何改变编辑框中的字体大小,和vc里一样吗?可我一样不会谢谢了!…

查看全部问答∨

关于CEDDK的READ_PORT_UCHAR(<端口号地址>),其中的端口号地址是在哪里定义的呢?

小弟最近在写一个GPIO驱动,在GPI_Read()流接口函数中想用READ_PORT_UCHAR(<端口号地址>)从指定的GPIO的端口接受数据。我用的是PXA270,其中的GPIO的端口号地址是在哪里定义的呢?我看了PXA270的datasheet好像没有发现。…

查看全部问答∨

兴大豪科技高薪诚聘以下职位

兴大豪科技高薪诚聘以下职位 VC工程师 待遇在8k 精通VC++ ,熟悉SQLServer数据库和基于socket网络编程;有数控系统人机界面开发经验者优先考虑。 硬件开发工程师  待遇在8k 岗位一:有电机控制项目5年以上开发经验,熟悉DSP编程和电 ...…

查看全部问答∨

大四学生请教嵌入式WINCE系统驱动入门问题

我是大四的一名学生,我想毕业可从事嵌入式系统这方面的工作,现在我想学习驱动编程,我只在书上看了一些WIN   CE的基本驱动的结构, 我想深入了解, 1)应该从那一方面入手呢,或者说先从那一个模块开始深入了解呢? 2)我需要什么专业知识 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved