亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? unit1.pas

?? delphi串口通信 WAPI串口編程示例
?? PAS
字號:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

const
  WM_COMMNOTIFY = WM_USER + 100; // 通訊消息

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Memo1: TMemo;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    GroupBox1: TGroupBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    ComboBox4: TComboBox;
    ComboBox3: TComboBox;
    ComboBox2: TComboBox;
    ComboBox1: TComboBox;
    Label7: TLabel;
    ComboBox5: TComboBox;
    btnOpenCom: TButton;
    btnSendData: TButton;
    btnReceiveData: TButton;
    btnCloseCom: TButton;
    procedure btnOpenComClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnCloseComClick(Sender: TObject);
    procedure btnSendDataClick(Sender: TObject);
    procedure btnReceiveDataClick(Sender: TObject);
  private
    { Private declarations }
    procedure WMCOMMNOTIFY(var Message :TMessage);message WM_COMMNOTIFY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  CommHandle:THandle;
  PostEvent:THandle;
  ReadOs : Toverlapped;
  Connected:Boolean;
  Receive :Boolean;
  ReceiveData : Dword;

procedure AddToMemo(Str:PChar;Len:Dword); // 接收的數據送入顯示區Memo2
begin
  //接收厚的字符串為NULL終止
  str[Len]:=#0;
  Form1.Memo2.Text:=Form1.Memo2.Text+StrPas(str);
end;


procedure CommWatch(Ptr:Pointer);stdcall; // 通訊監視線程
var
  dwEvtMask,dwTranser : Dword;
  PostMsgFlag: Boolean;
  overlapped : Toverlapped;

begin
  Receive :=True;
  FillChar(overlapped,SizeOf(overlapped),0);
  overlapped.hEvent :=CreateEvent(nil,True,False,nil); // 創建重疊讀事件對象
  if overlapped.hEvent=null then
  begin
    MessageBox(0,'overlapped.Event Create Error !','Notice',MB_OK);
    Exit;
  end;

  //進入串口監視狀態,直到全局變量Receive置為False停止
  while(Receive) do
  begin
    dwEvtMask:=0;
    // 等待串口事件發生
    if not WaitCommEvent(CommHandle,dwEvtMask,@overlapped) then
    begin
      if ERROR_IO_PENDING=GetLastError then
        GetOverLappedResult(CommHandle,overlapped,dwTranser,True)
      end;

      //串口讀事件發布消息 
      if ((dwEvtMask and EV_RXCHAR)=EV_RXCHAR) then
      begin
        // 等待允許傳遞WM_COMMNOTIFY通訊消息
        WaitForSingleObject(Postevent,INFINITE);
        // 處理WM_COMMNOTIFY消息時不再發送WM_COMMNOTIFY消息
        ResetEvent(PostEvent);
        // 傳遞WM_COMMNOTIFY通訊消息,告知主線程調用讀串口的過程
        PostMsgFlag:=PostMessage(Form1.Handle,WM_COMMNOTIFY,CommHandle,0);
        if (not PostMsgFlag) then
        begin
          MessageBox(0,'PostMessage Error !','Notice',MB_OK);
          Exit;
        end;
      end;
    end;
    CloseHandle(overlapped.hEvent); // 關閉重疊讀事件對象
end;


procedure TForm1.WMCOMMNOTIFY(var Message :TMessage); // 消息處理函數
var
  CommState : ComStat;
  dwNumberOfBytesRead : Dword;
  ErrorFlag : Dword;
  InputBuffer : Array [0..1024] of Char;

