封装

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"windows.h"
#include"time.h"
#include"math.h"

#define BOXNUM 24  //柜子个数

struct BoxState{
	int connect;
	int isOpen;
	int hasGoods;
};

//global variables
BoxState bs[BOXNUM+1];
BoxState newbs[BOXNUM+1];
int expiredSecs = 1;
float tep = 0.00;


//funcation declation
int initMb(HANDLE& mbCom);
int initAll(HANDLE& mbCom);
void setCom(HANDLE& hCom);
void ctMbPort(HANDLE& hCom,unsigned char *sendBuffer,unsigned char *exceptedBuffer,unsigned char *recvBuffer);
void sendMsg(HANDLE& hCom,unsigned char *sendBuffer);
int receive(HANDLE& hCom,unsigned char *recvBuffer);
int receiveMsg(HANDLE& hCom,unsigned char *recvBuffer);
int ifTemp(HANDLE& hCom);
void getAllStatus(HANDLE &hCom, BoxState newbs[BOXNUM]);
int ifBoxStatus(HANDLE &hCom,int &numChanged);
void readBoxStatus(HANDLE &hCom, unsigned char *result);


//local debug funcation 
void printRecv(char * s,unsigned char *b);


void printRecv(char * s,unsigned char *b){
	printf("%s received: ",s);
	for(int i=0;i<7;i++)
		printf("%02x ",b[i]);
	printf("\n");
}


void setCom(HANDLE& hCom)
{
	SetupComm(hCom,100,100); 

	COMMTIMEOUTS TimeOuts;
	
	TimeOuts.ReadIntervalTimeout=MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier=0;
	TimeOuts.ReadTotalTimeoutConstant=0;
	TimeOuts.WriteTotalTimeoutMultiplier=100;
	TimeOuts.WriteTotalTimeoutConstant=500;
	SetCommTimeouts(hCom,&TimeOuts); 
	DCB dcb;
	GetCommState(hCom,&dcb);
	dcb.BaudRate=9600; 
	dcb.ByteSize=8; 
	dcb.Parity=NOPARITY; 
	dcb.StopBits=ONE5STOPBITS; 
	SetCommState(hCom,&dcb);
	PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
}


void sendMsg(HANDLE& hCom,unsigned char lpOutBuffer[7]) 
{
	// TODO: Add your control notification handler code here
	OVERLAPPED m_osWrite;
	memset(&m_osWrite,0,sizeof(OVERLAPPED));
	m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

	DWORD dwBytesWrite=7;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	BOOL bWriteStat;
	ClearCommError(hCom,&dwErrorFlags,&ComStat);
	bWriteStat=WriteFile(hCom,lpOutBuffer,
		dwBytesWrite,& dwBytesWrite,&m_osWrite);

	if(!bWriteStat)
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			WaitForSingleObject(m_osWrite.hEvent,1000);
		}
	}

}

