📄 unit1.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 + -