⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialio.cpp

📁 用vc写的非常简单的小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//2004\06\11

// Serialio.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "Serialio.h"
#include <time.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			InputLength = 0;
			IniFlag = -1;
			break;
		case DLL_PROCESS_DETACH:
			CloseHandle(my_hCommFile);
			break;
    }
    return TRUE;
}


// This is an example of an exported variable
//SERIALIO_API int nSerialio=0;

// This is an example of an exported function.
//SERIALIO_API int fnSerialio(void)
//{
//	return 42;
//}

// This is the constructor of a class that has been exported.
// see Serialio.h for the class definition
//CSerialio::CSerialio()
//{ 
//
//	return; 
//}


int SerialINI(int port)
{

	if(!SetupCOMM(port))
		return -1;	//	-1 = 串口初始化错
	//TC35初始化
	if(!Tc35Ini())
	{
		IniFlag = -1;
		CloseHandle(my_hCommFile);
		return -2;	//  -2 = TC35T初始化错
	}
	else
	{
		MsgAmount = 5;
//		Delay(1000);
//		MsgAmount = GetMsgAmount(0);
		return 1;
	}
}

char* ReadMessage(int index)
{
	int	TEST;

	PurgeComm(my_hCommFile, PURGE_RXCLEAR);	//clear receive buffer
	TEST = Tc35Read(index);
	if(TEST == -2)
	{
		memcpy(Getmsg, "EMPTY!", 6);
	}
	if(TEST < 0)
	{
		switch(TEST)
		{
		case -1:
			MessageBox(NULL, "非法ID\n","接收数据错误", MB_ICONERROR);
			break;
		case -3:
			MessageBox(NULL, "读写TC35i错\n","接收数据错误", MB_ICONERROR);
			break;
		case -4:
			MessageBox(NULL, "非法格式\n","接收数据错误", MB_ICONERROR);
			break;
		case -5:
	        MessageBox(NULL, "第二标志错\n","接收数据错误", MB_ICONERROR);
			break;
		case -6:
	    	MessageBox(NULL, "最后数据长度错\n","接收数据错误", MB_ICONERROR);
			break;
		case -7:
	    	MessageBox(NULL, "第一数据长度错\n","接收数据错误", MB_ICONERROR);
			break;
		case -8:
	    	MessageBox(NULL, "短信长度错\n","接收数据错误", MB_ICONERROR);
			break;
		}
		memcpy(Getmsg, "FALSE!", 6);
		memcpy(&Getmsg[6], &inBuffer[57], 32);
	}
	return Getmsg;
}

char* WriteMessage(char* outstring)
{
	if(!Tc35Send(outstring))
	{
		memcpy(Getmsg, "FALSE!", 6);
	}
	else
	{
		memcpy(Getmsg, "OK!", 3);
	}
	return Getmsg;
}

int GetMsgAmount(void)
{

	if((ID = Tc35NewMsg()) < 0)
		return 0;
	else
	{
		MsgAmount = ID;
		return ID;
	}
}

char* GetMsgID(int type)
{
char *idbuf;

	if((idbuf = Tc35GetMsgs(type)) == NULL)
	{
		memcpy(Getmsg, "No!", 3);
		return Getmsg;
	}
	else
		return idbuf;
}

BOOL Tc35Ini()
{
//设置TC35T握手方式
	if(!WriteCOMM((BYTE*)SetCts, _mbstrlen(SetCts)))
		return FALSE;
//设置TC35T回应方式
	if(!WriteCOMM((BYTE*)Setecho, _mbstrlen(Setecho)))
		return FALSE;
//设置TC35T文本方式
	if(!WriteCOMM((BYTE*)SetText, _mbstrlen(SetText)))
		return FALSE;
	Delay(200);	
	if(!ReadCOMM(inBuffer))
		return FALSE;
	if(SearchStr((char*)inBuffer,"OK") < 0)
	{
		return FALSE;
	}
	EmptyBuffer(inBuffer, 4096);
	return TRUE;
}

