历史上的今天
今天是: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; } 运行效果:
下一篇:串口命令解析
史海拾趣
|
遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...… 查看全部问答> |
|
最近我刚买一块2440的开发板,跑wince5.0,按照PC机设置wince,连上网线后不能上网!不知道是什么原因。PC机可以通过网线与ARM板通信。ftp和fttp都正常。那我应该怎么样设置或还需要哪些工作才能实现我这块开发板与网络的连接呢。… 查看全部问答> |
|
在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...… 查看全部问答> |
|
【招聘】汇编语言入门图书兼职作者 本公司是业内知名IT图书策划出版公司,正在运作一本汇编语言入门相关图书。想征求关于汇编语言的设计高手参与编写。有意者请将个人介绍和联系方式(QQ或MSN)发到本人邮箱macuilhy@sina.cn。… 查看全部问答> |
|
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); 但是这个定义 ...… 查看全部问答> |
|
欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到一 ...… 查看全部问答> |




