📄 ceshi.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ceshi.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
static int SavePointer=0;
int RVBUF[1024];
int rvbuf[1024];
int sdbuf[1024];
int send[256];
int t_length;
int sdbt;
int sdbh;
int rvbt;
int rvbh;
int RVBH;
int sd_frame[256];
int NS, NR, VS, VR;
int TBL, TBF, TCB, TEC;
int RCB, RV_ERR;
int RBS;
int jishu;
int jishu1;
int ceshi;
int timenum;
int rv_state;
int asd;
int rej1;
int rej2;
int rej3;
int edc;
bool xianshi;
bool fasong = true;
OleVariant TxBuff;
OleVariant RxBuff;
/////////////////////////////
void send_sdbuf();
void SaveData(int RCount, int pbVal[]);
void ProcessData();
void rr_frame();
void rej_frame();
void info_frame();
void decmd();
void Transmitt();
void sim_frame();
void sim_frame() //初始化
{
sd_frame[0]=sd_frame[1]=0xee;
sd_frame[2]=sd_frame[3]=0x07;
sd_frame[4]=sd_frame[5]=0x77;
TCB=sd_frame[2];
TBF=0;
NS=0; NR=0; VS=0; VR=0;
TBL=6;
Transmitt();//发送
}
void rej_frame() //拒绝
{
sd_frame[0]=sd_frame[1]=0xee;
sd_frame[2]=sd_frame[3]=0x9+(VR<<5);
sd_frame[4]=sd_frame[5]=0x77;
TCB=sd_frame[2];
TBF=0;
TBL=6;
Transmitt();
jishu++;
jishu=jishu&0xffff;
Form1->Label2->Caption = IntToStr(jishu);
}
void rr_frame() //准备好帧
{
sd_frame[0]=sd_frame[1]=0xee;
sd_frame[2]=sd_frame[3]=1+(VR<<5);
sd_frame[4]=sd_frame[5]=0x77;
TCB=sd_frame[2];
TBF=0;
TBL=6;
Transmitt();
}
void decmd() //解帧
{
int i;
unsigned char check;
if(RV_ERR)
{
if(TBF==1)
sdbh=(sdbh-TBL+TEC+6)%1024;
rej_frame();
rej1++;
rej1=(rej1 & 0xffff);
Form1->Label9->Caption = IntToStr(rej1);
RV_ERR=0;
}
else if (!(RCB&1))
{
check=0;
for(i=rvbt;i!=RBS;)
{
check=(check+rvbuf[i])&0xff;
i=(i+1)&0x3ff;
}
check=(check+RCB)&0xff;
NS=((RCB>>1)&0x7); //次站所发帧
NR=RCB>>5; //次站所等帧
asd = rvbuf[RBS];
if(check!=rvbuf[RBS])
{
rej_frame();
rej2++;
rej2 = (rej2 & 0xffff);
Form1->Label10->Caption = IntToStr(rej2);
}
else if((NR==((VS+1)&7))&&(NS==VR))//正常传输
{
VS=((VS+1)&7);
VR=((VR+1)&7);
rvbt=RBS;
if(sdbt!=sdbh)
info_frame();
else rr_frame();
}
else if((NR==VS)&&(NS==VR))
{
VR=((VR+1)&7);
rvbt=RBS;
if(TBF==1)
Transmitt();
else if (sdbt!=sdbh)
info_frame();
else rr_frame();
}
else if((NR!=VS)&&(NR!=((VS+1)&7))&&(NS==VR))
{
VS=0;
VR=((VR+1)&7);
rvbt=RBS;
if(TBF==1)
sdbh=(sdbh+TEC+6-TBL)%1024;
sim_frame();
}
else if((NR==((VS+1)&7))&&(NS!=VR))
{
VS=((VS+1)&7);
rej_frame();
rej3++;
rej3 = (rej3 & 0xffff);
Form1->Label11->Caption = IntToStr(rej3);
}
else if((NR==VS)&&(NS!=VR))
{
if(TBF==1)
sdbh=(sdbh+TEC+6-TBL)%1024;
VR=0;
sim_frame();
}
else
{
if(TBF==1)
sdbh=(sdbh+TEC+6-TBL)%1024;
NS=0;
NR=0;
sim_frame();
}
}
else
{
switch(RCB&0xf)
{
case 0x07:
sim_frame();
break;
case 0x01:
{
NR=(RCB>>5);
if(NR==((VS+1)&7))
{
VS=((VS+1)&7);
if(sdbt==sdbh) //发送BUFFER头尾指针相同发准备好帧
rr_frame();
else //不同发信息帧
{
info_frame();
}
}
else if(NR==VS)
{
if(TBF)
Transmitt();
else
{
if (sdbh!=sdbt)
info_frame();
else
rr_frame();
}
}
else
{
sim_frame();
}
}
break;
case 0x09:
jishu1++;
jishu1=jishu1 & 0xffff;
Form1->Label3->Caption = IntToStr(jishu1);
if ((TCB&0xf)==0x9)
{
rr_frame();
}
else
Transmitt();
break;
case 0x03:
rr_frame();
break;
default:
break;
}
}
}
void SaveData(int RCount, int pbVal[])
{
int i,a;
AnsiString p;
p = "";
for(i=0;i<RCount;i++)
{
a=(SavePointer+i)&0x3ff;
RVBUF[a]=pbVal[i];
p = p + IntToStr(pbVal[i]) + ",";
}
SavePointer=(RCount+SavePointer)&0x3ff;
if(xianshi)
Form1->Label1->Caption=p;
ProcessData();
}
void ProcessData() //用来滤掉帧标志
{
int i=0;
for(i=RVBH;i!=SavePointer;)
{
switch(rv_state)
{
case 0:
if(RVBUF[i]==0xee)
rv_state=1;
break;
case 1:
if(RVBUF[i]==0xee)
rv_state=2;
else
rv_state=0;
break;
case 2:
RCB=RVBUF[i];
if(!(RCB&1))
{
rv_state=3;
RBS=rvbt;
}
else
rv_state=5;
break;
case 3:
if(RVBUF[i]==0x77)
rv_state=4;
rvbuf[RBS]=RVBUF[i];
RBS=((RBS+1)&0x3ff);
break;
case 4:
if(RVBUF[i]==0x77)
{
RBS=(RBS-2)&0x3ff;
rv_state=0;
decmd();
}
else
rv_state=3;
break;
case 5:
if(RVBUF[i]!=RCB)
RV_ERR=1;
rv_state=6;
break;
case 6:
if(RVBUF[i]==0x77)
rv_state=7;
break;
case 7:
if(RVBUF[i]==0x77)
{
decmd();
rv_state=0;
}
else
rv_state=6;
break;
default:
rv_state=0;
break;
}
i++;
i=i&0x3ff;
}
RVBH = i;
}
void info_frame()//成帧
{
int j,q,k,l;
unsigned char check;
sd_frame[0]=sd_frame[1]=0xee;
sd_frame[2]=(VS<<1)+(VR<<5);
check=sd_frame[2];
j=3;
TEC=0;
while((sdbh != sdbt) && (j < 200))
{
q = sdbuf[sdbh];
for(k=0;k<q;k++,j++)
{
l=(k+sdbh) & 0x3ff;
sd_frame[j]=sdbuf[l];
check=(check+sd_frame[j]) & 0xff;
if(sd_frame[j]==0x77)
{
TEC++;
j++;
sd_frame[j]=0;
}
}
sdbh = (sdbh + q)&0x3ff;
}
sd_frame[j++]=check;
if(check==0x77)
{
TEC++;
sd_frame[j++]=0;
}
sd_frame[j++]=0x77;
sd_frame[j++]=0x77;
TCB=sd_frame[2];
TBF=1;
TBL=j;//发送长度
Transmitt();
}
void send_sdbuf()
{
for(int i=0;i<t_length;i++)
{
sdbuf[sdbt]=send[i];
sdbt=(sdbt+1)&0x3ff;
}
}
//串口发送处理
void Transmitt()
{
int Count=TBL;
TxBuff=VarArrayCreate(OPENARRAY(int,(0,Count-1)),varByte);
for(int i=0;i<Count;i++)
TxBuff.PutElement(sd_frame[i],i);
Form1->MSComm1->Output=TxBuff;
timenum = 0;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
rv_state = 0;
sim_frame();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MSComm1->PortOpen=true;
int ii; // //
for(ii = 0; ii < 256; ii++)
{ //
sd_frame[ii] = 0;
send[ii] = 0;
}
t_length = 0; //
TBF = 0; // //
TBL = 0; // //
NS = 0; //
NR = 0; //
VR = 0; //
VS = 0; //
TEC = 0;
jishu = 0;
jishu1 = 0; //
for(ii = 0;ii<1024;ii++) //
{ //
sdbuf[ii]=0; //
rvbuf[ii]=0;
RVBUF[ii]=0; //
} //
rv_state = 0; //
sdbt = 0; //
rvbt = 0; //
sdbh = 0; //
rvbh = 0;
RVBH = 0; //
ceshi =0;
rej1=0;
rej2=0;
rej3=0;
timenum = 0;
asd = 0;
xianshi = true;
Timer1->Enabled = true;
Label2->Caption = IntToStr(jishu);
Label3->Caption = IntToStr(jishu1);
Label8->Caption = IntToStr(ceshi);
Label9->Caption = IntToStr(rej1);
Label10->Caption = IntToStr(rej2);
Label11->Caption = IntToStr(rej3); //
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
int length;
int BuffPtr=0;
int buffr[1024];
if (MSComm1->CommEvent!=comEvSend)
{
length=MSComm1->InBufferCount;
if (MSComm1->InBufferCount>0)
{
length=MSComm1->InBufferCount;
MSComm1->InputLen=length;
RxBuff=MSComm1->Input;
for(int i=0;i<length;i++)
{
buffr[BuffPtr++]=RxBuff.GetElement(i);
BuffPtr=(BuffPtr & 0x3ff);
}
MSComm1->InBufferCount=0;
SaveData(length,buffr);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
int i,j;
for( i=0;i<64;i=i+4)
{
send[i]=4;
for(j=1;j<4;j++)
send[j+i]=j;
}
t_length = i;
send_sdbuf();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
timenum++;
if(timenum>60)
{
timenum=0;
xianshi=false;
ceshi++;
ceshi=ceshi&0xffff;
Label8->Caption=IntToStr(ceshi);
Memo1->Lines->Add(IntToStr(rv_state)+"=>"+TimeToStr(Time())+"=>"+DateToStr(Date()));
rv_state=0;
sim_frame();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Label1->Caption = "";
jishu = 0;
jishu1 = 0;
ceshi = 0;
timenum = 0;
rej1=0;
rej2=0;
rej3=0;
Form1->Label2->Caption = IntToStr(jishu);
Form1->Label3->Caption = IntToStr(jishu1);
Form1->Label8->Caption = IntToStr(ceshi);
Form1->Label9->Caption = "0";
Form1->Label10->Caption = "0";
Form1->Label11->Caption = "0";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
int i;
send[0] = 0x09;
send[1] = 0x20;
for( i=2;i<9;i++)
send[i]=0xff;
t_length = i;
send_sdbuf();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int i,j;
fasong = (!fasong);
if(fasong)
{
send[0] = 0x09;
send[1] = 0x20;
for( i=2;i<9;i++)
send[i]=0xff;
t_length=i;
send_sdbuf();
}
else
{
for( i=0;i<128;i=i+4)
{
send[i]=4;
for(j=1;j<4;j++)
send[j+i]=j;
}
t_length=i;
send_sdbuf();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
xianshi=(!xianshi);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -