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

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

?? communate.pas

?? Delphi利用API函數進行串口通信
?? PAS
字號:
unit communate;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
const
  WM_COMMNOTIFY=WM_USER+1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
procedure WMCOMMNOTIFY(var Message:TMessage);
message WM_COMMNOTIFY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  hNewCommFile,Post_Event:THandle;
  Read_os:Toverlapped;
  Receive:Boolean;
  ReceiveData:Dword;

procedure AddToMemo(Str:PChar;Len:Dword);begin
  str[Len]:=#0;
  Form1.RichEdit1.Text:=Form1.RichEdit1.Text+StrPas(str);
end;




procedure CommWatch(Ptr:Pointer);stdcall;
var
  dwEvtMask,dwTranser:Dword;
  OK:Boolean;
  Os:Toverlapped;
begin
  Receive:=True;
  FillChar(Os,SizeOf(Os),0);
  Os.hEvent:=CreateEvent(nil,True,False,nil);
  //創建重疊讀事件對象
  if Os.hEvent=null then
    begin
      MessageBox(0,'Os.Event Create Error!','Notice',MB_OK);
      exit;
    end;
  if(not SetCommMask(hNewCommFile,EV_RXCHAR)) then
    begin
      MessageBox(0,'SetCommMask Error!','Notice',MB_OK);
      exit;
    end;
  while(Receive) do
    begin
      dwEvtMask:=0;
      //等待設置好的通信事件發生,由于有個Os(Os:Toverlapped),
      //表示進行的是overlapped等待,不會被這個等待堵塞住
      if not WaitCommEvent(hNewCommFile,dwEvtMask,@Os) then
        begin
          if ERROR_IO_PENDING=GetLastError then
            GetOverLappedResult(hNewCommFile,Os,dwTranser,True)
        end;
      if((dwEvtMask and EV_RXCHAR)=EV_RXCHAR) then
        begin
          WaitForSingleObject(Post_event,INFINITE);
          //等待允許傳遞WM_COMMNOTIFY通信消息
          ResetEvent(Post_Event);
          //處理WM_COMMNOTIFY消息,不再發送WM_COMMNOTIFY消息
          OK:=PostMessage(Form1.Handle,WM_COMMNOTIFY,hNewCommFile,0);
          //傳遞WM_COMMNOTIFY通信消息
          if (not OK) then
            begin
              MessageBox(0,'PostMessage Error!','Notice',MB_OK);
              exit;
            end;
        end;


  end;
  CloseHandle(Os.hEvent);
      //關閉重疊讀事件對象




end;



//消息處理函數
procedure TForm1.WMCOMMNOTIFY(var Message:TMessage);
var
  CommState:ComStat;
  dwNumberOfBytesRead:Dword;
  ErrorFlag:Dword;
  InputBuffer:Array[0..1024]of Char;
