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

📄 unit1.cpp

📁 BCB环境下在使用MSCOMM对串口的编程
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
typedef struct Pack_head
        {
                char head[4];
                char addr[2];
                char cmd[2];
                char len[2];
                char sum[2];
        }Pack_Header;

typedef struct pack_body
        {
                char addr_low[2];
                char addr_high[2];
                char length[2];
                char sum[2];
        }Pack_Body;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
if(MSComm1->PortOpen==true)
{
Button1->Enabled=false;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=true;
Shape1->Brush->Color=clGreen;
}
else
{
Button2->Enabled=true;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=false;
Shape1->Brush->Color=clRed;
}
}

void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
        AnsiString str;
        char out[4];
        int len;
        OleVariant s;
        unsigned char buf[2048],Byte;
        if(MSComm1->CommEvent==comEvReceive)
        {
                if(MSComm1->InBufferCount)
                {
                        memset(buf,0,2048);
                        if(ComboBox6->Text=="ASCII")
                        {
                               str=MSComm1->Input;
                               len=str.Length();
                                for(int i=1;i<=len;i++)
                                {

                                        buf[i]=str[i];
                                        Byte=buf[i];
                                        if(ComboBox7->Text=="ASCII")
                                        {
                                        sprintf(out,"%02c",Byte);
                                        }
                                        else
                                        {
                                        sprintf(out,"%02X ",Byte);
                                        }
                                        Memo1->Text=Memo1->Text+(AnsiString)out;
                                }


                        }
                        else
                        {
                                s=MSComm1->Input;
                                len=s.ArrayHighBound(1);
                                for(int i=0;i<=len;i++)
                                {

                                        buf[i]=s.GetElement(i);
                                        Byte=buf[i];
                                        if(ComboBox7->Text=="ASCII")
                                        {
                                        sprintf(out,"%02c",Byte);
                                        }
                                        else
                                        {
                                        sprintf(out,"%02X ",Byte);
                                        }
                                        Memo1->Text=Memo1->Text+(AnsiString)out;
                                }
                        }


                }

        }
}



void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(MSComm1->PortOpen!=true)
        {
        MSComm1->CommPort=StrToInt(ComboBox1->Text);
        MSComm1->Settings=
        ComboBox2->Text+","+
        ComboBox3->Text+","+
        ComboBox4->Text+","+
        ComboBox5->Text;
        MSComm1->PortOpen=true;
        Button1->Enabled=false;
        Button2->Enabled=true;
        Button3->Enabled=true;
        Button4->Enabled=true;
        Shape1->Brush->Color=clGreen;
        }
        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        if(MSComm1->PortOpen!=false)
        {
        MSComm1->PortOpen=false;
        Button1->Enabled=true;
        Button2->Enabled=false;
        Button3->Enabled=false;
        Button4->Enabled=false;
        Shape1->Brush->Color=clRed;
        }
        else
        {
        Button1->Enabled=false;
        Button2->Enabled=true;
        Shape1->Brush->Color=clRed;
        }
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
        Send_Com(0x0102,0x33);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Send(void)
{
        unsigned char OutBuf[256];
        AnsiString chr;
        int i;
        memset(OutBuf,0,256);
        if(ComboBox6->Text=="ASCII")
        {
                MSComm1->InputMode=0;
              //  MSComm1->Output=StringToOleStr(Memo2->Text);
               MSComm1->Output=Memo2->Text;
        }
        else
        {
                MSComm1->InputMode=1;
                chr=Memo2->Text;
                i=String2Hex(chr,OutBuf);
                if(i==(-1))
                        ShowMessage("十六进制数个数错误");
                if(i==(-2))
                        ShowMessage("十六进制数字错误");
                MSComm1->Output=OutBuf;
        }

}
void __fastcall TForm1::Send_Buf(char * buf)
{
        unsigned char OutBuf[256];
        OleVariant TxBuff;
        AnsiString chr;
        int i,j;
        memset(OutBuf,0,256);

     //   ShowMessage(buf);
        if(ComboBox6->Text=="ASCII")
        {
                MSComm1->InputMode=0;
              //  MSComm1->Output=StringToOleStr(Memo2->Text);
               MSComm1->Output=(AnsiString)buf;
        }
        else
        {
                MSComm1->InputMode=1;
                chr=(AnsiString)buf;
                i=String2Hex(chr,OutBuf);
                if(i==(-1))
                        ShowMessage("十六进制数个数错误");
                if(i==(-2))
                        ShowMessage("十六进制数字错误");

                TxBuff = VarArrayCreate(OPENARRAY(int,(0,i-1)),varByte);
                for(j = 0; j < i; j ++) TxBuff.PutElement(OutBuf[j], j);
                MSComm1->Output = TxBuff;

        }


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
        AnsiString filename1;
        SaveDialog1->Filter="Text files (*.txt)|*.txt|All files (*.*)|*.*";
        SaveDialog1->FilterIndex=2;
        if(SaveDialog1->Execute())
        {
                filename1=SaveDialog1->FileName;
                Memo1->Lines->SaveToFile(filename1);
        }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)
{
        MSComm1->InputLen=0;
        MSComm1->InBufferSize=2048;
        MSComm1->OutBufferSize=256;
        MSComm1->SThreshold=0;
        MSComm1->RThreshold=1;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::String2Hex(AnsiString str,unsigned char *senddata)
{
        int hexdata,lowhexdata;
        int hexdatalen=0;
        int len=str.Length();
        if(len&0x01)
             return (-1);
        for(int i=0;i<len;)
        {
                char lstr,hstr=str[i+1];
                i++;
                if(i>=len)
                break;
                lstr=str[i+1];
                hexdata=ConvertHexChar(hstr);
                lowhexdata=ConvertHexChar(lstr);
                if(hexdata==-1||lowhexdata==-1)           //十六进制中有错误的数字
                        return (-2);
                if((hexdata==16)||(lowhexdata==16))
                break;
                else
                hexdata=hexdata*16+lowhexdata;
                i++;
                senddata[hexdatalen]=(unsigned char)hexdata;
                hexdatalen++;
        }
       // ShowMessage((AnsiString)(char *)senddata);
        return hexdatalen;
} 

char __fastcall TForm1::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}


 //-------------------------------------------------------------------------
