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

📄 main.cpp

📁 这是通过COM口对声波触摸屏控制卡进行仿真测试的程序的源码. BCB
💻 CPP
字号:
//-----------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <inifiles.hpp>
#pragma hdrstop

#include "MAIN.h"

#define ORIG_X 10
#define ORIG_Y 600
#define SAMPLE 200
#define FACTOR 4

HANDLE hComm = NULL;
TRead *ReadThread;
COMMTIMEOUTS ctmoNew = {0}, ctmoOld;
unsigned char InBuff[500];
unsigned char OutBuff[50];
AnsiString Buff,Buff1;
DWORD dwBytesRead;
bool opencom;
int k;
int len;
int ptrdata;
bool colordata;
//-----------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int stat;
//-----------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { }
void __fastcall TForm1::ComboBox2Change(TObject *Sender) {
  char ts[5];
  int outnum;
  OutBuff[0]=1;
  switch (ComboBox2->Items->IndexOf(ComboBox2->Text)) {
    case 0 :   //calibrate extended 'CX' command
      OutBuff[1]='C';      OutBuff[2]='X';       OutBuff[3]=13;    OutBuff[4]=0;
      outnum=4;
      break;
    case 1 :   //calibrate raw 'CR' command
      OutBuff[1]='C';      OutBuff[2]='R';       OutBuff[3]=13;    OutBuff[4]=0;
      outnum=4;
      break;
    case 2 :   //calibrate extended 'FO' command
      OutBuff[1]='F';      OutBuff[2]='O';       OutBuff[3]=13;    OutBuff[4]=0;
      outnum=4;
      break;
    case 11 :   //reset 'R' command
      OutBuff[1]='R';      OutBuff[2]=13;    OutBuff[3]=0;
      outnum=4;
      break;
    case 12 :   //Restore Defaults 'RD' command
      OutBuff[1]='R';      OutBuff[2]='D';       OutBuff[3]=13;    OutBuff[4]=0;
      outnum=4;
      break;

    default:   //NULL command   'Z' command
      OutBuff[1]='Z';      OutBuff[2]=13;       OutBuff[3]=0;
      outnum=3;
  };
  Form1->M1->Lines->Add(Buff);
  M1->Lines->Add(ComboBox2->Text);
//  TransmitCommChar(hComm, testmode);
    WriteFile(hComm, OutBuff, outnum, &dwBytesRead, NULL);
}
void __fastcall TForm1::draw_axis() {
    Form1->Canvas->Pen->Style=psSolid;
    Form1->Canvas->Pen->Color=clBlack;
    Form1->Canvas->Pen->Width=2;
    Form1->Canvas->MoveTo(ORIG_X,ORIG_Y);
    Form1->Canvas->LineTo(ORIG_X+SAMPLE*FACTOR,ORIG_Y);
    Form1->Canvas->Pen->Style=psDot;
    Form1->Canvas->Pen->Color=clYellow;
    Form1->Canvas->MoveTo(ORIG_X,ORIG_Y-256);
    Form1->Canvas->LineTo(ORIG_X+SAMPLE*FACTOR,ORIG_Y-256);
    Form1->Canvas->Pen->Color=clYellow;
    Form1->Canvas->MoveTo(ORIG_X,ORIG_Y-240);
    Form1->Canvas->LineTo(ORIG_X+SAMPLE*FACTOR,ORIG_Y-240);
    Form1->Canvas->Pen->Color=clYellow;
    Form1->Canvas->MoveTo(ORIG_X,ORIG_Y-112);
    Form1->Canvas->LineTo(ORIG_X+SAMPLE*FACTOR,ORIG_Y-112);
    Form1->Canvas->Pen->Color=clYellow;
    Form1->Canvas->MoveTo(ORIG_X,ORIG_Y-48);
    Form1->Canvas->LineTo(ORIG_X+SAMPLE*FACTOR,ORIG_Y-48);
    Form1->Canvas->Pen->Style=psSolid;
    Form1->Canvas->Pen->Color=clBlue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)  {
  AnsiString tmp=ExtractFilePath(Application->ExeName)+"test232.ini";
  AnsiString comport;
  TIniFile *ini=new TIniFile(tmp);
  if (FileExists(tmp)) {       //读取参数
      comport=ini->ReadString("default","port","COM1");
  } else comport="COM2";
  delete ini;
  DCB dcbCommPort;
  // OPEN THE COMM PORT.
  // REPLACE "COM2" WITH A STRING OR "COM1", "COM3", ETC. TO OPEN
  // ANOTHER PORT.
  hComm = CreateFile(comport.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->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);
  // ACTIVATE THE THREAD. THE FALSE ARGUMENT SIMPLY MEANS IT HITS THE
  // GROUND RUNNING RATHER THAN SUSPENDED.
  ReadThread = new TRead(false);
  M1->Height=Height-100;
  M1->Width=Width-40;
  M1->Top=60;
  M1->Left=0;
  Buff1="";
  k=0;
  len=10;
}
//------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)  {
  // TERMINATE THE THREAD.
  ReadThread->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::Button1Click(TObject *Sender)
{
  M1->Lines->SaveToFile(ExtractFilePath(Application->ExeName)+Edit1->Text+".txt");
  M1->Lines->Clear();
}
//-----------------------------------------------
__fastcall TRead::TRead(bool Cr) :TThread(Cr) { }
void __fastcall TRead::Execute() {
  // MAKE THE THREAD OBJECT AUTOMATICALLY DESTROYED WHEN THE THREAD
  // TERMINATES.
  FreeOnTerminate = true;
  while(1) {
    // 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);
    if(dwBytesRead) {
      InBuff[dwBytesRead] = 0; // NULL TERMINATE THE STRING
      Synchronize(DisplayIt);
    }
  }
}
void __fastcall TRead::DisplayIt() {
  // NOTE THAT IN THIS EXAMPLE, THERE IS NO EFFORT TO MONITOR  HOW MUCH TEXT HAS
  // GONE INTO Memo1. IT CAN ONLY HOLD ABOUT 32K.
  // ALSO, NOTHING IS BEING DONE ABOUT NON-PRINTABLE CHARACTERS
  // OR CR-LF'S EMBEDDED IN THE STRING. DISPLAY THE RECEIVED TEXT.
  char ts[5];
  int x0;
  for (int i=0;i<dwBytesRead;i++) {
    if (InBuff[i]>15) sprintf(ts,"  %2X",InBuff[i]);
    else sprintf(ts,"  0%X",InBuff[i]);
    Buff=Buff+ts;
    k++;
    if (k>len) {
      k=0;
      Form1->M1->Lines->Add(Buff);
      Buff="";
    }
    if (ptrdata==256) {
      ptrdata-=256;
      if (colordata) {
        colordata=false;
        Form1->Canvas->Pen->Color=clRed;
      } else {
        colordata=true;
        Form1->Canvas->Pen->Color=clBlue;
      }
    }
    if (ptrdata==0) Form1->Canvas->MoveTo(ORIG_X,ORIG_Y);
    else if (ptrdata<SAMPLE) Form1->Canvas->LineTo(ORIG_X+ptrdata*FACTOR,ORIG_Y-InBuff[i]);
    ptrdata++;
  }
}
//------------------------------------------------------
__fastcall TWrite::TWrite(bool Cr) :TThread(Cr) { }
void __fastcall TWrite::Execute() {
  // MAKE THE THREAD OBJECT AUTOMATICALLY DESTROYED WHEN THE THREAD
  // TERMINATES.
  FreeOnTerminate = true;
  while(1) {
    // 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.
    if (ptrdata==512) {
//      testmode='2';
//      TransmitCommChar(hComm, '2');
      ptrdata=0;
    }
  }
}

⌨️ 快捷键说明

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