📄 serialio.cpp
字号:
//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 + -