?? main.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)) { //讀取參數(shù)
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;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -