第六种串口协议实现

发布者:码梦创想最新更新时间: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
下一篇:串口命令解析

推荐阅读最新更新时间:2024-11-10 10:24

STM32-触摸屏实验
void Touch_Init(void);//初始化 u8 Read_ADS(u16 *x,u16 *y); //带舍弃的双方向读取 u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取 u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向) u16 ADS_Read_AD(u8 CMD); //读取AD转换值 void ADS_Write_Byte(u8 num); //向控制芯片写入一个数据 void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点 void Draw_Big_Point(u8 x,u16 y); //画一个大点 voi
[单片机]
STM32片内FLASH被异常改写的问题分享
某STM32客户反馈,当STM32F407V芯片频繁的正常通断电的时候,FLASH 会被非法改写,出现各种各样的异常(整片被擦除、中断向量表被改写、写保护被清除等等)。 经过与跟客户沟通了解到: 1、他们是延续之前的项目,进行的一些软硬件简单修改。之前的项目没有出现过类似的问题。 2、确认通断电的时间是足够,即断电后所有的VDD都回到0;上电的时序也正常。 3、原理图参考了ST相关开发板的参考设计。 4、测量工作电压,除了发觉上电时会有些许抖动外,其它一切正常。尝试让他们改善上电电路,去掉这一抖动。再次实验,仍然出现类似的问题。 根据现象初步判断,异常似乎跟硬件没关联了, 接着对客户代码进行删减又做了如下实验: 1,去掉A
[单片机]
<font color='red'>STM32</font>片内FLASH被异常改写的问题分享
STM32+MS5611测气压温度例程详解,测试无误
硬件平台:STM32F10X + MS5611 + JLink 软件平台:Keil 4 一、基础知识 首先,MS5611是什么? MS5611气压传感器是集合SPI和I²C(高达20 MHz)总线接口的高分辨率气压传感器,分辨率可达到10cm。内部有一个高线性度的 压力传感器 和一个超低功耗的24位AD。 MS5611主要用于智能手机、海拔高度测量和导航辅助,做四轴的朋友一般都了解。 其次,对于飞行器的姿态控制,我们使用GY-86 10DOF 的模块,里面带有MS5611 + MPU6050 + HMC5883,通过IIC协议读取数据进行操作。MS5611挂在MPU5060的从I2C接口上。MS5611的I2C地址为0b111
[单片机]
stm32的推挽输出与开漏输出
首先看以下STM32的GPIO的原理图如下: 当端口配置为输出时: 开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。 输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);此模式可以把端口作为双向IO使用。 推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。
[单片机]
STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法
@STM32踩坑记录(1) 使用的软件及硬件: 硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器 软件平台:keil5 使用的是标准库+freertos。 ##遇到问题时的场景 在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时 ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。 ##:遇到的问题: 因为板载的BMI088上有两个外部中断引脚,分别为INT1
[单片机]
<font color='red'>STM32</font>踩坑记录(1):编写代码时遇到<font color='red'>STM32</font>无法进入外部中断的原因及解决方法
芯片出货达30亿颗 意法半导体STM32要建立强大的生态帝国
  自2007年 意法半导体 在北京发布首款 STM32 产品以来已有10年之久,今年恰逢 STM32 推向市场10周年, STM32 全球出货量已经超过30亿,成为中国第一大微控制器品牌。下面就随半导体小编一起来了解一下相关内容吧。     不止于此,在ST的战略中,最终目标是要打造一个宏伟的战略生态系统,成为产业领导者。近期,STM32家族增加最新成员STM32L4+系列,该系列拥有一流的功耗、先进的图形处理技术以及大容量嵌入式存储器及生态系统,以帮助用户应对物联网的挑战。截至目前,STM32已经有11大产品系列,800余款产品的强大产品阵容,距离构建其生态系统又加了一码。   风雨十年STM32出货量高达30亿颗   
[半导体设计/制造]
ST免费的开发工具让开发者在所有桌面环境使用STM32微控制器
中国,2016年5月24日 横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)为Mac计算机用户推出了STM32微控制器免费开发工具。现在,苹果电脑用户可以以自己的熟悉(及喜爱)的作业环境开发嵌入式设计。 苹果OS X版STM32开发工具支持嵌入式设计全部流程,组件包括STM32CubeMX图形配置工具和System Workbench for STM32 集成开发环境。开发环境所含驱动程序让用户能够直接使用意法半导体的调试和编程工具。开发工具安装简单,容易上手,相当符合OS X用户的预期。 这是继不久前发布Linux版STM32开
[嵌入式]
ST免费的开发工具让开发者在所有桌面环境使用<font color='red'>STM32</font>微控制器
STM32】外部中断概述、寄存器、库函数(EXTI一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 外部中断概述 外部中断(EXTI),和在【STM32】NVIC中断优先级管理(中断向量表) 中讲述的CM3内核的外部中断不同。特指的是,在中断向量表中的EXTI的外部中断。STM32的每个IO都可以作为外部中断输入。 外部中断线 STM32的中断控制器支持19个外部中断、事件请求(也就是19条外部中断线): 线0~15:对应外部IO口的输入中断; 线16:连接到PVD输出; 线17:连接到RTC闹钟事件; 线18:连接到USB唤醒事件。 每条外部中断线可以独立的配置触发方式(上升沿、下降沿或者双边沿触发)、使能/失能
[单片机]
【<font color='red'>STM32</font>】外部中断概述、寄存器、库函数(EXTI一般步骤)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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