//
//上位机传送的数据格式:pddd...ddd@NNNNNNNNCCCCCCCC
//ddd...dddd   接收机的电话号码
//NNNNNNNN     表号
//CCCCCCCC	   购买码
//
BOOL Tc35Send(char *str)
{
char *cp;

	msg[0] = 0;
	if(toupper(*str) != 'P')		//检查标志P和@
	{
//		MessageBox(NULL, "标志P错!\n","发送数据错误", MB_ICONERROR);
		return FALSE;
	}
	cp = (char*)memchr(str, '@', 15);
	int l = strlen((cp+1));
	if(cp == 0)
	{
//		MessageBox(NULL, "标志@错!\n","发送数据错误", MB_ICONERROR);
		return FALSE;				//标志错
	}
	else if(l != 16)  	//检查数据长度
	{
//		MessageBox(NULL, "数据长度超范围!\n","发送数据错误", MB_ICONERROR);
		return FALSE;				//长度错
	}
////生成拨号命令
	strcat(msg,SendMsg);			
	memcpy(&msg[8], (str+1), (cp - str) - 1);
	msg[(cp - str) + strlen(SendMsg) - 1] = 0;
	strcat(msg,"\r\n");
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
		return FALSE;				//读写TC35T错
////检查TC35T回应,生成传送数据"*nnnnnnnn*CCCCCCCC"
	if(SearchStr((char*)inBuffer,"> ") > 0)
	{
		memcpy(&msg[0], (cp+1), 8);
		memcpy(&msg[8], "*", 1);
		memcpy(&msg[9], (cp+9), 8);  //17位ASCII码
//		outstring[0] = MakeCheckCode((BYTE*)(msg), 18);
//		outstring[1] = 0;			  //生成校验字
//		BCDtoASC(outstring,1);
//		memcpy((msg + 18), cs, 2);
		memcpy((msg + 17), "\x1a\r\n\0", 4);

		WriteCOMM((BYTE*)msg, _mbstrlen(msg));
		Delay(10000);
		ReadCOMM(inBuffer);
		if(SearchStr((char*)inBuffer,"OK") < 0)
		{
//			MessageBox(NULL, "发送无回应\n","发送数据错误", MB_ICONERROR);
			return FALSE;				//TC35T无回应
		}

	}
	else
	{
//			MessageBox(NULL, "TC35T无回应\n","发送数据错误", MB_ICONERROR);
			return FALSE;				//TC35T无回应
	}
	return TRUE;
}

