全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1193
推到 Plurk!
推到 Facebook!

Overlapped模式下Writefile的問題

 
stanley
一般會員


發表:9
回覆:36
積分:14
註冊:2003-11-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-26 14:23:50 IP:61.219.xxx.xxx 未訂閱
經網上高手推薦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); } //---------------------------------------------------------------------------
系統時間:2024-05-03 1:44:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!