與pos機相連的windows端測試程序

串口發送的數據的格式  有格式的 長度(2)+數據+0x03+lrc





#include <windows.h>
#include <stdlib.h>
#include <stdio.h>


HANDLE gComHandle;

#define SI      0xf
#define SO      0xe
#define STX     0x02
#define ETX     0x03


void LogToFile(char *fmt,...)
{
	
	va_list pvar;
    char buffer[2048];
    char log[2048];
//	char filename[40];
  //  FILE *fp;
	
//	memset(filename,0,sizeof(filename));
//	sprintf(filename,"%08d.txt",GetDate());
//	fp=fopen(filename,"a");
	
    memset(buffer,0,sizeof(buffer));
    memset(log,0,sizeof(log));
	
    va_start(pvar,fmt);
    vsprintf(buffer,fmt,pvar);
    va_end(pvar);
    
    sprintf(log,"%s",buffer);	
	printf("%s\n",log);
//	fprintf(fp,"%s\n",log);
	
	fflush(stdout);
//	fflush(fp);
	
//	fclose(fp);
	
}





unsigned char GenLrc(unsigned char *Data,size_t DataLen)
{
	unsigned int i;
	unsigned char lrc = 0;
	
	for (i = 0; i < DataLen; i++)
	{
		lrc ^= Data[i];
	}
	
	return lrc;
}



int InitCom(void)
{
	COMMTIMEOUTS TimeOuts;
	DCB dcb;
	
	gComHandle=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
	if(gComHandle==(HANDLE)-1)	
	{	
		LogToFile("打開COM失敗!");
		return -1;	
	}
	
	SetupComm(gComHandle,1024,1024); //輸入緩衝區和輸出緩衝區的大小都是1024
	
//	設定讀超時
	TimeOuts.ReadIntervalTimeout=MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier=MAXDWORD;
	TimeOuts.ReadTotalTimeoutConstant=10000;
	TimeOuts.WriteTotalTimeoutMultiplier=MAXDWORD;
	TimeOuts.WriteTotalTimeoutConstant=10000;
	SetCommTimeouts(gComHandle,&TimeOuts); //設置超時
	
	GetCommState(gComHandle,&dcb);
	dcb.BaudRate=115200; //波特率爲115200
	dcb.ByteSize=8; //每個字節有8位
	dcb.Parity=NOPARITY; //無奇偶校驗位
	dcb.StopBits=ONESTOPBIT; //
	SetCommState(gComHandle,&dcb);
	
	return TRUE;
}

int ComSent(char * packet,int len)
{
	char buf[6];
	BOOL result;
	size_t lens;
	size_t sendlen;
	int i;
	
	buf[0] = STX;
	buf[1] = (unsigned char)(((((len / 1000) % 10) << 4) & 0xf0) | (((len / 100) % 10) & 0x0f));
	buf[2] = (unsigned char)(((((len / 10) % 10) << 4) & 0xf0) | ((len % 10) & 0x0f));
	buf[3] = ETX;
	buf[4] = ETX;
	buf[5] = '\r';
	
	for(i = 0; i < len; i++)
		buf[4] ^= packet[i];
    
	buf[4] ^= buf[1];
	buf[4] ^= buf[2];
	
	
	result=WriteFile(gComHandle,buf,3,&sendlen,NULL);
	//FlushFileBuffers(gComHandle);
	
	if(result==0)
	{
		LogToFile("發送數據失敗1");
		return -1;
	}
	else
	{
		if(sendlen != 3)
			return -1;
	}
	
	result=WriteFile(gComHandle,packet,len,&sendlen,NULL);
	FlushFileBuffers(gComHandle);
	
	
	if(result==0)
	{
		LogToFile("發送數據失敗2");
		return -1;
	}
	else
	{
		if(sendlen != len)
			return -1;
	}
	
	result=WriteFile(gComHandle,buf+3,2,&sendlen,NULL);
	// PurgeComm(gComHandle, PURGE_RXCLEAR | PURGE_RXABORT | PURGE_TXABORT | PURGE_TXCLEAR );
	//FlushFileBuffers(gComHandle);
	
	if(result==0)
	{
		LogToFile("發送數據失敗1");
		return -1;
	}
	else
	{
		if(sendlen != 2)
			return -1;
	}
	
	
	return len;
}



int ComRecv(unsigned char *recvbuf,size_t *recvlen)
{
	size_t len;
	size_t offset;
	BOOL result;
	DWORD recivedlen;
	unsigned char buffer[1024];

START:
	*recvlen=0;
	offset=0;
	memset(buffer,0,sizeof(buffer));

//LogToFile("%s ", "接收STX");
	len=1;
	while(1)	//接收STX
	{
		recivedlen=0;
		result=ReadFile(gComHandle,buffer+offset,len,&recivedlen,NULL);
		if(result==0)
		{
			LogToFile("接收串口報文失敗1");
			return -1;
		}
		else
		{
			if(buffer[0]==0x02)
			{
				len=len-recivedlen;
				offset+=recivedlen;
				if(len==0)
					break;
			}
			else
			{
				if(buffer[0]!=0x00)
				{
					LogToFile("%02x",buffer[0]);
				}
				continue;
			}
		}
	}

//LogToFile("%s ", "接收串口報文2");	
	len=2;
	while(1)
	{
		recivedlen=0;
		result=ReadFile(gComHandle,buffer+offset,len,&recivedlen,NULL);
		if(result==0)
		{
			LogToFile("接收串口報文失敗2");
			return -1;
		}
		else
		{
			len=len-recivedlen;
			offset+=recivedlen;
			if(len==0)
				break;
		}
	}
	
//HexLogToFile(&buffer[1], 2);
//LogToFile("%s ", "接收data");
	len=buffer[1]/16*1000+buffer[1]%16*100+buffer[2]/16*10+buffer[2]%16;
	while(1)
	{
		recivedlen=0;
		result=ReadFile(gComHandle,buffer+offset,len,&recivedlen,NULL);
		if(result==0)
		{
			LogToFile("接收串口報文失敗3");
			return -1;
		}
		else
		{
			len=len-recivedlen;
			offset+=recivedlen;
			if(len==0)
				break;
		}
	}

	//HexLogToFile(&buffer[3], offset-3);
//LogToFile("%s ", "接收ETX");	
	len=1;
	while(1)
	{
		recivedlen=0;
		result=ReadFile(gComHandle,buffer+offset,len,&recivedlen,NULL);
		if(result==0)
		{
			LogToFile("接收ETX失敗");
			return -1;
		}
		else
		{
			if(recivedlen==1)
			{
				len=len-recivedlen;
				if(buffer[offset]!=0x03)
				{
					LogToFile("校驗ETX失敗");
//					return -1;
				}
				offset+=recivedlen;
				if(len==0)
					break;
			}
			else
			{
				len=len-recivedlen;
				offset+=recivedlen;
				if(len==0)
					break;
			}
		}
	}

	//HexLogToFile(&buffer[3], 1);

//LogToFile("%s ", "接收LRC");
	len=1;
	while(1)
	{
		recivedlen=0;
		result=ReadFile(gComHandle,buffer+offset,len,&recivedlen,NULL);
		if(result==0)
		{
			LogToFile("接收LRC失敗");
			return -1;
		}
		else
		{
			if(recivedlen==1)
			{
				len=len-recivedlen;
				if(buffer[offset]!=GenLrc(buffer+1,offset-1))
				{
					LogToFile("校驗LRC失敗");
//					return -1;
				}
				offset+=recivedlen;
				if(len==0)
					break;
			}
			else
			{
				len=len-recivedlen;
				offset+=recivedlen;
				if(len==0)
					break;
			}
		}
	}
	
//	WriteHexLog(buffer+3, offset-5);
	if(memcmp(buffer+3,"\x60\x00\x06\x00\x00",5)!=0  &&
		memcmp(buffer+3,"\x60\x00\x00\x00\x06",5)!=0)
	{
		buffer[offset-1]=0x00;
		buffer[offset-2]=0x00;
	//	WriteHexLog(buffer+3, offset-5);
		LogToFile("%s", buffer+3);
		goto START;
	}
//	LogToFile("%s", "hexbuf");
//	WriteHexLog(buffer, offset);
	len=offset-5;
	memcpy(recvbuf,buffer+3,offset-5);
	*recvlen=len;
	
	return 0;
}




int main(int argc, char * argv[])
{
	size_t recvlen;
	char hostname[20];
	char port[10];
	BYTE TPDU[5];
	BYTE com_recvbuf[1024];
	BYTE buffer[1024];
	int buffer_len;
	int result;
	char str[1024];
	int len;	
	char ch;
	if(InitCom()<0)
		exit(0);
	printf("請輸入工作方式\n發送(s).接收(r)\n");
	scanf("%c",&ch);

	if(ch == 's')
	{
		while(1)
		{
			recvlen=0;
			memset(com_recvbuf,0,sizeof(com_recvbuf));
			memset(buffer,0,sizeof(buffer));	
		
			LogToFile("等待串口上送報文");
			printf("請輸入發送的數據\n");
			scanf("%s",str);
			len =ComSent(str,strlen(str));	
			LogToFile("數據發送成功");
			printf("len = %d\n",len);
		}
	}
	else if(ch == 'r')
	{
		while(1)
		{
			LogToFile("等待串口上送報文");
			ComRecv(com_recvbuf, &recvlen);
		}
	}
		CloseHandle(gComHandle);
	
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章