//读成功,GetMesag的内容为“pnnn...nn@NNNNNNNNRRRRRRRRBBB”
//其中:nnn...nnn = 发送方的手机号
//      NNNNNNNN  = 表号
//      RRRRRRRR  = 返回码
//      BBB       = 购买量
BOOL Tc35Read(int index)
{
char *str,ch[3];
int cp1,cp2,a,endflag;
void *r1, *r2;

char test[] = "003100320033003400350036003700380025003100320033003400350036003700380025003100320033";

	Filter_z(test, 84, 1);


	str = Getmsg; 
	msg[0] = 0;
////生成读命令
	strcat(msg,ReadMsg);
	if(index == 0)					//非法ID
	{
//		MessageBox(NULL, "非法ID\n","接收数据错误", MB_ICONERROR);
		return -1;
	}
	strcat(msg,itoa(index,ch,10));
	strcat(msg,"\r");
	if(!ReadWriteTc35t(5, (BYTE*) msg, inBuffer))
		return -3;				//读写TC35T错

////搜索标志r1=短信正文起始地址;endflag=短信正文长度
	r1 = (char*)memchr(&inBuffer[2],'\n',70) + 1;
	if(r1 <= &inBuffer[2])
		return -4;
	endflag = SearchStr((char*)r1,"OK");
	if(endflag < 25)
	{
		return -2;						//非法数
	}
	else if(endflag >  25)
	{
		///将NOKIA手机短信格式整理成标准格式
		Filter_z((char*)r1, endflag, Model);
		///检查第一个标志
		r2 = (char*)memchr(r1,'#',20) ;
		a =(char*)r2 - (char*)r1; 
		///检查第二个标志和第一个数据长度
		if((a != 8 ) || (*((char*)r2+9) != '#'))
		{
	    ///	MessageBox(NULL, "第二标志错!\n","接收数据错误", MB_ICONERROR);
			return -5;
		}
		///检查最后一个数据长度
		if(SearchStr((char*)((char*)r2 + 9),"\r\n") != 4)
		{
	    ///	MessageBox(NULL, "数据长度错!\n","接收数据错误", MB_ICONERROR);
			return -6;
		}
	}
	else
	{
		///检查第一个标志
		r2 = (char*)memchr(r1,'#',20) ;
		a =(char*)r2 - (char*)r1; 
		///检查第二个标志和第一个数据长度
		if((a != 8 ) || (*((char*)r2+9) != '#'))
		{
	    ///	MessageBox(NULL, "第二标志错!\n","接收数据错误", MB_ICONERROR);
			return -5;
		}
		///检查最后一个数据长度
		if(SearchStr((char*)((char*)r2 + 9),"\r\n") != 4)
		{
	    ///	MessageBox(NULL, "数据长度错!\n","接收数据错误", MB_ICONERROR);
			return -6;
		}

	}
	if(a != 8)
	{
//		MessageBox(NULL, "头标志错!\n","接收数据错误", MB_ICONERROR);
//		Tc35DelMsg(index);
		return -7;						//非法数据格式,删除该条信息
	}
	if(endflag > 0)
	{
////////提取地址,cp1+2指向地址起始点,cp2指向地址终止点
		cp1 = SearchStr((char*)inBuffer,",\"");
//		cp2 = SearchStr((char*)(inBuffer+cp1),"\",,");
		cp2 = SearchStr((char*)(inBuffer+cp1),"\",");
		*str++ = 'p';
		memcpy(str, (inBuffer+cp1+2), cp2-2);
		memcpy(str+cp2-2, "@\0", 2);
////////提取有效数据,cp1+1指向数据起始点,cp2指向数据终止点
		memcpy(outstring, r1, 8);
//		memcpy((outstring + 8), ((char*)r2 + 1), 8);
//		memcpy((outstring + 16), ((char*)r2 + 10), 3);
//		memcpy((outstring + 19), "\0", 1);
		memcpy((outstring + 8), ((char*)r2), 9);
		memcpy((outstring + 17), ((char*)r2 + 9), 4);
		memcpy((outstring + 21), "\0", 1);
		strcat(str, (char*)outstring);		//outstring = 有效数据
//		Tc35DelMsg(ID);
		ID--;
		return TRUE;
	}
	else
	{
		return -8;				//读写TC35T错
	}

}

int Filter_z(char* sa, int length, int Model)
{
 char* cp;
 char  ch;

	cp = sa;
	if(Model == 1)
	{
		for(int i = 0; i < length - 4; i+=4)
		{
			ch = *(cp +i +2) & 0x0f;
			ch = ch << 4;
			ch = ch | (*(cp +i + 3) & 0x0f);
			*sa++ = ch;
		}
		*sa++ = 0x0d;
		*sa = 0x0a;
	}
	else
	{
		for(int i = 1; i < length - 3; i+=2)
		{
			*sa++ = *(cp+i);
		}
		*sa++ = 0x0d;
		*sa = 0x0a;
	}
	return 0;
}

int Tc35DelMsg(int index)
{
char ch[3];

	msg[0] = 0;
////生成命令
	strcat(msg,DelMsg);
	strcat(msg,itoa(index,ch,10));
	strcat(msg,"\r");
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
		return -1;				//读写TC35T错
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
////检查回应
	if(SearchStr((char*)inBuffer,"OK") > 0)
	{
//		ID--;
//		index = ID;
		return 1;
	}
	else
		return 0;
}