int receive(HANDLE& hCom,unsigned char str[100]) 
{
	// TODO: Add your control notification handler code here
	OVERLAPPED m_osRead;
	memset(&m_osRead,0,sizeof(OVERLAPPED));
	m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

	COMSTAT ComStat;
	DWORD dwErrorFlags;

	//memset(str,'\0',100);
	DWORD dwBytesRead=100;
	BOOL bReadStat;

	ClearCommError(hCom,&dwErrorFlags,&ComStat);
	dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
	bReadStat=ReadFile(hCom,str,
		dwBytesRead,&dwBytesRead,&m_osRead);

	if(!bReadStat)
	{
		if(GetLastError()==ERROR_IO_PENDING)
			//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
		{
			WaitForSingleObject(m_osRead.hEvent,2000);
			//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
			//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
		}
	}
	PurgeComm(hCom, PURGE_TXABORT|
		PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

	return (strlen((const char *)str));
}

int receiveMsg(HANDLE& hCom,unsigned char *recvBuffer)
{
	memset(recvBuffer,'\0',100);
	clock_t start, finish;
	double duration;
	int len =0;
	start = clock();
	while(true)
	{
		len = receive(hCom,recvBuffer);
		if(len>0)
			break;
		finish = clock();
		duration = (double)(finish - start) / CLOCKS_PER_SEC;
		if(duration>expiredSecs)
			break;
	}
	return len;
}


void ctMbPort(HANDLE& hCom,unsigned char sendBuffer[7],unsigned char exceptedBuffer[7],unsigned char recvBuffer[100])
{
	for(int i=0;i<256;i++)
	{
		char comstr[8]="COM";
		char tmp[4];
		sprintf(tmp,"%d",i);
		strcat(comstr,tmp);
		
		hCom=CreateFileA((LPCSTR)comstr,
			GENERIC_READ|GENERIC_WRITE, 
			0, 
			NULL,
			OPEN_EXISTING, 
			FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
			NULL);
		if(hCom!=(HANDLE)-1)
		{
			printf("%s\n",comstr);
			setCom(hCom);	

			sendMsg(hCom,sendBuffer) ;
			
			clock_t start, finish;
			double duration;
			start = clock();
			while(true)
			{
				int len = receive(hCom,recvBuffer);
				if(len>0)
					break;
				finish = clock();
				duration = (double)(finish - start) / CLOCKS_PER_SEC;
				if(duration>expiredSecs)
					break;
			}
			
			//if(!strcmp((const char *)recvBuffer,(const char *)exceptedBuffer))
			if((recvBuffer[0]==exceptedBuffer[0])&&(recvBuffer[6]==exceptedBuffer[6]))
			{
				printf("create main board com port success\n");

				return ;
			}
			CloseHandle(hCom);
		}	
	}
	
}

int initMb(HANDLE& mbCom)
{
	unsigned char sendBuffer[7];
	unsigned char exceptedBuffer[7];
	unsigned char recvBuffer[100];
	memset(sendBuffer,'\0',7);
	memset(exceptedBuffer,'\0',7);
	memset(recvBuffer,'\0',100);

	sendBuffer[0]=0x68;
	sendBuffer[1]=0x00;
	sendBuffer[2]=0xff;
	sendBuffer[3]=0x01;   //lock_init
	sendBuffer[4]=0x00;
	sendBuffer[5]=0x00;
	sendBuffer[6]=0x16;

	exceptedBuffer[0]=0x68;
	exceptedBuffer[6]=0x16;

	recvBuffer[4]=0x00;
	recvBuffer[5]=0x01;

	ctMbPort(mbCom,sendBuffer,exceptedBuffer,recvBuffer);
	if(mbCom==((HANDLE)-1))
		return 0;
		printRecv("initMb",recvBuffer);
	unsigned char low=recvBuffer[4];
	unsigned char high = recvBuffer[5];
	if((low==0x00)&&(high==0x00))
		return 1;
	return 0;
}

int openBox(HANDLE& hCom,int no)
{
	//已经开始开柜状态,则不需重新开柜
	if((no>=0)&&(no<=BOXNUM) && (bs[no].isOpen==1))
		return 1;
	unsigned char sendBuffer[7];
	unsigned char recvBuffer[100];

	sendBuffer[0]=0x68;
	sendBuffer[1]=0x00;
	sendBuffer[2]=0xff&no;
	//printf("%x",sendBuffer[2]);
	sendBuffer[3]=0x02;	//打开柜子
	sendBuffer[4]=0x00;
	sendBuffer[5]=0x00;
	sendBuffer[6]=0x16;

	sendMsg(hCom,sendBuffer) ;

	int len = receiveMsg(hCom,recvBuffer);

	if(len==0)
		return 0;
	printRecv("readTemp",recvBuffer);
	unsigned char low=recvBuffer[4];
	unsigned char high = recvBuffer[5];
	if((low==0x00)&&(high==0x00))
		return 1;
	return 0;
}


unsigned short int readTemp(HANDLE& hCom )
{	//6800ff0601ee16
	unsigned char sendBuffer[7];
	unsigned char recvBuffer[100];

	sendBuffer[0]=0x68;
	sendBuffer[1]=0x00;
	sendBuffer[2]=0xff;
	sendBuffer[3]=0x06;//获取温度
	sendBuffer[4]=0xff;
	sendBuffer[5]=0xff;
	sendBuffer[6]=0x16;

	sendMsg(hCom,sendBuffer);

	int len = receiveMsg(hCom,recvBuffer);

	if(len==0)
		return 0;
	printRecv("readTemp",recvBuffer);
	unsigned char ch[]={recvBuffer[5],recvBuffer[4]};
	unsigned short int temp = 0;
	strncpy((char*)&temp,(const char *)ch,2);
	return temp;
}

int ifTemp(HANDLE& hCom)
{
	float newTep = readTemp(hCom);
	if(abs(newTep - tep)<0.01)
		return 0;
	return 1;
}


void getAllStatus(HANDLE &hCom, BoxState newbs[BOXNUM])
{
	//获取所有的柜子状态
	for(int i=1;i<=BOXNUM;i++)
	{
		unsigned char sendBuffer[7];
		unsigned char recvBuffer[100];

		sendBuffer[0]=0x68;
		sendBuffer[1]=0x00;
		sendBuffer[2]=0xff&i;
		sendBuffer[3]=0x04; //是否开柜
		sendBuffer[4]=0xff;
		sendBuffer[5]=0xff;
		sendBuffer[6]=0x16;

		//1.检查是否开柜。如果收到数据错误,则该柜子连接状态为失败
		sendMsg(hCom,sendBuffer);
		int len = receiveMsg(hCom,recvBuffer);
		if(len == 0)
		{
			newbs[i].connect=0;
			newbs[i].isOpen=0;
			newbs[i].hasGoods=0;
			continue;
		}
		unsigned char high = recvBuffer[5]; //得到高位数据
		if(high==0x00)
			newbs[i].isOpen=1;
		else if(high == 0x01)
			newbs[i].isOpen=0;
		else
		{
			newbs[i].connect=0;
			newbs[i].isOpen=0;
			newbs[i].hasGoods=0;
			continue;
		}

		//2.检查是否有物品。
		sendBuffer[3]=0x05; //是否有物品

		sendMsg(hCom,sendBuffer);
		len = receiveMsg(hCom,recvBuffer);
		if(len == 0)
		{
			newbs[i].connect=0;
			newbs[i].isOpen=0;
			newbs[i].hasGoods=0;
			continue;
		}
		high = recvBuffer[5]; //得到高位数据
		if(high==0x00)
			newbs[i].hasGoods=0;
		else if(high == 0x01)
			newbs[i].hasGoods=1;
		else
		{
			newbs[i].connect=0;
			newbs[i].isOpen=0;
			newbs[i].hasGoods=0;
			continue;
		}

		//如果以上检查都正常,则该柜子连接正常
		newbs[i].connect = 1;
	}
}

int ifBoxStatus(HANDLE &hCom,int &numChanged)
{
	int sum = 0;
	numChanged = -1;
	getAllStatus(hCom,newbs);
	for(int i=0;i<=BOXNUM;i++)
	{
		if((newbs[i].connect==bs[i].connect)&&(newbs[i].isOpen==bs[i].isOpen)&&(bs[i].hasGoods==newbs[i].hasGoods))
			continue;
		else
		{
			sum+=1;
			numChanged = i;
		}
	}
	//更新所有柜子状态,bs永远保存最近的上一次的柜子状态
	//if(sum>0)
	//{
	//	for(int i=0;i<=BOXNUM;i++)
	//	{
	//		bs[i].connect=newbs[i].connect;
	//		bs[i].isOpen = newbs[i].isOpen;
	//		bs[i].hasGoods = newbs[i].hasGoods;
	//	}
	//}
	return sum;
}

void readBoxStatus(HANDLE &hCom, unsigned char *result)
{
	
	int numChanged = -1;
	int total = ifBoxStatus(hCom,numChanged);
	if(0==total)
	{
		result[0]='\0';
	}
	else if(1==total)
	{
		result[0]=0xff00&numChanged;
		result[1]=0x00ff&numChanged;
		result[2]=0xff&newbs[numChanged].connect;
		result[3]=0xff&newbs[numChanged].isOpen;
		result[4]=0xff&newbs[numChanged].hasGoods;
		result[5]='\0';
	}
	else
	{
		int k=0;
		for(int i=0;i<=BOXNUM;i++)
		{
			result[k++]=0xff&newbs[i].connect;
			result[k++]=0xff&newbs[i].isOpen;
			result[k++]=0xff&newbs[i].hasGoods;
		}
		result[k]='\0';
	}
	//更新所有柜子状态,bs永远保存最近的上一次的柜子状态
	if(total>0)
	{
		for(int i=0;i<=BOXNUM;i++)
		{
			bs[i].connect=newbs[i].connect;
			bs[i].isOpen = newbs[i].isOpen;
			bs[i].hasGoods = newbs[i].hasGoods;
		}
	}
}

int initAll(HANDLE& mbCom)
{
	int mbR= initMb(mbCom);
	if(mbR==0)
		return 0;
	
	//init temperature
	tep = readTemp(mbCom );
	//init all box STATUS
	getAllStatus(mbCom,bs); 

	return 1;
}


int main()
{
	HANDLE mbCom=NULL;
	int inRst = initAll(mbCom);
	printf("init:%d \n",inRst);

	printf("open box status:%d\n",openBox(mbCom,23));
	printf("read temp:%d\n" ,readTemp(mbCom ));

	printf("ifTemp:%d\n",ifTemp(mbCom));

	if(mbCom!=((HANDLE)-1))
		CloseHandle(mbCom);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wireshark是一个开源的网络封包分析工具,它可以用于捕获和分析网络数据包。Wireshark支持多种网络协议,并提供了强大的过滤和分析功能,可以帮助用户深入了解网络通信过程中的细节。 在Wireshark中,封装是指将数据包按照特定的格式进行组织和打包,以便在网络中传输和解析。Wireshark支持多种封装格式,常见的封装格式包括以太网封装、IP封装、TCP封装等。 以太网封装是最常见的网络封装格式之一。在以太网封装中,数据包被组织成以太网帧的形式进行传输。以太网帧由目标MAC地址、源MAC地址、类型字段和数据字段组成。Wireshark可以解析以太网帧,并提供了相关的过滤和分析功能。 IP封装是在以太网封装的基础上进行的进一步封装。在IP封装中,数据包被组织成IP数据报的形式进行传输。IP数据报由源IP地址、目标IP地址、协议字段和数据字段组成。Wireshark可以解析IP数据报,并提供了相关的过滤和分析功能。 TCP封装是在IP封装的基础上进行的进一步封装。在TCP封装中,数据包被组织成TCP报文的形式进行传输。TCP报文由源端口号、目标端口号、序列号、确认号和数据字段组成。Wireshark可以解析TCP报文,并提供了相关的过滤和分析功能。 总结来说,Wireshark封装是将网络数据包按照特定的格式进行组织和打包,以便在网络中传输和解析。Wireshark支持多种封装格式,包括以太网封装、IP封装、TCP封装等。通过Wireshark,用户可以深入了解网络通信过程中的细节,并进行相关的过滤和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值