亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
色综合久久88色综合天天6| 欧美日韩亚洲高清一区二区| 天天做天天摸天天爽国产一区| 亚洲欧洲成人av每日更新| 国产偷国产偷亚洲高清人白洁| 2欧美一区二区三区在线观看视频| 欧美日本国产一区| 91精品国产aⅴ一区二区| 91精品国产全国免费观看 | 欧美激情一区二区三区蜜桃视频 | 777欧美精品| 日韩一区二区三区在线视频| 久久在线观看免费| 日本一区二区三区电影| 亚洲三级在线观看| 日韩电影一二三区| 国产综合久久久久影院| 丰满亚洲少妇av| 色八戒一区二区三区| 91精品婷婷国产综合久久竹菊| 日韩欧美亚洲国产另类| 国产欧美精品日韩区二区麻豆天美| 亚洲欧美综合色| 婷婷综合另类小说色区| 国产美女一区二区| 91污片在线观看| 日韩视频永久免费| 国产精品久线在线观看| 午夜一区二区三区视频| 国产精品一线二线三线精华| 色综合久久天天| 欧美一区二区三区日韩| 亚洲国产激情av| 亚洲成av人片在线观看无码| 国产福利一区二区三区| 欧美色国产精品| 久久亚洲一区二区三区四区| 亚洲制服丝袜av| 国产乱对白刺激视频不卡| 欧美日韩中文国产| 日本一区二区综合亚洲| 日韩电影在线一区| 色综合久久久久| 久久精品视频在线看| 日韩精品亚洲一区二区三区免费| 国产91富婆露脸刺激对白| 欧美日韩激情一区二区三区| 国产精品丝袜久久久久久app| 日本在线观看不卡视频| 99久久国产综合精品女不卡 | 国产xxx精品视频大全| 欧美精品丝袜久久久中文字幕| 国产精品乱码久久久久久| 久久精品国产99国产| 欧美人妖巨大在线| 亚洲一区中文在线| 99久久免费视频.com| 久久久国产精华| 蜜桃在线一区二区三区| 69堂精品视频| 亚洲一二三四久久| 色天使色偷偷av一区二区| 国产精品国产三级国产普通话蜜臀| 美女视频网站黄色亚洲| 欧美一区三区四区| 日韩精品三区四区| 欧美精品丝袜中出| 天堂一区二区在线| 欧美日韩二区三区| 亚洲一区二区在线观看视频| 99久久久免费精品国产一区二区| 久久久精品影视| 国产精品一卡二卡在线观看| 久久蜜桃av一区精品变态类天堂| 麻豆传媒一区二区三区| 精品国产成人系列| 久草精品在线观看| 国产亚洲污的网站| 粉嫩一区二区三区性色av| 国产女人水真多18毛片18精品视频| 国产一区二区三区在线观看免费视频| 久久婷婷久久一区二区三区| 国产在线看一区| 国产精品视频一区二区三区不卡| 成人黄页在线观看| 亚洲综合成人在线| 欧美一区二区日韩一区二区| 蜜臀久久久久久久| 久久午夜国产精品| 成人网在线免费视频| 亚洲精品成人在线| 欧美高清www午色夜在线视频| 日本网站在线观看一区二区三区 | 亚洲成人免费视| 91精品国产aⅴ一区二区| 国产综合久久久久久鬼色| 国产精品网站导航| 欧美亚洲一区三区| 狠狠色丁香久久婷婷综| 国产精品你懂的在线欣赏| 日本高清不卡一区| 久久99久久99小草精品免视看| 久久久久久久久久久久久女国产乱 | 五月激情综合网| 26uuu另类欧美亚洲曰本| 97精品超碰一区二区三区| 偷拍亚洲欧洲综合| 欧美国产日韩亚洲一区| 欧美三级三级三级爽爽爽| 激情深爱一区二区| 亚洲乱码日产精品bd | 国产一区二区三区香蕉| 亚洲色欲色欲www在线观看| 在线成人免费观看| 97精品久久久久中文字幕| 免费美女久久99| 亚洲美女在线国产| 精品久久国产老人久久综合| 一本色道a无线码一区v| 国产美女精品在线| 无码av免费一区二区三区试看 | 色婷婷综合久久久中文字幕| 美女视频黄 久久| 亚洲在线成人精品| 国产女人18水真多18精品一级做| 欧美日韩国产a| 99精品在线免费| 国产一区二区三区不卡在线观看 | 精品影院一区二区久久久| 亚洲男同性视频| 久久久国产精品午夜一区ai换脸| 在线电影一区二区三区| 91在线免费播放| 国产成人精品一区二区三区四区| 美女性感视频久久| 亚洲国产精品久久久久婷婷884| 中文字幕精品一区二区精品绿巨人| 日韩亚洲欧美成人一区| 91.xcao| 欧美精品色综合| 欧美日韩一区二区欧美激情| 色综合中文综合网| 欧美日韩极品在线观看一区| 成人激情av网| 国产 欧美在线| 国产在线精品一区二区三区不卡 | 欧美一区二区视频免费观看| 精品视频色一区| 欧美丝袜第三区| 欧美日韩精品一区二区三区蜜桃 | 国产亚洲欧美日韩在线一区| 日韩欧美成人午夜| 日韩久久久久久| 欧美成人伊人久久综合网| 日韩视频一区二区| 欧美一级黄色大片| 精品入口麻豆88视频| 精品国产凹凸成av人导航| 26uuu成人网一区二区三区| 日韩免费观看2025年上映的电影| 欧美一区二区三区男人的天堂| 欧美久久久久中文字幕| 在线不卡一区二区| 欧美tickling网站挠脚心| 精品国免费一区二区三区| 久久精品一区蜜桃臀影院| 国产欧美日韩三级| 亚洲视频免费在线观看| 亚洲一区二区精品3399| 奇米一区二区三区av| 国产精品一线二线三线精华| 不卡电影一区二区三区| 色女孩综合影院| 欧美一区二区三区日韩视频| 国产亚洲短视频| 亚洲精品视频一区| 日韩电影在线一区二区| 国产一区二区三区在线观看免费| 99久久综合色| 555www色欧美视频| 26uuu成人网一区二区三区| 成人免费小视频| 视频一区欧美精品| 国产成人免费视频一区| 一本色道久久综合亚洲aⅴ蜜桃| 91精品欧美综合在线观看最新 | 亚洲色图视频网站| 免费在线一区观看| 成人精品免费视频| 欧美疯狂做受xxxx富婆| 国产欧美日韩不卡免费| 亚洲第一搞黄网站| 国产成人夜色高潮福利影视| 欧美日韩国产综合一区二区 | 日韩欧美国产高清| 亚洲欧美日韩国产综合在线 | 国产视频视频一区| 亚洲二区在线视频| 成人福利电影精品一区二区在线观看 | 中文字幕日韩欧美一区二区三区|