bool __fastcall TForm1::Send_Com(int Address,int Length)
{
   struct Pack_head Pack_Header;
   struct pack_body Pack_Body;
   AnsiString len,addr,packet,text,Head_len;
   char packet_sum[2],buf[100];
   char buf2[]={0x7F};
   int sum,sum2,sum3;
  /*读取界面上面的参数值   */

   memcpy(Pack_Header.head,Form2->Preamber->Text.c_str(),4);
   memcpy(Pack_Header.addr,Form2->Device_Addr->Text.c_str(),2);
   memcpy(Pack_Header.cmd,Form2->Head_Cmd->Text.c_str(),2);


   /*处理报文正文*/

   sum=Address&255;
   sprintf(Pack_Body.addr_low,"%02X",sum);
   sum2=Address>>8;
   sprintf(Pack_Body.addr_high,"%02X",sum2);
   sprintf(Pack_Body.length,"%02X",Length);
   sprintf(Pack_Body.sum,"%02X",Check_Sum(Pack_Body.addr_low,(sizeof(Pack_Body)-2)));                //生成正文校验和

   sprintf(Pack_Header.len,"%02d",(sizeof(Pack_Body)-2)/2);   //生成报文头的len
   Head_len=AnsiString(Pack_Header.len);
   Form2->Head_Len->Text=Head_len;

   sprintf(Pack_Header.sum,"%02X",Check_Sum(Pack_Header.addr,6));                          //生成报头校验和
   memset(buf,0,100);
   memcpy(buf,&Pack_Header,sizeof(Pack_Header));
   memcpy(buf+sizeof(Pack_Header),&Pack_Body,sizeof(Pack_Body));
   sum3=sizeof(Pack_Header)+sizeof(Pack_Body);
   Send_Buf(buf);
   return true;
}

//-----------------------------------
int __fastcall TForm1::AscToInt(AnsiString StrAsc)
{
        int len,num,sum=0;
        AnsiString  Str;
        StrAsc=StrAsc.UpperCase();
        len=StrAsc.Length();
        for(int i=1;i<(len+1);i++)
        {
              Str = StrAsc.SubString(i,1);
              if(Str>"9")
              {
                 if(Str=="A")
                   num=10;
                 else if(Str=="B")
                   num=11;
                 else if(Str=="C")
                   num=12;
                 else if(Str=="D")
                   num=13;
                 else if(Str=="E")
                   num=14;
                 else if(Str=="F")
                   num=15;
                 else
                   return -1;    //错误的字符
              }
              else
              {
                num=StrToInt(Str);
              }
              sum=sum*16+num;
        }
        return sum;
}

AnsiString __fastcall TForm1::IntToAsc(int num)
{
    int Remain;
    AnsiString Result;
    for(;;)
    {
        Remain=num&0x0F;
        Result=Result.Insert(IntToChar(Remain),1);
        num=num/16;
        if(num==0)
                break;
        else if(num<16)
        {
                Result=Result.Insert(IntToChar(num),1);        
                break;
        }

    }
    return Result;
}

char __fastcall TForm1::IntToChar(int num)
{
const    char IntToChar[]="0123456789ABCDEF";
        return (IntToChar[num]);
}

int __fastcall TForm1::Check_Sum( char * Str,int len)
{
       long int sum=0;
       AnsiString StrStr;
       StrStr=AnsiString(Str);
       if(len&1)
        return -2;     //字串长度是奇数,返回错误
       for(int i=1;i<len;i=i+2)
       {
             sum=sum+AscToInt(StrStr.SubString(i,2));
       }
        return(sum&255);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
        Form2->Show();        
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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