umain.cpp
来自「cb下的串口通讯、短信收发(适于初学者)」· C++ 代码 · 共 430 行
CPP
430 行
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include "UMain.h"
#include "Uset.h"
#include <inifiles.hpp>
HANDLE Hcom;
DCB lpDcb;
char recchar;
AnsiString Pdu;
char atcmgl[]="AT+CMGL=4";//9
char atcmgs[] = "AT+CMGS=140" ; /* 11 */
char atcmgd[]="AT+CMGD=";//8
//char atcmgs[]="AT+CMGS=140";
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm_Main *Form_Main;
//---------------------------------------------------------------------------
__fastcall TForm_Main::TForm_Main(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::FormCreate(TObject *Sender)
{
Hcom=CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
//hCom = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,
// NULL,OPEN_EXISTING,0,NULL);
if (Hcom==INVALID_HANDLE_VALUE)
{
MessageBox(Handle,"串口打开错,请检查!","系统提示",0);
return;
}
SetupComm( Hcom,20480,20480 );
COMMTIMEOUTS gCommTimeOuts ;
gCommTimeOuts.ReadIntervalTimeout = 50 ;
gCommTimeOuts.ReadTotalTimeoutMultiplier = 100 ;
gCommTimeOuts.ReadTotalTimeoutConstant = 100 ;
gCommTimeOuts.WriteTotalTimeoutMultiplier = 500 ;
gCommTimeOuts.WriteTotalTimeoutConstant = 500 ;
SetCommTimeouts( Hcom,&gCommTimeOuts ) ;
GetCommState(Hcom,&lpDcb);
lpDcb.BaudRate=19200;
lpDcb.Parity=NOPARITY;
lpDcb.ByteSize=8;
lpDcb.StopBits=ONESTOPBIT;
SetCommState(Hcom,&lpDcb);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//英文PDU编码
AnsiString TForm_Main::EncodeEnglish(AnsiString s)
{
int i,j,len,cur;
String temp;
String t;
len=s.Length();
i=0;
j=0;
while (i<=len)
{
if (i<len)
cur=(s[i] >>j) |(( s[i+1]<<(7-j)) & 0xFF);
else
cur=s[i]>>j & 0x7F;
temp=IntToHex(cur,2);
t=t+temp;
return t;
}
/*
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
t:=intTohex(cur,2);
//FmtStr(t,'%2.2X',[cur]);
Result:=Result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;if j=0 then inc(i);
end;
end;
*/
}
//----------------------------------------------------------------------------
//中文PDU编码
AnsiString TForm_Main::EncodeHZ(WideString s)
{
/*
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
//BCD转换
//FmtStr(t,'%4.4X',[cur]);
t:=inttohex(cur,4);
Result:=Result+t;
inc(i);
end;
end*/
int i,len,cur;
AnsiString temp,t="";
len=s.Length();
i=1;
while (i<=len)
{
cur=Word(s[i]);
temp=IntToHex(cur,4);
t=t+temp;
i++ ;
}
return t;
}
//---------------------------------------------------------------------------
long int TForm_Main::SendChar(char c)
{ unsigned long writen;
WriteFile(Hcom,&c,1,&writen,NULL);
return writen;
}
//---------------------------------------------------------------------------
long int TForm_Main::ReadChar(char *c)
{ unsigned long readed;
ReadFile(Hcom,c,1,&readed,NULL);
return readed;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void __fastcall TForm_Main::BtnSendClick(TObject *Sender)
{
// 闪烁短信:0891683108200005F0B1040B813161886491F7001AOB080001621172314F60
// 免提加闪烁:0891683108200005F0B1040B813161886491F70018OB080001621172314F60
//char test[]="0891683108200005F0B1040B813161886491F7001AOB080001621172314F60";
AnsiString SendStr;//原始信息
AnsiString DsendStr;//编码后的PDU
AnsiString PDU_Head="0891";
AnsiString PDU_Head1="B1040B81";
AnsiString PDU_Freehand="0018OB";
AnsiString PDU_Normal="001AOB";
AnsiString PDU_Test="0891683108200005F0B1040B81";
AnsiString Sim;
AnsiString PDU;
TIniFile *temini=new TIniFile(ExtractFilePath(ParamStr(0))+"smsc.ini");
AnsiString smsc=temini->ReadString("Smsc","SMC","")+'F';
temini->Free();
char tempss;
for(int is=1;is<=13;is+=2)
{
tempss=smsc[is];
smsc[is]=smsc[is+1];
smsc[is+1]=tempss;
}
//ShowMessage(smsc);
SendStr=Trim(Memo_Info->Text);
if (RadioButton_Chinese->Checked )
{
wchar_t ws[300];
StringToWideChar(SendStr,ws,300);
DsendStr=EncodeHZ(ws);
}
else
DsendStr=EncodeEnglish(SendStr);
Sim=Trim(Edit_Num->Text);
char tempN;
for (int js=1;js<10;) //半8位编码(短信中心和发送目的地手机SIm卡号都采用此编码方式)
{
tempN=Sim[js];
Sim[js]=Sim[js+1];
Sim[js+1]=tempN;
js=js+2;
}
tempN=Sim[11];
Sim[11]='F';
Sim.SetLength(12);
Sim[12]=tempN;
PDU=PDU_Head+smsc+PDU_Head1+Sim;
if (CheckBox_Flash->Checked )
{
DsendStr="0001"+DsendStr;
}
if (CheckBox_Freehand->Checked)
PDU=PDU+PDU_Freehand;
else
PDU=PDU+PDU_Normal;
int slen=DsendStr.Length();
slen=slen/2;
PDU=PDU+IntToHex(slen,2)+DsendStr;
unsigned long writen;
for (int i=0;i<11;i++)
SendChar(atcmgs[i]);
SendChar(0x0d);
SendChar(0x0a);
Sleep(300);
AnsiString stemp;
char c;
int n=20;
while (n>0)
{
ReadChar(&c);
stemp=stemp+c;
if (c=='>') break;
n--;
if (n==0 ) break;
}
Memo1->Lines->Add(stemp) ;
Memo1->Lines->Add("PDU:"+PDU) ;
if (n)
{
int sslen=PDU.Length();
for (int j=1;j<=sslen;j++)
{
SendChar(PDU[j]);
}
SendChar(0x1a);
SendChar(0x0d);
SendChar(0x0a);
int ii=0; char ss,stemp1;
while (true)
{
ReadChar(&ss);
if ((stemp1=='O') && (ss=='K'))
{
Memo1->Lines->Add("发送成功");
break;
}
stemp1=ss;
ii++;
if (ii==400) break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
for (int i=0;i<9;i++)
SendChar(atcmgl[i]);
SendChar(0x0d);
SendChar(0x0a);
int n=20;
char pdu[400];
char gpsstate[20];
char b;
while (n)
{
int nn=20;
char s;
int j=0;
while (nn)
{
s=ReadChar(&b);
if (s)
gpsstate[j]=b;
else
nn--;
if (b==0x0a ) break;
j++;
}
if ((gpsstate[0]=='+') && (gpsstate[1]=='C')&& (gpsstate[2]=='M') && (gpsstate[3]=='G') && (gpsstate[4]=='L'))
{
int jj=0;
while (true)
{
s=ReadChar(&b);
if (s)
pdu[jj]=b;
if (b==0x0d)
{
pdu[jj]='\0';
break;
}
jj++;
}
// Memo1->Lines->Add("PDU:"+AnsiString(pdu));
int smsclen,simlen;
char smsc[20],sim[20],tm[20];
smsclen=StrToInt("0x0"+AnsiString(pdu[0]))*16+StrToInt("0x0"+AnsiString(pdu[1]));
smsclen=smsclen*2-2;
int ismsc;
for(ismsc=0;ismsc<smsclen; ismsc++)
smsc[ismsc]=pdu[ismsc+4];
char temp;
for (int sm=0;sm<20;)
{
temp=smsc[sm];
smsc[sm]=smsc[sm+1];
if (temp=='F')
smsc[sm+1]='\0';
else
smsc[sm+1]=temp;
sm=sm+2;
}
smsc[smsclen]='\0';
Memo1->Lines->Add("短信中心:"+AnsiString(smsc));
int simlenpos=smsclen+6;
simlen=StrToInt("0x0"+AnsiString(pdu[simlenpos]))*16+StrToInt("0x0"+AnsiString(pdu[simlenpos+1]));
if (simlen>20)
{
simlenpos=simlenpos+2;
simlen=StrToInt("0x0"+AnsiString(pdu[simlenpos]))*16+StrToInt("0x0"+AnsiString(pdu[simlenpos+1]));
}
for (int sims=0; sims<=simlen; sims++)
sim[sims]=pdu[simlenpos+sims+4];
sim[simlen+1]='\0';
char tem;
for (int sm=0;sm<20;)
{
tem=sim[sm];
sim[sm]=sim[sm+1];
if (tem=='F')
sim[sm+1]='\0';
else
sim[sm+1]=tem;
sm=sm+2;
}
sim[simlen]='\0';
Memo1->Lines->Add("短信来源:"+AnsiString(sim));
int sss=simlenpos+simlen+23;
int sslen;
sslen=StrToInt("0x0"+AnsiString(pdu[sss]))*16+StrToInt("0x0"+AnsiString(pdu[sss+1]));
sslen=sslen*2;
char ppdu[200];
// for (int ssinfo=0;ssinfo<sslen;sslen++)
//pdu=pdu+sss+2;
strcpy(ppdu,pdu+sss+2);
wchar_t wz[100];
AnsiString hzun=ppdu;
int hzcout=0;
//int iii=0;
for(int iii=0;iii<sslen;iii+=4)
{
AnsiString stemp;
stemp=hzun.SubString(iii+1,4);
if (stemp=="") break;
wz[hzcout]=StrToInt("0x"+stemp);
hzcout++;
//iii=iii+4;
}
wz[hzcout]='\0';
AnsiString sinfo1=WideCharToString(wz);
Memo1->Lines->Add("content:"+sinfo1);
Memo1->Lines->Add("--------------------------------");
}
n--;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button3Click(TObject *Sender)
{
Form_Set=new TForm_Set(this);
Form_Set->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button2Click(TObject *Sender)
{
char b;
char temp;
Memo1->Lines->Clear();
for (int i=1;i<=20;i++)
{
for (int sd=0;sd<8;sd++)
SendChar(atcmgd[sd]);
SendChar(char(i+0x30));
SendChar(0x0d);
SendChar(0x0a);
while (1)
{
ReadChar(&b);
temp= b;
if ((temp='E')&& (b=='R'))
break;
if ((temp='O')&& (b=='K'))
{
Memo1->Lines->Add("第"+IntToStr(i)+"条已被删除!");
break;
}
}
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?