經網上高手推薦C++Builder與RS-232一書, 我將第三章Line_Event程式改編成如下, 但出現了幾個問題,
1. 原本傳送五個位元組, 但GetOverlappedResult函數抓到只有四個
2. timer裡的WaitCommEvent(hComm,&EvWait,&OverLap)在接收位元後,卻不觸發EV_RXCHAR的EVENT
請問各位高手是否有遇到類似問題 #include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hComm;
void __fastcall SetEvent(); TEvent *WEvent;
OVERLAPPED OverLap;
TWaitResult EE; //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WEvent =new TEvent(NULL,True,False,"") ;
OverLap.hEvent = (HANDLE) WEvent->Handle;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *ComNo;
DCB dcb; hComm = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if (hComm == INVALID_HANDLE_VALUE) // 如果COM 未開啟
{
MessageBox(0, "開啟通訊埠錯誤!!","Comm Error",MB_OK);
return;
}
//將dcb位址傳入,以取得通訊參數
GetCommState(hComm,&dcb); // 得知目前COM 的狀態
dcb.BaudRate = CBR_9600; // 設定鮑率為9600
dcb.ByteSize = 8; // 位元組為 8 bit
dcb.Parity = NOPARITY; // Parity 為 None
dcb.StopBits = ONESTOPBIT; // 1 個Stop bit
//通訊埠設定
if (!SetCommState(hComm, &dcb)) { // 設定COM 的狀態
MessageBox (0, "通訊埠設定錯誤!!!","Set Error",MB_OK);
CloseHandle(hComm);
return;
}
SetEvent();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (hComm!=INVALID_HANDLE_VALUE) CloseHandle(hComm);
exit(EXIT_SUCCESS);
} //---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
unsigned long EvWait; if (hComm==INVALID_HANDLE_VALUE) return; //若未開啟通訊埠則跳出 //等待事件的發生
if (WaitCommEvent(hComm,&EvWait,&OverLap))
{
//先檢查Event
EE=WEvent->WaitFor(10);
if (EE!=wrSignaled ) return ;//若未觸發,則跳出
WEvent->ResetEvent();//清除事件 if (EvWait & EV_RXCHAR)//檢查readbuf是否接收的字元
{
lblRX->Caption = IntToStr(StrToInt(lblRX->Caption) 1);
if (spRX->Brush->Color==clRed)
spRX->Brush->Color=clWhite;
else
spRX->Brush->Color=clRed;
}
}
}
//--------------------------------------------------------------------------- void __fastcall SetEvent()
{
long EvWait;
if (hComm==0) return; EvWait=EV_RXCHAR;
if (!SetCommMask(hComm,EvWait))
MessageBox (0, "設定錯誤!!","",MB_OK);
Form1->Timer1->Enabled =true;
} void __fastcall TForm1::SendClick(TObject *Sender)
{
DWORD dwrite,dRead;
bool test;
char ch[]="aaaaa";
test = HasOverlappedIoCompleted(&OverLap);
WriteFile(hComm,&ch,6,&dwrite,&OverLap);
GetOverlappedResult(hComm,&OverLap,&dRead,true);
}
//---------------------------------------------------------------------------