?? unit1.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
#include "CH375DLL.H"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
UINT mKeyCode = 0xff; // 按鍵編號
HWND mSaveDialogMain; // 主對話框
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
mCaptionInform = " 信息提示 ";
mIndex = 0;
edtN1->Text = "";
edtCmd->Text = "";
edtInt->Text = "";
mSaveDialogMain = this->Handle;
if ( LoadLibrary( "CH375DLL.DLL" ) == NULL ) // 加載DLL失敗,可能未安裝到系統中
{
Application->MessageBox("無法加載CH375的DLL", "information", MB_ICONSTOP | MB_OK );
}
else if ( CH375OpenDevice(0) == INVALID_HANDLE_VALUE ) // 使用之前必須打開設備
{
Application->MessageBox("無法打開CH375設備", "information", MB_ICONSTOP | MB_OK );
}
CH375SetTimeout( mIndex, 3000, 3000 ); // 設置USB數據讀寫的超時,超過3000mS未完成讀寫將強制返回,避免一直等待下去
CH375SetExclusive( mIndex, FALSE ); // 臨時設置共享使用當前CH375設備,因為下面設置中斷服務程序時需要使用當前這個CH375設備
// 下面加載中斷服務程序,中斷服務程序是在應用層執行的,其線程優先級是THREAD_PRIORITY_TIME_CRITICAL
// 當單片機有事需要通知計算機時,可以用CMD_WR_USB_DATA5命令寫入中斷特征數據,計算機的mInterruptEvent線程將會收到該中斷特征數據
// 然后mInterruptEvent線程向主程序發出消息進行處理,mInterruptEvent線程相當于中斷服務程序,代替主程序定時查詢單片機
CH375SetIntRoutine( mIndex, mInterruptEvent );
CH375SetExclusive( mIndex, TRUE ); // 設置獨占使用當前CH375設備,在此之后其它應用程序不能同時使用當前這個CH375設備
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSendClick(TObject *Sender)
{
mCOMMAND_PACKET mDemoReq;
UINT mLength;
UCHAR mEnterBuffer[8];
if(edtN1->GetTextLen()>0)
{
UCHAR mBcdCode;
UCHAR mNumber;
strcpy(mEnterBuffer,edtN1->Text.c_str());
if ( mEnterBuffer[0] == ' ' ) mBcdCode = 0x10; // 空格
else if ( mEnterBuffer[0] == '=' ) mBcdCode = 0x13;
else if ( mEnterBuffer[0] == '.' ) mBcdCode = 0x1a;
else mBcdCode = mCharToBcd( mEnterBuffer[0] );
// 如果輸入一個字符和一個小數點,則在字符右下角追加小數點
if ( edtN1->GetTextLen() >= 2 && mEnterBuffer[1] == '.' ) mBcdCode |= 0x80;
if ( mBcdCode != 0xff ) // 輸入的字符有效
{
mNumber = 7; // 以最高位為左,最低位為右,所以N1對應位7,N8對應0
mDemoReq.mCommandCode = DEMO_CH451_CMD;
mDemoReq.mCommandCodeNot = ~ DEMO_CH451_CMD;
mDemoReq.mParameter[2] = 0x08 | mNumber; // CH451命令:加載字數據到指定數碼管
mDemoReq.mParameter[1] = mBcdCode; // 字數據,對應于BCD譯碼方式
mLength = CONST_CMD_LEN; // 命令包的長度
if ( CH375WriteData( mIndex, (void *)&mDemoReq, (unsigned long *)&mLength ) ) // 通過CH375發送數據,成功
// 如果輸入時mLength大于64,則成功返回時,為了更加可靠,可以檢查實際發送的長度是否符合
{
mEnterBuffer[1] = 0; // 字符串結束符,只要一個字符
// SetDlgItemText( hDialog, LOWORD( wParam ), mEnterBuffer ); //設置按鈕上的字符
}
else Application->MessageBox( "CH375WriteData 失敗", mCaptionInform, MB_OK | MB_ICONERROR );
}
else Application->MessageBox( "請輸入字符0-9,A-F或者空格", mCaptionInform, MB_OK | MB_ICONERROR );
}
else
Application->MessageBox("請輸入字符0-9,A-F或者空格",mCaptionInform,MB_OK|MB_ICONSTOP);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCloseClick(TObject *Sender)
{
CH375CloseDevice( mIndex );
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCmdClick(TObject *Sender)
{
mCOMMAND_PACKET mDemoReq;
UINT mLength;
UCHAR mEnterBuffer[8];
// UINT mBufferLength = 0;
if ( edtCmd->GetTextLen() >= 3 ) // 已經輸入數據,并且長度超過3位
{
UCHAR mBcdCode[3];
strcpy(mEnterBuffer,edtCmd->Text.c_str());
mBcdCode[0] = mCharToBcd( mEnterBuffer[0] );
mBcdCode[1] = mCharToBcd( mEnterBuffer[1] );
mBcdCode[2] = mCharToBcd( mEnterBuffer[2] );
if ( mBcdCode[0] != 0xff && mBcdCode[1] != 0xff && mBcdCode[2] != 0xff ) // 輸入的三個字符都有效
{
mDemoReq.mCommandCode = DEMO_CH451_CMD;
mDemoReq.mCommandCodeNot = ~ DEMO_CH451_CMD;
mDemoReq.mParameter[2] = mBcdCode[0]; // CH451命令:高4位
mDemoReq.mParameter[1] = mBcdCode[1] << 4 | mBcdCode[2]; // 低8位的字節數據
mLength = CONST_CMD_LEN; // 命令包的長度
if ( CH375WriteData( mIndex, (void *)&mDemoReq, (unsigned long *)&mLength ) ) // 通過CH375發送數據,成功
Application->MessageBox( "命令成功發送到CH451", mCaptionInform, MB_OK );
else Application->MessageBox( "CH375WriteData 失敗", mCaptionInform, MB_OK | MB_ICONERROR );
}
else Application->MessageBox( "請輸入3個字符0-9,A-F", mCaptionInform, MB_OK | MB_ICONERROR );
}
else Application->MessageBox( "請至少輸入3個字符0-9,A-F", mCaptionInform, MB_OK | MB_ICONERROR );
}
//---------------------------------------------------------------------------
UCHAR TForm1::mCharToBcd( UCHAR iChar ) // 輸入的ASCII字符
{
UCHAR mBCD;
if ( iChar >= '0' && iChar <= '9' ) mBCD = iChar -'0';
else if ( iChar >= 'A' && iChar <= 'F' ) mBCD = iChar - 'A' + 0x0a;
else if ( iChar >= 'a' && iChar <= 'f' ) mBCD = iChar - 'a' + 0x0a;
else mBCD = 0xff;
return( mBCD );
}
void __fastcall TForm1::edtN1KeyPress(TObject *Sender, char &Key)
{
if(Key == 13)
this->btnSend->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::edtCmdKeyPress(TObject *Sender, char &Key)
{
if(Key == 13)
this->btnCmd->Click();
}
//---------------------------------------------------------------------------
VOID CALLBACK mInterruptEvent( // 中斷服務程序
PUCHAR iBuffer ) // 指向一個緩沖區,提供當前的中斷特征數據
{
// CH375產生中斷后,產生一個消息通知主程序
if ( iBuffer[0] == 1 ) // 檢查中斷特征數據
{
mKeyCode = iBuffer[1] & 0x3f; // 返回的鍵值,則單片機存放在中斷特征數據緩沖區的第2字節
Form1->btnInt->Click();
}
else if ( iBuffer[0] == 2 )
Form1->btnRe->Click();
// 如果使用中斷特征數據,則根據該數據作相應的處理
/*
switch( iBuffer[0] )
{
case 1: 中斷特征數據為1
case 2: 中斷特征數據為2
.....
case 6: 中斷特征數據為6
}
*/
}
void __fastcall TForm1::btnIntClick(TObject *Sender)
{
UCHAR buf[8];
// sprintf(buf,"02x%",mKeyCode);
// SetDlgItemText(this,edtInt,buf);
edtInt->Text=AnsiString(mKeyCode+1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnReClick(TObject *Sender)
{
edtInt->Text = "0";
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -