历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-25 来源:eefocus

编写语言: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;

}

 


运行效果:

推荐阅读

史海拾趣

AverLogic公司的发展小趣事

AverLogic公司在电子行业中以其技术创新和产品突破而崭露头角。在早期的发展阶段,公司专注于研发高质量的视频处理芯片,以满足市场对于更高清晰度和更流畅视频播放的需求。经过多次实验和迭代,公司成功推出了一款具有革命性的转换器产品——AL110,这款产品能够将PC和Macintosh的VGA信号转换为高品质的NTSC或PAL信号,从而极大地提升了视频信号的处理效率和输出品质。这一创新不仅为公司赢得了市场的认可,也为公司在电子行业中奠定了坚实的基础。

富满电子(FM)公司的发展小趣事

AverLogic公司在电子行业中以其技术创新和产品突破而崭露头角。在早期的发展阶段,公司专注于研发高质量的视频处理芯片,以满足市场对于更高清晰度和更流畅视频播放的需求。经过多次实验和迭代,公司成功推出了一款具有革命性的转换器产品——AL110,这款产品能够将PC和Macintosh的VGA信号转换为高品质的NTSC或PAL信号,从而极大地提升了视频信号的处理效率和输出品质。这一创新不仅为公司赢得了市场的认可,也为公司在电子行业中奠定了坚实的基础。

Bomar公司的发展小趣事

Bomar公司成立于1963年,最初是一家专注于石英晶体制造的公司。在当时的电子行业,石英晶体作为频率控制元件,对于无线通信和电子设备的稳定运行至关重要。Bomar公司通过不断的研发和技术创新,成功突破了石英晶振在宽频率范围内的高稳定性问题,满足了严格的FCC规范。这一技术突破使得Bomar公司的石英晶振在市场上获得了广泛的认可,并为公司的发展奠定了坚实的基础。

德索五金(dosinconn)公司的发展小趣事
AiT Semiconductor Inc公司的发展小趣事

对于半导体行业来说,产品质量是企业的生命线。AiT公司一直注重质量管理,从原材料采购到产品生产、检测等各个环节都严格把关。他们引进了先进的质量管理体系和检测设备,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的客户服务体系,及时解决客户在使用过程中遇到的问题。这些举措使得AiT公司的产品在市场上赢得了良好的口碑和客户信任。

DFI公司的发展小趣事

近年来,随着智能医疗和金融科技等新兴领域的兴起,DFI看到了新的发展机遇。公司开始将这些领域作为重点发展方向,投入大量资源进行研发和创新。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有创新性的智能医疗和金融科技产品。这些产品不仅为客户提供了更便捷、更高效的服务体验,也为DFI带来了新的增长点。随着这些新兴领域的不断发展壮大,DFI有望在未来实现更大的突破和发展。

请注意,以上故事均为虚构,旨在展示DFI公司可能的发展历程和业务活动。实际情况可能有所不同,具体信息请参考DFI公司的官方资料。

问答坊 | AI 解惑

新能源新趋势

新能源几乎成了“绿色”动力的代言。去年底发布的《新能源汽车生产准入管理规则》对新能源汽车有准确的定义,指采用非常规的车用燃料作为动力来源(或使用常规的车用燃料、采用新型车载动力装置),综合车辆的动力控制和驱动方面的先进技术,形成的 ...…

查看全部问答>

关于监控用的摄像头用的LED是什么样的?

遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...…

查看全部问答>

wince5.0怎么设置才能实现通过路由上网

最近我刚买一块2440的开发板,跑wince5.0,按照PC机设置wince,连上网线后不能上网!不知道是什么原因。PC机可以通过网线与ARM板通信。ftp和fttp都正常。那我应该怎么样设置或还需要哪些工作才能实现我这块开发板与网络的连接呢。…

查看全部问答>

wince安全性问题

在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...…

查看全部问答>

各位好心人帮忙解决一个usb驱动问题

小弟现在正在做一个Linux下usb鼠标驱动的程序,但编写程序时总是提示找不到linux/usb.h,望大家帮忙指点,岂求ING………

查看全部问答>

【招聘】汇编语言入门图书兼职作者

【招聘】汇编语言入门图书兼职作者 本公司是业内知名IT图书策划出版公司,正在运作一本汇编语言入门相关图书。想征求关于汇编语言的设计高手参与编写。有意者请将个人介绍和联系方式(QQ或MSN)发到本人邮箱macuilhy@sina.cn。…

查看全部问答>

讲了那么多技术,有没有导购的?

                                 要1K STM32f103c8T6,找谁?…

查看全部问答>

u8 sd_raw_get_info(struct sd_raw_info* info)中struct怎么理解

u8 sd_raw_get_info(struct sd_raw_info* info) { …… } 这个子程序怎么用啊,像u8 mmcWrite(u32 sector, u8* buffer)这种,我在主程序中只要定义unsigned char SD_Write1[]={\"0123456789\"}; 就可以用了mmcWrite(SD_Write1); 但是这个定义 ...…

查看全部问答>

TI 电源设计小贴士 9

欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到一 ...…

查看全部问答>