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 + -
显示快捷键?