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

📄 ceshi.cpp

📁 这是一个将HDLC协议运用到串口通信的程序源码
💻 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 + -