`
anson_xu
  • 浏览: 513009 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

c++ 双线程协议解析 链表 sleep pthread_join g++编译

阅读更多
主类
testlinklist.cpp
#include <stdio.h>
#include "LinkList.h"
#include <pthread.h>
#include <stdlib.h> 
#include <sys/time.h>
#include   <cstring>
#include <string.h>

#include <unistd.h>

using   namespace   std;
//delete data before 0x5a 0xa5,返回数据5a a5的首地址
int slipToHeader(unsigned char *data,int dataLength,unsigned char **ptail){
int i;
int noflag = 1;
for(i=0;i<dataLength;i++){
if(data[i]==0x5a){
noflag = 0;
if(dataLength-(i+1)>0){
if(*(data+i+1)==0xa5){
if(i!=0){
int j;
for(j=i;j<dataLength;j++){
data[j-i]=data[j];
}
dataLength=dataLength-i;
*ptail = (*ptail)-i;
}else{
break;
}
}else{
continue;
}
}else{
dataLength = 1;
data[0] = 0x5a;
*ptail = data+1;
}
}
}
if(noflag==1){
*ptail = data;
dataLength = 0;
}


//char *str1 = "Borland International", *str2 = "nation", *ptr;
//ptr = strstr(str1, str2);
   //printf("The substring is: %s\n", ptr);
return dataLength;

}

//delete data before 0x5a 0xa5,返回数据5a a5的首地址
int cutHandledData(unsigned char *data,int dataLength,int beCutDataLen,unsigned char **ptail){
int i;
for(i=0;i<dataLength;i++){
data[i]=data[i+beCutDataLen];
}
*ptail = (*ptail)-beCutDataLen;
return dataLength - beCutDataLen;
}
void handleProtocol(unsigned char *protocolData,int len){
//spidev_debug_print_msg((char *)__func__, (unsigned char *)protocolData, len);
switch(protocolData[3]){
case 0x80:
//env->CallVoidMethod(obj, method_reportDeviceStatusDisc, 3);
printf ("handleProtocol get 0x80!\n");
break;

case 0xa2:
printf ("handleProtocol get 0xa2!\n");
break;
case 0x83:
printf ("handleProtocol get 0x83!\n");
break;
case 0x99:
printf ("handleProtocol get 0x99!\n");
break;

}
}


void *insertMcuData(void *arg){
printf ("pthread insertData be start!\n");
unsigned char recv_buf[LEN] ={0x5a,0xa5,0x5,0x80,0x00,0x11,0x0,0x6a,0x5a,0xa5,0x12,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c};
unsigned char recv_buf1[LEN] ={0x5a,0xa5,0x7,0x83,0x00,0x00,0x00,0x11,0x0,0x7d};
unsigned char recv_buf2[LEN] ={0x5a,0xa5,0x6,0x99,0x00,0x11,0x0,0x01,0x8c};
LinkList *tempList = NULL;
tempList = (LinkList *)arg;

//memset(recv_buf, 0x00, sizeof(recv_buf));

//while(1){
printf ("pthread insertData1!\n");
//int realLen = android_spidev_read_data(fd,LEN,0,recv_buf);

int realLen = 29;
if(recv_buf!=NULL&&realLen>0){
//LOGE("pthread insertData data_buf len=%d"+strlen(recv_buf));//strlen 计算字符串的长度,end with '\0'.
//sizeof 计算的则是分配的数组 str[11] 所占的内存空间的大小
tempList->EnQueue(recv_buf,realLen);
}
sleep(2);
realLen = 10;
if(recv_buf1!=NULL&&realLen>0){
//LOGE("pthread insertData data_buf len=%d"+strlen(recv_buf));//strlen 计算字符串的长度,end with '\0'.
//sizeof 计算的则是分配的数组 str[11] 所占的内存空间的大小
tempList->EnQueue(recv_buf1,realLen);
}
sleep(2);
realLen = 9;
if(recv_buf1!=NULL&&realLen>0){
//LOGE("pthread insertData data_buf len=%d"+strlen(recv_buf));//strlen 计算字符串的长度,end with '\0'.
//sizeof 计算的则是分配的数组 str[11] 所占的内存空间的大小
tempList->EnQueue(recv_buf2,realLen);
}

sleep(2);
//system("sleep 1");

//}
  return ((void *)0);
}

void *parseMcuProtocol(void *arg){
printf ("pthread parseProtocol be start!\n");
LinkList *tempList = NULL;
tempList = (LinkList *)arg;

if(tempList!=NULL){
unsigned char data[LEN*3];//分配空间
unsigned char tempData[LEN];
int dataLength;
//int a[100];
unsigned char *pa = tempData;
unsigned char *phead=data,*ptail=data;

while(1){
printf ("pthread parseProtocol1!\n");
int tempLength = tempList->DeQueue(&pa);
memcpy(ptail,pa,tempLength);
ptail = ptail+tempLength;
dataLength+=tempLength;
printf("DeQueue ptail tempLength=%d\n",tempLength);
printf("DeQueue ptail dataLength=%d\n",dataLength);
//LOGE("DeQueue ptail point to =0x%x",**ptail);

//for (int i=0; i<dataLength; i++){
// LOGE("DeQueue data before slipToHeader [%d]=0x%x",i,data[i]);
//}

dataLength = slipToHeader(data,dataLength,&ptail);
printf("DeQueue data after slipToHeader dataLength=%d\n",dataLength);
for (int i=0; i<dataLength; i++){
if(i==0)
printf("DeQueue data after slipToHeader \n");
printf("0x%x ",data[i]);
if(i==(dataLength-1))
printf("\n");
}
if(dataLength<4){
//continue;
}else{
//spidev_debug_print_msg((char *)__func__, (unsigned char *)data, dataLength);

int protocolLength = data[2];
int oneProtocolLen = protocolLength+3;
printf("DeQueue data before cutHandledData oneProtocolLen=%d\n",oneProtocolLen);

if(dataLength<oneProtocolLen){
//continue;
}else{
printf("cutHandledData \n");
unsigned char *oneProtocol = new unsigned char[oneProtocolLen];
memset(oneProtocol,0x00,oneProtocolLen);
memcpy(oneProtocol,data,oneProtocolLen);
//when the field copy from data to oneProtocol,then delete field from data
dataLength = cutHandledData(data,dataLength,oneProtocolLen,&ptail);
printf("DeQueue data after cutHandledData dataLength=%d\n",dataLength);
for (int i=0; i<dataLength; i++){
if(i==0)
printf("DeQueue data after cutHandledData \n");
printf("0x%x ",data[i]);
if(i==(dataLength-1))
printf("\n");
}
handleProtocol(oneProtocol,oneProtocolLen);
delete []oneProtocol;
}
}
sleep(2);
}
}

return ((void *)0);
}


int main(void){
pthread_t id1,id2;
void *a1,*a2;
int i,err;
LinkList *dataList = new LinkList;

err=pthread_create(&id1,NULL,insertMcuData,dataList);
if(err!=0){
        printf ("Create pthread error1!\n");
        //exit (1);
    }

err=pthread_create(&id2,NULL,parseMcuProtocol,dataList);

if(err!=0){
       printf ("Create pthread error2!\n");
        //exit (1);
    }
//起第二个线程
//Create monday;
  
//printf("At the first God made the heaven and the earth.\n");
//char* str = "Naming the light, Day, and the dark, Night, the first day.";
//monday.start(str);
//monday.wait();

pthread_join(id1,NULL);
pthread_join(id2,&a2);
//pthread_exit(NULL);



//unsigned char data[1024]={0x5a,0xa5,0x5,0x80,0x00,0x11,0x0,0x6a,0x5a,0xa5,0x12,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c};
//unsigned char *ptail = data;
//int dataLength = 29;
//dataLength = slipToHeader(data,dataLength,&ptail);
//int i;
//for (i=0; i<dataLength; i++){
// printf("DeQueue data after slipToHeader [%d]=0x%x",i,data[i]);
//}
delete dataList;
return 0;
}
链表实现类
LinkList.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "LinkList.h"
#include   <cstring>
using namespace std;
LinkList::LinkList()
{
pList = NULL;
front = NULL;
rear = NULL;
listLength = 0;
InitList();
}
LinkList::~LinkList()
{
if (!DestroyList())
{
  DestroyList();
}
}
//初始化,分配一个头节点。
bool LinkList::InitList()
{
if (!(pList = new LNode))
{
  return false;
}
front = rear = pList;
pList->data = NULL;
pList->dataLength = 0;
pList->next = NULL;
return true;
}
//销毁链表。
bool LinkList::DestroyList()
{
if (!ClearList()) {
  return false;
}

delete pList;
pList = front = rear = NULL;
return true;
}
//判断链表是否为空。若为空,返回true,否则返回false。
bool LinkList::IsEmpty() {
if (pList->next == NULL)
{
  return true;
}
return false;
}
//返回链表的中当前节点数。
int LinkList::GetLength()
{
return listLength;
}
//将链表清空,释放当前所有节点。
bool LinkList::ClearList()
{
if (pList == NULL)
{
  return false;
}
LNode *pTemp = NULL;
while (pList->next != NULL)
{
  pTemp = pList->next;
  pList->next = pTemp->next;
  delete []pTemp->data;
  delete pTemp;
  if(listLength>0){
listLength--;
   }

return true;
}

//新增一个节点到对尾,数据设置为data。
bool LinkList::EnQueue(unsigned char data[],int len)
{
LNode *pTemp = NULL;
if(listLength>MAXLENGTH){
return false;
}
pTemp = rear;
LNode *newNode = new LNode;
newNode->data = new unsigned char[len];
newNode->dataLength = len;
for (int i=0; i<len; i++){
newNode->data[i]=data[i];
//printf("EnQueue data [%d]=0x%x",i,data[i]);
if(i==0)
printf("----------LinkList.cpp EnQueue data \n");
printf("0x%x ",data[i]);
if(i==(len-1))
printf("\n");
//LOGE("EnQueue data [%d]=0x%x",i,data[i]);
}
newNode->next = NULL;
pTemp->next = newNode;
rear = newNode;
listLength++;
printf("----------LinkList.cpp EnQueue data pList->next %p \n",pList->next);
return true;
}

//从队头删除节点
int LinkList::DeQueue(unsigned char **data)
{
printf("----------LinkList.cpp DeQueue data pList->next111 %p \n",pList->next);
if(pList->next==NULL)
return 0;
LNode *pTemp = NULL;
pTemp = pList->next;
//*data = pTemp->data;

//LOGE("DeQueue size of tempLength=%d",sizeof(pTemp->data));
printf("---------LinkList.cpp DeQueue dataLength=%d\n",pTemp->dataLength);
memset(*data,0x00,pTemp->dataLength);
memcpy(*data, pTemp->data, pTemp->dataLength);

if(pTemp->next==NULL){
pList->next = NULL;
rear = pList;
}else{
pList->next = pTemp->next;
}


int tempLength = pTemp->dataLength;

for (int i=0; i<tempLength; i++){
if(i==0)
printf("----------LinkList.cpp DeQueue data \n");
printf("0x%x ",*(*data+i));
if(i==(tempLength-1))
printf("\n");
//printf("DeQueue data [%d]=0x%x",i,data[i]);
//LOGE("DeQueue *data [%d]=0x%x",i,*(*data+i));
}

//data = pTemp->data;
delete []pTemp->data;
delete pTemp;
printf("----------LinkList.cpp DeQueue data pList->next222 %p \n",pList->next);
listLength--;
return tempLength;
}



链表头文件类
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
const int  LEN=512;
const int  MAXLENGTH = 20;
typedef struct LNode
{
unsigned char* data;
int dataLength;
struct LNode *next;
} LNode, *pLinkList;

typedef struct{
pLinkList front;
pLinkList rear;
}LinkQueue;

class LinkList
{
private:
pLinkList pList;
pLinkList front;
pLinkList rear;
int listLength;
public:
LinkList();
~LinkList();
bool InitList();
bool DestroyList();
bool ClearList();
bool IsEmpty();
int GetLength();

bool EnQueue(unsigned char data[],int len);
int DeQueue(unsigned char **data);

};
#endif // LINKLIST_H_INCLUDED

ubuntu下编译
编译
g++ -g LinkList.cpp testlinklist.cpp -o testlinklist -lpthread
./testlinklist
分享到:
评论

相关推荐

    利用一个链表类实现一个队列类和栈类.rar_栈 链表 c++ _链表 类_链表类_队列 类_队列类

    在C++编程语言中,可以使用链表来实现这两种数据结构,因为链表提供了灵活的内存管理和高效的操作。 链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表不需要...

    二叉链表的应用c++代码_二叉链表c++代码_

    本文将深入探讨二叉链表的概念、特点以及如何使用C++编程语言实现其应用。 二叉链表,又称为二叉链式存储结构,是二叉树的一种存储方式。与数组或静态链表不同,二叉链表中的每个节点包含两个指针,分别指向它的左...

    大数计算器_动态链表.zip_c++计算器 链表_大数计算器_大数计算器;动态链表

    在本文中,我们将深入探讨如何使用C++编程语言来实现一个大数计算器,特别是通过动态链表来处理大数的四则运算。动态链表是一种数据结构,它允许我们在运行时根据需要添加或删除节点,这使得它们非常适合处理不确定...

    c++编的双线循环链表

    **C++实现的双向循环链表** 在C++编程中,双向循环链表是一种重要的数据结构,它扩展了单向链表的概念,允许在链表的任一方向上进行前向和后向移动。双向循环链表的每个节点包含两个指针,分别指向其前一个节点和后...

    文件读写入链表.zip_C++链表_数据结构_文件读写_读链表_链表读取文本

    在C++编程中,链表是一种非常重要的数据结构,它在处理动态数据集合时具有很高的灵活性。本项目涉及的核心知识点是使用C++实现链表,并结合文件操作将数据读入链表,以及从链表中读取数据写入文件。下面我们将详细...

    用链表实现多项式_C++_

    在这个场景中,我们讨论的是如何使用C++通过链表来实现多项式的加、减、乘、除运算。首先,我们需要理解链表的基本概念以及如何将其应用到多项式表示上。 链表不同于数组,它不连续存储元素,而是通过节点之间的...

    nmea-0183协议解析C语言链表实现

    在C语言中,通过链表实现对NMEA-0183协议的解析是一种常见且高效的方法,尤其是在处理大量连续到来的数据时。 首先,我们需要理解NMEA-0183协议的基本结构。每个NMEA语句都以"$"开头,以"*"和校验和结尾,中间是...

    C语言链表_Vc_

    本教程“C语言链表_Vc_”聚焦于C语言中的链表操作,是C爱好者深入理解数据结构和算法的重要资源。 链表与数组不同,它不连续存储数据,而是通过节点间的指针链接数据。每个节点包含两部分:数据域,用于存储实际的...

    《数据结构与算法》课程上机实验二(链表)_链表_fruitd55_C++_数据结构与算法_

    本次上机实验主要关注的是链表,一种常用的数据结构,它在C++中有着广泛的应用。链表不同于数组,其元素不是连续存储的,而是通过指针链接起来,这赋予了链表动态调整大小的能力,以及在插入和删除操作上的优势。 ...

    这是基本数据结构及其算法的C++实现,涉及单链表、双链表、栈_、二叉树

    这是基本数据结构及其算法的C++实现,涉及单链表、双链表、栈_、二叉树、并查集、哈夫曼树、平衡二叉树_DataStructure

    lrc.rar_linux 链表_linux歌词解析_歌词_链表 歌词解析

    在IT领域,特别是操作系统如Linux的编程中,链表是一种常用的数据结构,它在各种应用场景中发挥着重要作用,比如在本项目"lrc.rar_linux 链表_linux歌词解析_歌词_链表 歌词解析"中,链表被用来解析和显示歌词。...

    链表_链表_数据结构算法_visualc++_

    在Visual C++环境下,我们可以使用C++语言来实现链表。C++提供了类(class)的概念,使得创建和操作链表变得更为直观和高效。下面我们将详细探讨链表的基本操作和如何使用Visual C++来实现它们: 1. **链表节点定义...

    link_stack_queue.rar_C 链表_C++链表_链表

    在IT领域,数据结构是编程基础中的重要组成部分,而链表、栈和队列是其中最常见也是最重要的三种数据结构。下面将详细讲解这些概念及其在C和C++中的实现。 首先,我们来讨论链表。链表是一种线性数据结构,与数组...

    数据结构C++版的双循环链表

    在这个"数据结构C++版的双循环链表"项目中,我们将深入探讨这个主题。 双循环链表与普通单链表的主要区别在于,每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得在链表中的...

    数据链表演示程序.rar_VC 链表_datachain_vc dos_数据结构 演示_链表 演示

    数据链表是计算机科学中数据结构的一个重要组成部分,它在编程中扮演着不可或缺的角色。本压缩包中的"数据链表演示程序"是一个基于VC++ 6.0开发的DOS界面应用,旨在帮助用户理解并可视化数据链表的工作原理。通过这...

    ATM.rar_atm_atm c++链表实现_atm in matlab_bank teller simulati_c++

    在这个特定的项目中,开发者使用了C++编程语言,并且选择了链表作为数据结构来存储客户信息。链表的选择允许程序在运行时动态地增加或减少客户数量,而无需预先定义固定的客户数组大小,这体现了链表在处理动态数据...

    C++(数据结构):链表

    C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 C++(数据结构):链表 ...

    仓库管理系统_C语言_C++_数据结构_链表_课程设计

    该系统涉及到了数据结构中的链表知识。下面我们将基于这些信息展开详细的解释与知识点的梳理。 ### 一、仓库管理系统的基本概念 仓库管理系统(Warehouse Management System, WMS)是一种专门用于仓库或物流中心进行...

    C++实现链表模板(链表项的数据元素可以为任意类型):链表项的插入、删除、链表的打印、两个链表的连接VS2010

    在C++编程中,链表是一种非常重要的数据结构,它不同于数组,不连续存储数据,而是通过节点间的指针链接起来。在这个项目中,我们利用C++的模板类来实现一个通用的链表,允许链表项的数据元素可以是任意类型。这极大...

    链表相关编程.rar_逆向_链表_链表合并_链表的合并

    在给定的编程实现中,"vc程序"可能指的是使用C++编程语言,C++支持面向对象特性,可以通过定义结构体(struct)来表示链表节点,使用指针作为成员变量来实现链表的连接。通过编写相应的函数,如`reverseList`和`...

Global site tag (gtag.js) - Google Analytics