char* Tc35GetMsgs(int MsgType)
{
int num = 0 , m;
int len = 3000;
int length = 1000;
int id = -1, n = 0;;
char *sp, *dp;
char ss[8];

	msg[0]=0;
	strcat(msg,ListMsgs);
	switch( MsgType)		//选择信息类型
	{
	case	0:
	case	1:
		strcat(msg,"=ALL\r");
		break;
	case	2:
//		strcat(msg,"=REC UNREAD\r");
		strcat(msg,"\r");
		break;
	default:
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
	memcpy(ss,"CMGL:\0",6);		//"CMGL:"要检索的标志串
	WriteCOMM((BYTE*)msg, _mbstrlen(msg));
//	Delay(2500);				//延时2.5秒
	Delay(500 * MsgAmount);	
	ReadCOMM(inBuffer);
	sp = (char*)inBuffer;
	if(InputLength < 10)
	{
		MsgAmount = 0;
		id = 0;
		return NULL;
	}
	else
	{
		len = InputLength;
	//	id = MsgAmount;
		id = 0;
	}
//	while(id > 0)
	while(( m = SearchStr(sp, "OK")) != -1)
	{
//		dp = (char*)memchr(sp, ss[0], len);	//定位
		int pp = SearchStr(sp, ss);	//定位
		if( pp != -1)
			dp = sp + pp;
		else
			dp = sp + m;
		if(dp == 0)
			break;
//		id = memcmp(ss, dp, strlen(ss));	//比较
		id++;
		len = InputLength - (dp -(char*)inBuffer); //总长度-已搜索过的长度
		if( pp != -1)
		{
			num ++;
			ids[n++] = *(dp + 6);
			ids[n++] = *(dp + 7);
			if(*(dp + 8) != '"')
			{
				ids[n++] = *(dp + 8);	//序号填入ids数组
			}
		}
		sp = dp + 1;					//准备下一次搜索
	}
	ids[n - 1] = '>';
	ids[n] = 0;
	itoa(num, ss, 10);
	strcat(ids,ss);
	return ids;
}

int	Tc35NewMsg()
{
	msg[0] = 0;
	strcat(msg,NewMsgs);
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
		return -1;				//读写TC35T错
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
	int p = SearchStr((char*)inBuffer,"\",");
	if(p > 0)
	{
		int p1 = SearchStr((char*)(inBuffer + p + 2), ",");
		inBuffer[p+p1+2] = 0;
		ID = atoi((char*)&inBuffer[p + 2]);
		return ID;
	}
	else
		return -1;
}

char* Tc35CID(char* str)
{
	msg[0] = 0;
	strcat(msg,CIDMsg);
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
	int p = SearchStr((char*)inBuffer,": ");
	if(p > 0)
	{
		int p1 = SearchStr((char*)(inBuffer + p + 2), "\r");
		inBuffer[p+p1+2] = 0;
		memcpy(str,(char*)&inBuffer[p+2], p1);
		memcpy((str+p1),"\0", 1);
		return str;
	}
	else
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
}

char* Tc35Made(char* str)
{
	msg[0] = 0;
	strcat(msg,MadeOfMsg);
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
	int p = SearchStr((char*)inBuffer,"\r\n");
	if(p >= 0)
	{
		int p1 = SearchStr((char*)(inBuffer + p + 2), "\r");
		inBuffer[p+p1+2] = 0;
		memcpy(str,(char*)&inBuffer[p+2], p1+1);
		return str;
	}
	else
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
}

char* Tc35Model(char* str)
{
	msg[0] = 0;
	strcat(msg,ModelMsg);
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
	int p = SearchStr((char*)inBuffer,"\r\n");
	if(p >= 0)
	{
		int p1 = SearchStr((char*)(inBuffer + p + 2), "\r");
		inBuffer[p+p1+2] = 0;
		memcpy(str,(char*)&inBuffer[p+2],p1+1);
		if(!strcmp(str,"TC35"))
		{
			Model = 0;
		}
		else if(!strcmp(str,"TC35i"))
		{
			Model = 1;
		}
		return str;
	}
	else
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
}

char* Tc35Ver(char* str)
{
	msg[0] = 0;
	strcat(msg,VerMsgs);
	if(!ReadWriteTc35t(1, (BYTE*) msg, inBuffer))
	{
		memcpy(Getmsg, "FALSE!", 6);
		return Getmsg;
	}
//	ReadWriteTc35t(1, (BYTE*) msg, inBuffer);
	int p = SearchStr((char*)(inBuffer+1),"\r\n");
	if(p > 0)
	{
		inBuffer[p+1] = 0;
		memcpy(str,(char*)&inBuffer[2], p);
		return str;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -