<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al

      Delphi 中 串 行 通 信 的 實 現(xiàn)

      王 琛


      ---- 隨 著 現(xiàn) 代 信 息 技 術(shù) 的 發(fā) 展 以 及 計 算 機 網(wǎng) 絡(luò) 的 廣 泛 使 用, 計 算 機 通 信 技 術(shù) 已 經(jīng) 日 臻 成 熟, 但 串 行 通 信 作 為 一 種 靈 活 方 便 可 靠 的 通 信 方 式, 仍 不 失 為 有 效 的 通 信 手 段, 被 廣 泛 應(yīng) 用 于 工 業(yè) 控 制 中。 在 工 業(yè) 生 產(chǎn) 實 踐 中, 用PC 機 對 工 程 實 現(xiàn) 實 時 監(jiān) 控, 通 常 要 求PC 機 能 在 用 戶 界 面 上 具 有 數(shù) 據(jù) 采 集、 數(shù) 據(jù) 處 理 以 及 控 制 信 號 的 產(chǎn) 生 與 傳 輸 等 功 能。 在 這 種 特 定 的 環(huán) 境 下,PC 機 要 與 過 程 控 制 的 實 時 信 號 相 聯(lián) 系, 就 要 求 能 實 現(xiàn) 對PC 機 的 串 行 端 口 直 接 操 作。Borland 公 司 推 出 的Delphi 是 一 種 功 能 強 大 的 高 級 編 程 語 言, 其 具 有 的 可 視 化 面 向 對 象 的 特 性, 特 別 適 于 在Windows 環(huán) 境 下 圖 形 界 面 和 用 戶 程 序 的 編 制。 本 文 就 是 介 紹 基 于Windows95/NT 操 作 系 統(tǒng) 用Delphi 來 實 現(xiàn)PC 機 與 下 層PLC 控 制 器 之 間 的 串 口 通 信 方 法。

      基 于WIN95/NT 的 串 行 通 信 機 制

      ---- Windows 操 作 系 統(tǒng) 的 機 制 禁 止 應(yīng) 用 程 序 直 接 訪 問 計 算 機 硬 件, 但 它 為 程 序 員 提 供 了 一 系 列 的 標 準API 函 數(shù), 使 得 應(yīng) 用 程 序 的 編 制 更 加 方 便 并 且 免 除 了 對 有 關(guān) 硬 件 的 調(diào) 試 麻 煩。 在Windows95/NT 中, 原 來Windows3.X 的WM_COMMNOTIFY 消 息 已 被 取 消, 操 作 系 統(tǒng) 為 每 個 通 信 設(shè) 備 開 辟 了 用 戶 可 定 義 大 小 的 讀/ 寫 緩 沖 區(qū), 數(shù) 據(jù) 進 出 通 信 口 均 由 操 作 系 統(tǒng) 后 臺 完 成, 應(yīng) 用 程 序 只 需 對 讀/ 寫 緩 沖 區(qū) 操 作 即 可。WIN95/NT 中 幾 個 常 用 的 串 行 通 信 操 作 函 數(shù) 如 下:

      CreatFile 打 開 串 行 口
      CloseHandle 關(guān) 閉 串 行 口
      SetupComm 設(shè) 置 通 信 緩 沖 區(qū) 的 大 小
      ReadFile 讀 串 口 操 作
      WriteFile 寫 串 口 操 作
      SetCommState 設(shè) 置 通 信 參 數(shù)
      GetCommState 獲 取 默 認 通 信 參 數(shù)
      ClearCommError 清 除 串 口 錯 誤 并 獲 取 當(dāng) 前 狀 態(tài)

      ---- 除 上 述 幾 個 函 數(shù) 外, 還 要 經(jīng) 常 用 到 一 個 重 要 的 記 錄DCB( 設(shè) 備 控 制 塊)。DCB 中 記 錄 有 可 定 義 的 串 行 口 參 數(shù), 設(shè) 置 串 行 口 參 數(shù) 時 必 須 先 用GetCommState 函 數(shù) 將 系 統(tǒng) 默 認 值 填 入DCB 控 制 塊, 然 后 才 可 把 用 戶 想 改 變 的 自 定 義 值 設(shè) 定。

      ---- 在WIN95/NT 中 進 行 串 行 通 信 除 了 解 基 本 的 通 信 操 作 函 數(shù) 外, 還 要 掌 握 多 線 程 編 程。 線 程 是 進 程 內(nèi) 部 執(zhí) 行 的 路 徑, 是 操 作 系 統(tǒng) 分 配CPU 時 間 的 基 本 實 體。 每 個 進 程 都 由 單 線 程 開 始 完 成 應(yīng) 用 程 序 的 執(zhí) 行。 串 行 通 信 需 要 利 用 多 線 程 技 術(shù) 實 現(xiàn), 其 主 要 的 處 理 邏 輯 可 以 表 述 如 下: 進 程 一 開 始 先 由 主 線 程 做 一 些 必 要 的 初 始 化 工 作, 然 后 主 線 程 根 據(jù) 需 要 在 適 當(dāng) 時 候 建 立 通 信 監(jiān) 視 線 程 監(jiān) 視 通 信 口, 當(dāng) 指 定 的 串 行 口 事 件 發(fā) 生 時, 向 主 線 程 發(fā) 送WM_COMMNOTIFY 消 息( 由 于WIN95 取 消 了WM_COMMNOTIFY 消 息, 因 此 必 須 自 己 創(chuàng) 建), 主 線 程 對 其 進 行 處 理。 若 不 需 要WM_COMMNOTIFY 消 息, 則 主 線 程 終 止 通 信 監(jiān) 視 線 程。

      ---- 多 線 程 同 時 執(zhí) 行, 將 會 引 起 對 共 享 資 源 的 沖 突。 為 避 免 沖 突, 就 要 用 同 步 多 線 程 對 共 享 資 源 進 行 訪 問。WIN95 提 供 了 許 多 保 持 線 程 同 步 的 方 法, 筆 者 采 用 創(chuàng) 建 事 件 對 象 來 保 持 線 程 同 步。 通 過CraeteEvent() 創(chuàng) 建 事 件 對 象, 使 用SetEvent() 或PulseEvent() 函 數(shù) 將 事 件 對 象 設(shè) 置 成 信 號 同 步。 在 應(yīng) 用 程 序 中, 利 用WaitSingleObject() 函 數(shù) 等 待 同 步 的 觸 發(fā), 等 到 指 定 的 事 件 被 其 它 線 程 設(shè) 置 為 有 信 號 時, 才 繼 續(xù) 向 下 執(zhí) 行 程 序。

      Delphi 下 的 具 體 實 現(xiàn) 方 法

      ---- Delphi 的 強 大 功 能 和 支 持 多 線 程 的 面 向 對 象 編 程 技 術(shù), 使 得 實 現(xiàn) 串 行 通 信 非 常 簡 單 方 便。 它 通 過 調(diào) 用 外 部 的API 函 數(shù) 來 實 現(xiàn), 主 要 步 驟 如 下: 首 先, 利 用CreateFile 函 數(shù) 打 開 串 行 口, 以 確 定 本 應(yīng) 用 程 序 對 此 串 行 口 的 占 有 權(quán), 并 封 鎖 其 它 應(yīng) 用 程 序 對 此 串 口 的 操 作; 其 次, 通 過GetCommState 函 數(shù) 填 充 設(shè) 備 控 制 塊DCB, 再 通 過 調(diào) 用SetCommState 函 數(shù) 配 置 串 行 口 的 波 特 率、 數(shù) 據(jù) 位、 校 驗 位 和 停 止 位。 然 后, 創(chuàng) 建 串 行 口 監(jiān) 視 線 程 監(jiān) 視 串 行 口 事 件。 在 此 基 礎(chǔ) 上 就 可 以 在 相 應(yīng) 的 串 口 上 操 作 數(shù) 據(jù) 的 傳 輸; 最 后, 用CloseHandle 函 數(shù) 關(guān) 閉 串 行 口。 具 體 的 程 序 如 下, 本 程 序 用Delphi3.0 編 制 在Win95 環(huán)t 境 下 調(diào) 試 通 過, 已 投 入 實 際 應(yīng) 用 中, 供 廣 大 讀 者 參 考。

      ---- 程 序:

      unit comdemou;
      interface
      uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
      
      const
           Wm_commNotify=Wm_User+12;
      type
        TForm1 = class(TForm)
          procedure FormCreate(Sender: TObject);
        private
          Procedure comminitialize;
          Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;
          { Private declarations }
        public
          { Public declarations }
        end;
      
        // 線 程 聲 明
        TComm=Class(TThread)
        protected
           procedure Execute;override;
        end;
      
      var
        Form1: TForm1;
        hcom,Post_Event:Thandle;
        lpol:Poverlapped;
      implementation
      
      {$R *.DFM}
      
      Procedure TComm.Execute;    // 線 程 執(zhí) 行 過 程
      var
      dwEvtMask:Dword;
      Wait:Boolean;
      Begin
      fillchar(lpol,sizeof(toverlapped),0);
      While True do Begin
            dwEvtMask:=0;
            Wait:=WaitCommEvent(hcom,dwevtmask,lpol);      // 等 待 串 行 口 事 件;
            if Wait Then Begin
               waitforsingleobject(post_event,infinite);   // 等 待 同 步 事 件 置 位;
               resetevent(post_event);                     // 同 步 事 件 復(fù) 位;
               PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);// 發(fā) 送 消 息;
               end;
            end;
      end;
      
      procedure Tform1.comminitialize;                     // 串 行 口 初 始 化
      var
      lpdcb:Tdcb;
      Begin
      hcom:=createfile('com2',generic_read or generic_write,0,nil,open_existing,
                        file_attribute_normal or file_flag_overlapped,0);// 打 開 串 行 口
          if hcom=invalid_handle_value then
          else
             setupcomm(hcom,4096,4096);      // 設(shè) 置 輸 入, 輸 出 緩 沖 區(qū) 皆 為4096 字 節(jié)
              getcommstate(hcom,lpdcb);        // 獲 取 串 行 口 當(dāng) 前 默 認 設(shè) 置
              lpdcb.baudrate:=2400;
              lpdcb.StopBits:=1;
              lpdcb.ByteSize:=8;
              lpdcb.Parity:=EvenParity;             // 偶 校 驗
              Setcommstate(hcom,lpdcb);
              setcommMask(hcom,ev_rxchar); 
           // 指 定 串 行 口 事 件 為 接 收 到 字 符;
      end;
      
      Procedure TForm1.MsgcommProcess(Var Message:Tmessage);
      var
      Clear:Boolean;
      Coms:Tcomstat;
      cbNum,ReadNumber,lpErrors:Integer;
      Read_Buffer:array[1..100]of char;
      Begin
      Clear:=Clearcommerror(hcom,lpErrors,@Coms);
      if Clear Then Begin
         cbNum:=Coms.cbInQue;
         ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);
         // 處 理 接 收 數(shù) 據(jù)
         SetEvent(Post_Event);                     // 同 步 事 件 置 位
         end;
      end;
      
      procedure TForm1.FormCreate(Sender: TObject);
      begin
      comminitialize;
      post_event:=CreateEvent(nil,true,true,nil); // 創(chuàng) 建 同 步 事 件;
      Tcomm.Create(False);            // 創(chuàng) 建 串 行 口 監(jiān) 視 線 程;
      end;
      
      end.
      

      ---- 南 京 理 工 大 學(xué) 經(jīng) 濟 管 理 學(xué) 院96 研 究 生 210094 王 琛
      ---- 聯(lián) 系 電 話:025-4315011-405 或025-8760087 CALL 39787( 中 文)

       


       

       

      主站蜘蛛池模板: 精品人妻伦一二三区久久| 狠狠亚洲色一日本高清色| 国产不卡一区二区三区视频| 亚洲精品成人无限看| 欧美在线观看www| 亚洲男女羞羞无遮挡久久丫 | 国产精品小一区二区三区| 久久综合色一综合色88| 久久精品国产亚洲αv忘忧草| 久久人人97超碰人人澡爱香蕉| 天天看片视频免费观看| 国产精品久久久久久久9999| 青青草原国产AV福利网站| 黄色A级国产免费大片视频| www久久只有这里有精品| 无码激情亚洲一区| 久久九九99这里有视频| 国产蜜臀视频一区二区三区| 61精品人妻一区二区三区| 国产裸体无遮挡免费精品| 色爱av综合网国产精品| 蜜臀98精品国产免费观看| 17岁日本免费bd完整版观看| 欧美高清一区三区在线专区| 另类 专区 欧美 制服| 日本第一区二区三区视频| 人妻精品久久无码专区精东影业| 唐人社视频呦一区二区| 亚洲欧美偷国产日韩| 国产亚洲精品AA片在线爽| 四虎精品视频永久免费| 真人性囗交视频| 国产一区日韩二区欧美三区| 国产suv精品一区二区四| 亚洲精品一区二区动漫| 亚洲精品动漫免费二区| 精品一区二区不卡免费| 一区二区三区鲁丝不卡| 亚洲av永久无码精品网站| 日韩有码中文字幕av| 欧美成人精品三级在线观看|