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

OverLapped模式下的WriteFile

尚未結案
stanley
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-26 14:29:19 IP:61.219.xxx.xxx 未訂閱
經網上高手推薦C++Builder與RS-232一書, 我將第三章Line_Event程式改編成如下, 但出現了幾個問題, 1. 原本傳送五個位元組, 但GetOverlappedResult函數抓到只有四個 2. timer裡的WaitCommEvent(hComm,&EvWait,&OverLap)在接收位元後,卻不觸發EV_RXCHAR的EVENT,  請問各位高手是否有遇到類似問題 3. 剛才又試了一下發現WriteFile傳回false值, 要如何設定才正確     
 
#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);
}
//---------------------------------------------------------------------------    
發表人 - stanley 於 2003/11/26 15:48:01
stanley
一般會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-01 19:33:20 IP:61.219.xxx.xxx 未訂閱
Sorry!問題問的太爛導致沒有回應, 就我這三天看的書和MSDN的心得跟各位報告一下, 在Overlapped模式下的WriteFile和ReadFile確定會回應false, 因為這兩個函數在未完成動作即返回, 所以就會得的false, 所得到的byte數也就會比原要收或要傳的少。 在WaitCommEvent這個函數書上沒說會回應false, 但我試了三天沒看到有true過, 要如何知道這三個指令已完成動作, 使用GetOverlappedResult這個函數作判斷, 有true回應表示動作已經完成。 希望對有此問題的網友有所幫助。
系統時間:2024-04-26 16:22:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!