begin
  //ClearCommError回復通信錯誤信息并報告當前的通信設備狀態。
  //當通信錯誤發生時調用此函數,它會清除附加的I/O操作的設備錯誤標志
  if not ClearCommError(hNewCommFile,ErrorFlag,@CommState) then
    begin
      MessageBox(0,'ClearCommError!','Notice',MB_OK);
      PurgeComm(hNewCommFile,Purge_Rxabort or Purge_Rxclear);
      exit;
    end;
  if(CommState.cbInQue>0)then
    begin
      fillchar(InputBuffer,CommState.cbInQue,#0);
      //接收通信數據
      if (not ReadFile(hNewCommFile,InputBuffer,CommState.cbInQue,
          dwNumberOfBytesRead,@Read_Os))then
          begin
            ErrorFlag:=GetLastError();
            if(ErrorFlag<>0)and(ErrorFlag<>ERROR_IO_PENDING)then
              begin
                MessageBox(0,'ReadFile Error!','Notice',MB_OK);
                Receive:=False;
                CloseHandle(Read_Os.hEvent);
                CloseHandle(Post_Event);
                CloseHandle(hNewCommFile);
                exit;
              end
            else
              begin
                WaitForSingleObject(hNewCommFile,INFINITE);
                //等待操作完成,等待設置好的Event的發生
                GetOverlappedResult(hNewCommFile,Read_Os,
                               dwNumberOfBytesRead,False);
              end;
            end;
          if dwNumberOfBytesRead>0 then
            begin
              Read_Os.Offset:=Read_Os.Offset+dwNumberOfBytesRead;
              ReceiveData:=Read_Os.Offset;
              AddToMemo(InputBuffer,dwNumberOfBytesRead);
              //處理接收的數據
            end;
    end;
      SetEvent(Post_Event);
      //允許發送下一個WM_COMMNOTIFY消息
    end;

//打開文件用于發送
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
      Button3.Enabled:=False;
      Button4.Enabled:=False;
      RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
    end;
    Button1.Enabled:=False;
end;
//發送數據
procedure TForm1.Button2Click(Sender: TObject);
var
  dcb:TDCB;
  Error:Boolean;
  dwNumberOfBytesWritten,dwNumberOfBytesToWrite,
          ErrorFlag,dwWhereToStartWriting:DWORD;
  pDataToWrite:PChar;
  Write_Os:Toverlapped;
begin
  Form1.Caption:='';
  hNewCommFile:=CreateFile('COM4',GENERIC_WRITE,0,nil,OPEN_EXISTING,
                               FILE_FLAG_OVERLAPPED,0);
  //打開通信端口COM4
  if hNewCommFile=INVALID_HANDLE_VALUE then
      MessageBox(0,'Error opening com port!','Notice',MB_OK);
  SetupComm(hNewCommFile,1024,1024);
  //設置緩沖區大小及主要通信參數
  GetCommState(hNewCommFile,dcb);
  //設置COM口的Data Control Block的屬性
  dcb.BaudRate:=115200;
  dcb.ByteSize:=8;
  dcb.Parity:=NOPARITY;
  dcb.StopBits:=ONESTOPBIT;
  Error:=SetCommState(hNewCommFile,dcb);
  if(not Error)then
    MessageBox(0,'SetCommState Error!','Notice',MB_OK);
  dwWhereToStartWriting:=0;
  dwNumberOfBytesWritten:=0;
  dwNumberOfBytesToWrite:=RichEdit1.GetTextLen;
  if(dwNumberOfBytesToWrite=0)then
    begin
      ShowMessage('Text Buffer is Empty!');
      exit;
    end
  else
    begin
      pDataToWrite:=StrAlloc(dwNumberOfBytesToWrite+1);
      try
        RichEdit1.GetTextBuf(pDataToWrite,dwNumberOfBytesToWrite);
        Label1.Font.Color:=clRed;
        FillChar(Write_Os,SizeOf(Write_Os),0);
        //為重疊寫創建事件對象
        Write_Os.hEvent:=CreateEvent(nil,True,False,nil);
        SetCommMask(hNewCommFile,EV_TXEMPTY);
        //用來表示對EV_TXEMPTY事件感興趣,有Char來到的時候系統會通知
        Label1.Caption:='正在發送數據...!';
        repeat
          Label1.Repaint;
          //發送通信數據
          if not WriteFile(hNewCommFile,pDataToWrite[dwWhereToStartWriting],
                dwNumberOfBytesToWrite,dwNumberOfBytesWritten,@Write_Os)then
          begin
            ErrorFlag:=GetLastError;
            if ErrorFlag<>0 then
              begin
                if ErrorFlag=ERROR_IO_PENDING then
                  begin
                    WaitForSingleObject(Write_Os.hEvent,INFINITE);
                    //等待設置好的Event的發生
                    GetOverlappedResult(hNewCommFile,Write_Os,
                              dwNumberOfBytesWritten,False);
                  end
                else
                  begin
                    MessageBox(0,'WriteFile 錯誤!','Notice',MB_OK);
                    Receive:=False;
                    CloseHandle(Read_Os.hEvent);
                    CloseHandle(Post_Event);
                    CloseHandle(hNewCommFile);
                    exit;
                  end;
              end;
            end;
          Dec(dwNumberOfBytesToWrite,dwNumberOfBytesWritten);
          Inc(dwWhereToStartWriting,dwNumberOfBytesWritten);
          //寫整個事情(Write the whole thing)
        until(dwNumberOfBytesToWrite<=0);
        Form1.Caption:=IntToStr(dwWhereToStartWriting);
      finally
        StrDispose(pDataToWrite);
      end;
      CloseHandle(hNewCommFile);
    end;
  Label1.Font.Color:=clBlack;
  Label1.Caption:='發送成功';
  Button1.Enabled:=True;
  Button3.Enabled:=True;
  Button4.Enabled:=True;
end;

//接收處理
procedure TForm1.Button3Click(Sender: TObject);
var
  OK:Boolean;
  dcb:TDCB;
  com_thread:Thandle;
  ThreadID:DWORD;
begin
  ReceiveData:=0;
  Button1.Enabled:=False;
  Button2.Enabled:=False;
  RichEdit1.Clear;
  //打開COM4
  hNewCommFile:=CreateFile('COM4',GENERIC_READ,0,nil,OPEN_EXISTING,
                            FILE_FLAG_OVERLAPPED,0);
  if hNewCommFile=INVALID_HANDLE_VALUE then
    begin
      MessageBox(0,'打開COM端口錯誤!','Notice',MB_OK);
      exit;
    end;
  Ok:=SetCommMask(hNewCommFile,EV_RXCHAR);
  if (not Ok)then
    begin
      MessageBox(0,'SetCommMask 錯誤!','Notice',MB_OK);
      exit;
    end;
  SetupComm(hNewCommFile,1024,1024);
  //設置緩沖區大小及主要通信參數
  GetCommState(hNewCommFile,dcb);
  dcb.BaudRate:=115200;
  dcb.ByteSize:=8;
  dcb.Parity:=NOPARITY;
  dcb.StopBits:=ONESTOPBIT;
  Ok:=SetCommState(hNewCommFile,dcb);
  if (not Ok)then
    MessageBox(0,'SetCommState 錯誤!','Notice',MB_OK);
  FillChar(Read_Os,SizeOf(Read_Os),0);
  Read_Os.Offset:=0;
  Read_Os.OffsetHigh:=0;
  //創建Overlapped Read事件
  Read_Os.hEvent:=CreateEvent(nil,true,False,nil);
  if Read_Os.hEvent=null then
    begin
      CloseHandle(hNewCommFile);
      MessageBox(0,'CreateEvent 錯誤!','Notice',MB_OK);
      exit;
    end;
  //創建PostMessage事件
  Post_Event:=CreateEvent(nil,True,True,nil);
  if Post_Event=null then
    begin
      CloseHandle(hNewCommFile);
      CloseHandle(Read_Os.hEvent);
      MessageBox(0,'CreateEvent 錯誤!','Notice',MB_OK);
      exit;
    end;
    Com_Thread:=CreateThread(nil,0,@CommWatch,nil,0,ThreadID);
    //建立通信監視線程
    if(Com_Thread=0)then
      MessageBox(Handle,'CreateThread函數不起作用!',nil,MB_OK);
      EscapeCommFunction(hNewCommFile,SETDTR);
      Label1.Font.Color:=clRed;
      Label1.Caption:='正在接收數據...!';
  end;

//停止通信處理
procedure TForm1.Button4Click(Sender: TObject);
begin
  Label1.Font.Color:=clBlack;
  Label1.Caption:='已停止通信';
  Form1.Caption:=IntToStr(ReceiveData);
  Receive:=False;
  CloseHandle(Read_Os.hEvent);
  CloseHandle(Post_Event);
  CloseHandle(hNewCommFile);
  Button1.Enabled:=True;
  Button2.Enabled:=True;
end;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
youjizz国产精品| 一区二区在线观看视频在线观看| 91成人免费网站| 成人久久18免费网站麻豆 | 国产乱码一区二区三区| 秋霞成人午夜伦在线观看| 亚洲一区二区三区四区中文字幕| 中文字幕亚洲欧美在线不卡| 亚洲丝袜自拍清纯另类| 日韩一区有码在线| 亚洲日本电影在线| 亚洲一区二区在线视频| 午夜精品视频在线观看| 男女性色大片免费观看一区二区 | 欧美男男青年gay1069videost| 99re这里都是精品| 在线观看亚洲一区| 欧美一区二区高清| 久久蜜桃av一区二区天堂| 国产欧美精品区一区二区三区 | 亚洲国产精品久久人人爱蜜臀| 亚洲国产日日夜夜| 久久精品国产一区二区| 成人网在线播放| 色婷婷香蕉在线一区二区| 91精品国产综合久久久久久漫画| 日韩欧美在线不卡| 国产精品欧美极品| 亚洲va韩国va欧美va| 久久er精品视频| av资源网一区| 日韩视频免费观看高清完整版 | 91免费看`日韩一区二区| 欧美在线小视频| 久久精品视频在线看| 亚洲视频每日更新| 激情图区综合网| 色吧成人激情小说| 久久亚洲一级片| 亚洲国产aⅴ天堂久久| 国产精品一区二区不卡| 欧美日产在线观看| 国产精品久久久久久久久久久免费看 | 日韩一级完整毛片| 亚洲人成网站影音先锋播放| 激情久久五月天| 欧美午夜精品久久久久久孕妇| 国产亚洲精品7777| 爽好多水快深点欧美视频| 99视频一区二区| 久久影院电视剧免费观看| 婷婷综合另类小说色区| 不卡影院免费观看| 久久一区二区三区国产精品| 日韩福利电影在线| 欧美性生活大片视频| 国产精品久久一卡二卡| 美女www一区二区| 欧美色图在线观看| 日韩一区有码在线| 成人激情小说网站| 国产视频一区二区在线| 蜜臀av性久久久久蜜臀aⅴ| 日本高清成人免费播放| 中文字幕一区二区三区蜜月| 床上的激情91.| 国产喂奶挤奶一区二区三区 | 久久久久久日产精品| 日本美女一区二区| 欧美酷刑日本凌虐凌虐| 亚洲第一av色| 欧美日韩情趣电影| 五月天一区二区三区| 在线视频你懂得一区| 一区二区三区在线观看视频| aaa亚洲精品| 一区二区三区欧美视频| 97超碰欧美中文字幕| 国产精品对白交换视频| 99久久综合国产精品| 一区在线观看免费| 在线观看欧美日本| 日韩1区2区日韩1区2区| 91精品国模一区二区三区| 蜜桃视频在线观看一区| 26uuu国产电影一区二区| 国产一区二区三区不卡在线观看 | 91玉足脚交白嫩脚丫在线播放| 国产精品乱码一区二区三区软件| 成人永久aaa| 亚洲精品中文在线| 在线不卡欧美精品一区二区三区| 天天色图综合网| 日韩精品专区在线| 成人综合婷婷国产精品久久免费| 亚洲色图一区二区| 欧美精品久久一区二区三区| 免费成人av在线| 国产亚洲制服色| 91黄色激情网站| 蜜臀国产一区二区三区在线播放| 精品伦理精品一区| 91黄视频在线| 激情六月婷婷久久| 伊人夜夜躁av伊人久久| 欧美一区二区不卡视频| 国产超碰在线一区| 日韩中文字幕麻豆| 国产亚洲欧美日韩在线一区| 欧美羞羞免费网站| 国产福利一区在线| 视频一区二区中文字幕| 国产精品美女久久久久久久久| 欧美三级中文字幕在线观看| 国产二区国产一区在线观看| 亚洲国产精品人人做人人爽| 日本一区二区三区dvd视频在线| 欧美日韩一区二区三区视频 | 国产精品久久久久久久浪潮网站| 欧美中文字幕不卡| 国产suv一区二区三区88区| 亚洲va中文字幕| 成人免费在线播放视频| 精品剧情在线观看| 欧美日韩和欧美的一区二区| 成人黄色电影在线| 国产做a爰片久久毛片| 亚洲r级在线视频| 亚洲免费大片在线观看| 国产欧美一区二区精品忘忧草| 欧美高清精品3d| 色综合天天综合网天天狠天天| 国产一区二区三区四| 亚洲一区二区三区中文字幕| 中文字幕乱码日本亚洲一区二区| 欧美一级专区免费大片| 欧美日韩午夜在线视频| 91在线视频播放| 粉嫩aⅴ一区二区三区四区| 精品一区二区在线看| 日韩制服丝袜先锋影音| 亚洲国产成人av| 亚洲午夜电影在线| 亚洲精品日日夜夜| 亚洲人快播电影网| 亚洲三级小视频| 成人欧美一区二区三区小说| 国产精品国产馆在线真实露脸| 26uuu国产一区二区三区| 精品国产三级a在线观看| 欧美一区二区三区啪啪| 日韩午夜三级在线| 日韩精品一区二区三区在线观看| 欧美一级专区免费大片| 日韩美女在线视频| 欧美成人免费网站| 久久亚洲一区二区三区明星换脸| 久久久影院官网| 国产精品日日摸夜夜摸av| 中文在线免费一区三区高中清不卡| 国产网站一区二区| 国产精品天美传媒| 亚洲少妇屁股交4| 亚洲国产精品一区二区www在线 | 久久久久久久网| 国产精品久久久久天堂| 亚洲免费观看高清完整版在线观看| 亚洲激情综合网| 首页国产丝袜综合| 国产乱码一区二区三区| 波多野洁衣一区| 欧美视频完全免费看| 欧美一二三四在线| 国产日韩av一区二区| 亚洲一区二区三区在线| 美女视频网站久久| 成人综合婷婷国产精品久久免费| 色综合久久久久| 欧美一区二区在线免费观看| 国产三级精品三级在线专区| 亚洲免费av高清| 免费观看日韩电影| 成年人国产精品| 91精品国产综合久久香蕉的特点 | 亚洲午夜羞羞片| 国产在线日韩欧美| 一本色道久久综合狠狠躁的推荐 | 99精品国产99久久久久久白柏| 欧美三级在线播放| 久久综合久久鬼色| 亚洲色图20p| 韩国一区二区三区| 91福利在线播放| 久久精品一区蜜桃臀影院| 亚洲一区二区三区影院| 成人免费毛片片v| 日韩欧美国产电影| 亚洲综合激情网| 国产不卡在线视频| 欧美变态tickling挠脚心|