begin
  if not ClearCommError(CommHandle,ErrorFlag,@CommState) then
  begin
    MessageBox(0,'ClearCommError !','Notice',MB_OK);
    PurgeComm(CommHandle,Purge_Rxabort or Purge_Rxclear);
    Exit;
  end;

  if CommState.cbInQue>0 then
  begin
    fillchar(InputBuffer,CommState.cbInQue,#0);
    // 接收通訊數據
    if (not ReadFile( CommHandle,InputBuffer,CommState.cbInQue,
                 dwNumberOfBytesRead,@ReadOs )) then
    begin
      ErrorFlag := GetLastError();
      if (ErrorFlag <> 0) and (ErrorFlag <> ERROR_IO_PENDING) then
      begin
        MessageBox(0,'ReadFile Error!','Notice',MB_OK);
        Receive :=False;
        CloseHandle(ReadOs.hEvent);
        CloseHandle(PostEvent);
        CloseHandle(CommHandle);
        Exit;
      end
      else begin
        WaitForSingleObject(CommHandle,INFINITE); // 等待操作完成
        GetOverlappedResult(CommHandle,ReadOs,dwNumberOfBytesRead,False);
      end;
    end;
    if dwNumberOfBytesRead>0 then
    begin
      ReadOs.Offset :=ReadOs.Offset+dwNumberOfBytesRead;
      ReceiveData := ReadOs.Offset;
      // 處理接收的數據
      AddToMemo(InputBuffer,dwNumberOfBytesRead);
    end;
  end;
  // 允許發送下一個WM_COMMNOTIFY消息
  SetEvent(PostEvent);
end;


procedure TForm1.btnOpenComClick(Sender: TObject);
var
    CommTimeOut : TCOMMTIMEOUTS;
    DCB : TDCB;

begin
    StatusBar1.SimpleText := '連接中...';

    //發送消息的句柄
    PostEvent:=CreateEvent(nil,True,True,nil);
    if PostEvent=null then
    begin
        MessageBox(0,'CreateEvent Error!','Notice',MB_OK);
        StatusBar1.SimpleText := '串口打開失敗';
        Exit;
    end;

    //Overlapped Read建立句柄
    ReadOs.hEvent :=CreateEvent(nil,true,False,nil);
    if ReadOs.hEvent=null then
    begin
        MessageBox(0,'CreateEvent Error!','Notice',MB_OK);
        CloseHandle(PostEvent);
        StatusBar1.SimpleText := '串口打開失敗';
        Exit;
    end;

    //建立串口句柄
    CommHandle := CreateFile(PChar(ComboBox1.Text),GENERIC_WRITE or GENERIC_READ,
             0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0);

    if CommHandle = INVALID_HANDLE_VALUE then
    begin
        CloseHandle(PostEvent);
        CloseHandle(ReadOs.hEvent);
        MessageBox(0,'串口打開失敗!','Notice',MB_OK);
        StatusBar1.SimpleText := '串口打開失敗';
        Exit;
    end;
    StatusBar1.SimpleText := '已同端口 '+ ComboBox1.Text + ' 連接!';

    //設置超時
    CommTimeOut.ReadIntervalTimeout := MAXDWORD;
    CommTimeOut.ReadTotalTimeoutMultiplier := 0;
    CommTimeOut.ReadTotalTimeoutConstant := 0;
    SetCommTimeouts(CommHandle, CommTimeOut);

    //設置讀寫緩存
    SetupComm(CommHandle,4096,1024);

    //對串口進行指定配置
    GetCommState(CommHandle,DCB);
    DCB.BaudRate := StrToInt(ComboBox2.Text);
    DCB.ByteSize := StrToInt(ComboBox3.Text);
    DCB.Parity := ComboBox4.ItemIndex;;
    DCB.StopBits := ComboBox5.ItemIndex;
    Connected := SetCommState(CommHandle, DCB);

    //關系串口的讀事件
    if (not SetCommMask(CommHandle,EV_RXCHAR)) then
    begin
      MessageBox(0,'SetCommMask Error !','Notice',MB_OK);
      Exit;
    end;

    if (Connected) then
    begin
        btnOpenCom.Enabled :=False;
    end
    else begin
        CloseHandle(CommHandle);
        StatusBar1.SimpleText := '設置串口失敗';
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Connected:=False;
    ComboBox1.ItemIndex:=0;
    ComboBox2.ItemIndex:=0;
    ComboBox3.ItemIndex:=4;
    ComboBox4.ItemIndex:=0;
    ComboBox5.ItemIndex:=0;      
end;

procedure TForm1.btnCloseComClick(Sender: TObject);
begin
    if not Connected then
    begin
        StatusBar1.SimpleText := '未打開串口';
        Exit;
    end;
    Receive :=False;
    //取消事件監視,此時監視線程中的WaitCommEvent將返回
    SetCommMask(CommHandle,0);
    //等待監視線程結束
    WaitForSingleObject(PostEvent,INFINITE);
     //關閉事件句柄
    CloseHandle(PostEvent);
    //停止發送和接收數據,并清除發送和接收緩沖區
    PurgeComm(CommHandle,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
     //關閉其他的句柄
    CloseHandle(ReadOs.hEvent);
    CloseHandle(CommHandle);    
    btnOpenCom.Enabled :=True;
    Connected:=False;
    StatusBar1.SimpleText := '串口已經關閉';
end;

procedure TForm1.btnSendDataClick(Sender: TObject);
var
    Str:String;
    i:Integer;
    writeoverlapped:TOverlapped;
    ByteToWrite,BytesWritten,AllBytesWritten:DWORD;
    ErrorCode,ErrorFlag:DWORD;
    CommStat:COMSTAT;

begin
    if not Connected then
    begin
        StatusBar1.SimpleText := '未打開串口';
        Exit;
    end;

    if (Memo1.GetTextLen=0) then
    begin
        StatusBar1.SimpleText := '緩沖區為空';
        Exit;
    end;

    AllBytesWritten:=0;
    for i:=0 to memo1.Lines.Count-1 do
    begin
        Str:=memo1.Lines[i];
        ByteToWrite:=length(Str);
        if  ByteToWrite=0 then continue;
        try
            StatusBar1.SimpleText := '正在發送數據';
            //初始化一步讀寫結構
            FillChar(writeoverlapped,Sizeof(writeoverlapped),0);
             //避免貢獻資源沖突
            writeoverlapped.hEvent:=CreateEvent(nil,True,False,nil);
            //發送數據
            if not WriteFile(Commhandle,Str[1],ByteToWrite,BytesWritten,@writeoverlapped) then
            begin
                ErrorCode:=GetLastError;
                if ErrorCode<>0 then
                begin
                    if ErrorCode=ERROR_IO_PENDING then
                    begin
                        StatusBar1.SimpleText := '端口忙,正在等待...';
                        while not GetOverlappedResult(Commhandle,writeoverlapped,BytesWritten,True) do
                        begin
                            ErrorCode:=GetLastError;
                            if ErrorCode=ERROR_IO_PENDING then
                                continue
                            else begin
                                ClearCommError(Commhandle,ErrorFlag,@CommStat);
                                showmessage('發送數據出錯');
                                CloseHandle(WriteOverlapped.hEvent);
                                CloseHandle(Commhandle);
                                btnOpenCom.Enabled :=True;
                                Exit;
                            end;
                         end;
                         AllBytesWritten:=AllBytesWritten+BytesWritten;
                    end
                    else begin
                        ClearCommError(Commhandle,ErrorFlag,@CommStat);
                        showmessage('發送數據出錯');
                        CloseHandle(WriteOverlapped.hEvent);
                        Receive :=False;
                        CloseHandle(Commhandle);
                        CloseHandle(PostEvent);
                        btnOpenCom.Enabled :=True;
                        Exit;
                    end;
                end;
            end;
        finally
            CloseHandle(writeoverlapped.hEvent);
        end;
    end;
    StatusBar1.SimpleText:='已經發送了Byte個數:'+IntToStr(ALLBytesWritten);
end;

procedure TForm1.btnReceiveDataClick(Sender: TObject);
var
    com_thread: Thandle;
    ThreadID:DWORD;

begin
    if not connected then
    begin
        StatusBar1.SimpleText := '未打開串口';
        Exit;
    end;

    ReceiveData :=0;
    Memo2.Clear;
    FillChar(ReadOs,SizeOf(ReadOs),0);
    ReadOs.Offset := 0;
    ReadOs.OffsetHigh := 0;

    // 建立通信監視線程
    Com_Thread:=CreateThread(nil,0,@CommWatch,nil,0,ThreadID);
    if (Com_Thread=0) then
        MessageBox(Handle,'No CreateThread!',nil,mb_OK);
        
    //設置DTR信號線
    EscapeCommFunction(Commhandle,SETDTR);
    StatusBar1.SimpleText := '正在接收數據...';
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人禁用看黄a在线| 欧美精品自拍偷拍| 在线成人免费视频| 国产片一区二区| 日韩综合在线视频| 91一区二区三区在线观看| 日韩免费高清视频| 亚洲一区国产视频| www.爱久久.com| 国产亚洲欧美日韩日本| 日本在线不卡视频| 欧美日韩视频不卡| 中文字幕在线一区二区三区| 老汉av免费一区二区三区| 在线观看日韩毛片| 综合激情成人伊人| 国产91综合网| 国产亚洲成aⅴ人片在线观看| 国产风韵犹存在线视精品| 91精品国产入口在线| 亚洲成人免费影院| 色婷婷国产精品久久包臀| 欧美国产精品中文字幕| 国产精品77777| 精品电影一区二区| 老色鬼精品视频在线观看播放| 欧美日韩精品免费| 亚洲妇熟xx妇色黄| 精品视频1区2区| 亚洲国产成人高清精品| 欧美视频中文字幕| 亚洲国产日韩综合久久精品| 欧美亚洲综合一区| 性久久久久久久久| 欧美高清dvd| 免费欧美在线视频| 欧美r级电影在线观看| 久久激情五月激情| 国产午夜亚洲精品理论片色戒| 国产盗摄女厕一区二区三区| 欧美国产精品一区二区| 99久久亚洲一区二区三区青草| 亚洲视频一区在线| 欧美亚洲日本国产| 日本欧美肥老太交大片| 欧美不卡视频一区| 国产精品一区二区在线观看网站 | 欧美精品aⅴ在线视频| 日韩av中文在线观看| 91精品国产入口| 国产很黄免费观看久久| 亚洲欧洲精品天堂一级| 欧美婷婷六月丁香综合色| 午夜电影一区二区三区| 欧美变态tickling挠脚心| 国产精品996| 一区二区三区四区在线| 欧美一区二区日韩一区二区| 国内精品伊人久久久久av影院| 国产精品无遮挡| 欧美性受xxxx黑人xyx性爽| 老司机免费视频一区二区| 国产香蕉久久精品综合网| 色综合中文字幕| 麻豆精品新av中文字幕| 国产精品福利一区| 91精品国产综合久久久蜜臀粉嫩| 国产在线精品免费av| 一区二区三区精品在线观看| 日韩一二三四区| 91麻豆精东视频| 精品一区二区日韩| 亚洲激情在线激情| 久久久精品黄色| 欧美日韩国产大片| 国产999精品久久| 日韩av一二三| 一区二区三区在线免费| 欧美精品一区二区三区蜜桃| 一本色道亚洲精品aⅴ| 男男gaygay亚洲| 一区二区在线观看免费| 久久久国产综合精品女国产盗摄| 欧美午夜精品免费| 成人福利电影精品一区二区在线观看| 日韩制服丝袜先锋影音| 日韩理论片在线| 久久精品人人做人人综合| 4hu四虎永久在线影院成人| 精品国产一区二区在线观看| 色国产综合视频| 丰满岳乱妇一区二区三区| 美女视频免费一区| 一区二区三区四区不卡在线 | 久久精品国产亚洲a| 亚洲精品免费在线| 国产欧美一区二区精品婷婷| 91精品国产91久久久久久最新毛片| av一本久道久久综合久久鬼色| 久久99精品国产麻豆婷婷洗澡| 亚洲一区二区在线观看视频| 国产精品你懂的在线欣赏| 2024国产精品视频| 日韩免费视频线观看| 欧美高清性hdvideosex| 欧美三级在线播放| 欧美在线视频日韩| 色狠狠综合天天综合综合| 波多野结衣中文字幕一区 | 久久午夜羞羞影院免费观看| 欧美一区二区三区四区五区| 欧美色爱综合网| 色av成人天堂桃色av| 99精品欧美一区二区三区综合在线| 国产一区二区伦理片| 黄色小说综合网站| 国产精品一区二区你懂的| 韩国欧美国产1区| 国产一区二区免费看| 国产精品一区久久久久| 国产精品综合一区二区| 国产一区二区不卡| 国产高清在线精品| 一区二区三区精密机械公司| 五月综合激情婷婷六月色窝| 亚洲一区二区三区不卡国产欧美| 精品国产乱码久久久久久闺蜜| 日韩一区二区三区免费观看| 亚洲女与黑人做爰| 亚洲精品成人在线| 亚洲一区二区精品3399| 午夜精品一区二区三区免费视频 | 国产午夜三级一区二区三| 久久日韩粉嫩一区二区三区| 国产欧美日韩麻豆91| 国产精品国产三级国产普通话三级| 国产精品久久久久天堂| 一区二区三区在线视频免费观看| 亚洲综合丁香婷婷六月香| 天天影视网天天综合色在线播放| 麻豆精品久久久| 风间由美一区二区三区在线观看 | 中文字幕精品一区二区精品绿巨人 | 欧美一区二视频| 久久久三级国产网站| 亚洲视频在线观看三级| 石原莉奈在线亚洲二区| 国内精品久久久久影院色| 国产91丝袜在线18| 欧美性受xxxx| 欧美xxx久久| 激情偷乱视频一区二区三区| 成人精品电影在线观看| 在线亚洲免费视频| 26uuu亚洲综合色| 亚洲欧美另类久久久精品2019| 日韩精品电影一区亚洲| 国产老妇另类xxxxx| 欧美色成人综合| 国产日韩精品一区二区三区在线| 亚洲精品欧美二区三区中文字幕| 免费av网站大全久久| 91小视频免费观看| 日韩精品一区二区三区中文不卡| 亚洲欧洲av一区二区三区久久| 日韩av在线发布| 91在线国产福利| 精品av综合导航| 亚洲高清在线精品| 成+人+亚洲+综合天堂| 91精品国产综合久久香蕉麻豆| 国产精品久久久久久久蜜臀| 免费观看久久久4p| 欧洲色大大久久| 国产精品狼人久久影院观看方式| 蜜桃一区二区三区在线| 欧美性生交片4| 亚洲人成网站精品片在线观看| 国产精品一二三| 欧美成人三级电影在线| 日韩专区一卡二卡| 色先锋资源久久综合| 欧美激情综合在线| 激情综合色综合久久综合| 欧美一区三区四区| 日日嗨av一区二区三区四区| 色久优优欧美色久优优| 欧美—级在线免费片| 韩国理伦片一区二区三区在线播放| 欧美日韩三级一区二区| 亚洲黄一区二区三区| a级精品国产片在线观看| 国产日产欧美一区二区三区| 精品在线视频一区| 欧美日本一道本| 亚洲一卡二卡三卡四卡| www.成人网.com| 亚洲欧洲日本在线| 成人97人人超碰人人99| 中文天堂在线一区|