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

📄 main.cpp

📁 这是通过COM口对声波触摸屏控制卡直接进行数据包解读的程序源码. BCB
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <sysutils.hpp>
#pragma hdrstop

#include "main.h"

#define BUFFLEN 4096            //缓冲区长度
#define LEAD1 85
#define LEAD2 84
#define CHKSUM (LEAD1+LEAD2+1)
HANDLE hComm = NULL;            //文件句柄
TOrienRead *OrienThread;        //定位进程
TDispRead *DispThread;          //显示进程
COMMTIMEOUTS ctmoNew = {0}, ctmoOld;
unsigned char InBuff[500];      //读入缓冲区
DWORD dwBytesRead;              //读入字节数
bool opencom;                   //打开标志
char c;
int cursorshow;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){
  flag=0;
  xcen=Screen->Width/2;
  ycen=Screen->Height/2-60;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
  Form1->WindowState=wsMaximized;       //满屏幕无边框
  Form1->BorderStyle= bsNone;
  Form1->BorderIcons>>biSystemMenu>>biMinimize>>biMaximize;
  createcomport();                      //打开通信端口
  ComboBox1->Visible=false;
  testmode=0;
  OrienThread = new TOrienRead(false);  //生成定位进程
  Button1->Visible=false;
  drawcross(200,200,30,20);
  cursorshow=ShowCursor(false);
  flag=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if ((flag!=0) && (Key==VK_ESCAPE)){
   ShowCursor(cursorshow);
   Close();
  }
}
void __fastcall TForm1::drawcross(int x,int y,int w,int r) {
  Form1->Canvas->Pen->Color=clRed;
  Form1->Canvas->Arc(x-r,y-r,x+r,y+r,x-r,y-r,x-r,y-r);
  Form1->Canvas->MoveTo(x-w,y);
  Form1->Canvas->LineTo(x+w,y);
  Form1->Canvas->MoveTo(x,y-w);
  Form1->Canvas->LineTo(x,y+w);
}
void __fastcall TForm1::signorien(int typ,int x,int y,int z) {
  if (typ==132) {
    Beep();
    if (testmode==0) {
      xleft=x;
      ytop=y;
//      Sleep(500);
      Repaint();
      drawcross(Screen->Width-200,Screen->Height-200,30,20);
      testmode++;
    } else {
      xright=x;
      ybottom=y;
      OrienThread->Terminate();
//      Sleep(500);
      Repaint();
      ShowCursor(cursorshow);
      testmode++;
      if (xright!=xleft) {
        xk=(double(Screen->Width-400))/(double(xright-xleft));
        x0=200-xk*xleft;
      } else {
        xk=1;
        x0=0;
      }
      if (ybottom!=ytop) {
        yk=(double(Screen->Height-400))/(double(ybottom-ytop));
        y0=200-yk*ytop;
      } else {
        yk=1;
        y0=0;
      }
      Repaint();
      DispThread = new TDispRead(false);  //生成显示进程
      gettime(&t0);
    }
  }
}
void __fastcall TForm1::signdisp(int typ,int x,int y,int z) {
//  if (typ==129) Beep();
  Repaint();
  double xt,yt,xx;
  AnsiString s1;
  switch (typ) {
    case 129:
      s1="按下"; break;
    case 130:
      s1="触摸"; break;
    case 132:
      s1="松开"; break;
    default:
      s1="未知"; break;
  }
  xt=xk*x+x0;
  yt=yk*y+y0;
  SetCursorPos(xt,yt);
  gettime(&t1);
  xx=(t1.ti_min-t1.ti_min)*60+t1.ti_sec-t0.ti_sec+(t1.ti_hund-t0.ti_hund)*0.01;
  Form1->Canvas->TextOutA(xcen,ycen,s1);
  Form1->Canvas->TextOutA(xcen,ycen+30,IntToStr(int(xt/Screen->Width*4096)));
  Form1->Canvas->TextOutA(xcen,ycen+60,IntToStr(int(yt/Screen->Height*4096)));
  Form1->Canvas->TextOutA(xcen,ycen+90,IntToStr(z));
  Form1->Canvas->TextOutA(xcen,ycen+120,FloatToStrF(xx,ffFixed,4,2));
  t0=t1;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  // TERMINATE THE THREAD.
  if (flag!=1) {
     if (flag==1) OrienThread->Terminate();
     else DispThread->Terminate();
     // WAIT FOR THREAD TO TERMINATE,PURGE THE INTERNAL COMM BUFFER,
     // RESTORE THE PREVIOUS TIMEOUT SETTINGS,AND CLOSE THE COMM PORT.
     Sleep(250);
     PurgeComm(hComm, PURGE_RXABORT);
     SetCommTimeouts(hComm, &ctmoOld);
     CloseHandle(hComm);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::createcomport()  {
  DCB dcbCommPort;
  // OPEN THE COMM PORT.
  hComm = CreateFile(ComboBox1->Text.c_str(),GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
  // IF THE PORT CANNOT BE OPENED, BAIL OUT.
  if  (hComm == INVALID_HANDLE_VALUE) {
    Application->MessageBox("Open communication port","fail!",MB_OK);
    Application->Terminate();
  }
  // SET THE COMM TIMEOUTS IN OUR EXAMPLE.
  GetCommTimeouts(hComm,&ctmoOld);
  ctmoNew.ReadTotalTimeoutConstant = 100;
  ctmoNew.ReadTotalTimeoutMultiplier = 0;
  ctmoNew.WriteTotalTimeoutMultiplier = 0;
  ctmoNew.WriteTotalTimeoutConstant = 0;
  SetCommTimeouts(hComm, &ctmoNew);
  //SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS. THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST. IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING. ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING.
  dcbCommPort.DCBlength = sizeof(DCB);
  GetCommState(hComm, &dcbCommPort);
  BuildCommDCB("9600,N,8,1", &dcbCommPort);
  SetCommState(hComm, &dcbCommPort);
}
//------------------------------------------------------
__fastcall TOrienRead::TOrienRead(bool Cr) :TThread(Cr) {
  stat=0;typ=0;xh=0;xl=0;yh=0;yl=0;zh=0;zl=0;
}
void __fastcall TOrienRead::Execute() {
  // MAKE THE THREAD OBJECT AUTOMATICALLY DESTROYED WHEN THE THREAD
  // TERMINATES.
  unsigned char dat;
  int chk;
  FreeOnTerminate = true;
  while(!Terminated) {
    // TRY TO READ CHARACTERS FROM THE SERIAL PORT.  IF THERE ARE NONE,
    // IT WILL TIME OUT AND TRY AGAIN. IF THERE ARE, IT WILL DISPLAY THEM.
    ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL);
//    dwBytesRead=12;
//    InBuff[0]=85;InBuff[1]=84;InBuff[2]=132;InBuff[3]=170;
//    InBuff[4]=0;InBuff[5]=255;InBuff[6]=1;InBuff[7]=17;
//    InBuff[8]=0;InBuff[9]=232;InBuff[10]='9';InBuff[11]=31;
    if(dwBytesRead) {
      for (int i=0;i<dwBytesRead;i++) {
        dat=InBuff[i];         //将读入缓冲区中的数据读入待处理缓冲区
        switch (stat) {
          case 0:
            if (dat==LEAD1) stat++;
            break;
          case 1:
            if (dat==LEAD2) stat++;
            else stat=0;
            break;
          case 2:
            if ((dat==129)||(dat==130)||(dat==132)) {
              typ=dat;
              stat++;
            } else stat=0;
            break;
          case 3:
            xl=dat;
            stat++;
            break;
          case 4:
            xh=dat;
            stat++;
            break;
          case 5:
            yl=dat;
            stat++;
            break;
          case 6:
            yh=dat;
            stat++;
            break;
          case 7:
            zl=dat;
            stat++;
            break;
          case 8:
            zh=dat;
            stat++;
            break;
          default :
            chk=(CHKSUM*2-1+typ+xh+xl+yh+yl+zh+zl)%256;
            if (chk==dat) Synchronize(DisplayIt);
            stat=0;
        }
      }
    }
  }
}
void __fastcall TOrienRead::DisplayIt() {  //建立定位坐标
  Form1->signorien(typ,xh*256+xl,yh*256+yl,zh*256+zl);
}
__fastcall TDispRead::TDispRead(bool Cr) :TThread(Cr) {
  stat=0;typ=0;xh=0;xl=0;yh=0;yl=0;zh=0;zl=0;
}
void __fastcall TDispRead::Execute() {
  // MAKE THE THREAD OBJECT AUTOMATICALLY DESTROYED WHEN THE THREAD
  // TERMINATES.
  unsigned char dat;
  int chk;
  FreeOnTerminate = true;
  while(!Terminated) {
    // TRY TO READ CHARACTERS FROM THE SERIAL PORT.  IF THERE ARE NONE,
    // IT WILL TIME OUT AND TRY AGAIN. IF THERE ARE, IT WILL DISPLAY THEM.
    ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL);
//    dwBytesRead=12;
//    InBuff[0]=85;InBuff[1]=84;InBuff[2]=129;InBuff[3]=170;
//    InBuff[4]=0;InBuff[5]=255;InBuff[6]=1;InBuff[7]=17;
//    InBuff[8]=0;InBuff[9]=229;InBuff[10]='9';InBuff[11]=31;
    if(dwBytesRead) {
      for (int i=0;i<dwBytesRead;i++) {
        dat=InBuff[i];         //将读入缓冲区中的数据读入待处理缓冲区
        switch (stat) {
          case 0:
            if (dat==LEAD1) stat++;
            break;
          case 1:
            if (dat==LEAD2) stat++;
            else stat=0;
            break;
          case 2:
            if ((dat==129)||(dat==130)||(dat==132)) {
              typ=dat;
              stat++;
            } else stat=0;
            break;
          case 3:
            xl=dat;
            stat++;
            break;
          case 4:
            xh=dat;
            stat++;
            break;
          case 5:
            yl=dat;
            stat++;
            break;
          case 6:
            yh=dat;
            stat++;
            break;
          case 7:
            zl=dat;
            stat++;
            break;
          case 8:
            zh=dat;
            stat++;
            break;
          default :  //校验和检查
            chk=(CHKSUM*2-1+typ+xh+xl+yh+yl+zh+zl)%256;
            if (chk==dat) Synchronize(DisplayIt);
            stat=0;
        }
      }
    }
  }
}
void __fastcall TDispRead::DisplayIt() {  //调用显示坐标
  Form1->signdisp(typ,xh*256+xl,yh*256+yl,zh*256+zl);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  if (testmode>1) {
  Form1->Canvas->TextOutA(xcen-50,ycen,"类型");
  Form1->Canvas->TextOutA(xcen-50,ycen+30,"X 轴");
  Form1->Canvas->TextOutA(xcen-50,ycen+60,"Y 轴");
  Form1->Canvas->TextOutA(xcen-50,ycen+90,"力度");
  Form1->Canvas->TextOutA(xcen-50,ycen+120,"时间");
  }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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