天天看點

用Pcomm Pro開發串行通信程式

用C + +Builder 在Win9x 下 開 發 串 行 通 信 程 序 是 程 序 員 們 經 常 遇 到 卻 又 令 人 頭 痛 的 事 情, 不 但 要 理 解 許 多 複 雜 的API 函 數, 還 要 掌 握 多 線 程 編 程。 令 人 欣 慰 的 是 有 一 些 公 司 專 門 為C + +Builder 開 發 了 編 寫 串 行 通 信 程 序 的 開 發 工 具, 例 如MOXA 公 司 的Pcomm( 該 軟 件 可 在http:\\www.moxa.com.tw 下 載), 因 而 幫 我 們 解 決 了 串 行 編 程 這 一 難 題。

----下 面 結 合 一 個 具 體 的 例 子 來 說 明 串 行 通 信 程 序 的 開 發。 本 程 序 的 編 程 環 境 是Win98 和C + +Builder3.0。 這 個 編 程 示 例 的 功 能 比 較 強, 它 具 有 發 送 數 據 和 自 動 接 收 數 據 的 雙 重 功 能。 在 它 的 基 礎 上 稍 加 修 改, 即 可 以 讓 用 戶 選 定 進 行 傳 輸 的 通 信 端 口, 并 設 定 這 個 端 口 的 相 關 參 數, 包 括 波 特 率、 數 據 位、 停 止 位、 奇 偶 校 驗 和 流 量 控 制 等。

一、 Pcomm 的 設 置

----啟 動C + +Builder3.0, 點 擊File/New Application, 建 立 一 個 項 目 文 件, 修 改 表 單 的Name 屬 性 為Comm, 然 後 存 盤, 命 名 項 目(Project) 為CommTest, 命 名 單 元(Unit) 為Comm。

----Pcomm Library 是 一 個 動 态 連 接 庫(DLL) 文 件, 當 使 用C + +Builder 編 譯 器 編 譯PComm.dll 庫 時, 我 們 必 須 告 訴C + +Builder 的 編 譯 器 怎 樣 找 到 這 些 函 數(sio_xxx())。

----因 此 我 們 用PComm Pro 在Borland C + +Builder 中 開 發 一 個 串 行 程 序 時, 必 須 做 到 以 下 兩 點:

假 如 你 的Pcomm Pro 是 安 裝 在c:\Program files( 缺 省 安 裝 目 錄) 目 錄 下, 把c:\Program files \ Pcomm Pro \ Lib 下 的Pcommb.lib 文 件 加 入 到C + +Builder 的View 菜 單 中Project Manager 的 項 目 中, 使 之 成 為 項 目 的 一 個 單 元(unit)。

把 #include "c:\Program files\PcommPro\Lib\PComm.h" 包 含 在 你 的Comm.cpp 中。

二、 表 單 及 屬 性 的 設 置

----如 圖1 中 表 單 所 示:

----依 照 圖1 中 主 界 面 來 添 加 控 件, 并 依 照 表1 中 的 設 置 來 設 置 各 控 件 的Name 和Caption 屬 性。

----該 通 信 程 序 的 工 作 原 理 為 中 斷 方 式, 即 當 輸 入 緩 存 内 有 數 據 時, 就 會 觸 發Pcomm 的 中 斷 函 數sio_cnt_irq (Port, *CntIrq, count), 再 由 它 啟 動 中 斷 服 務 程 序CntIrq(), 然 後 由 數 據 接 收 函 數sio_read (port, ibuf, len) 來 接 收 數 據 并 做 其 他 相 應 的 處 理; 至 于 函 數 Open ()、Sent ()、Close () 則 分 别 為 打 開 按 鈕、 發 送 按 鈕、 關 閉 按 鈕 的click 事 件 函 數;SendData、 ReceiveData 分 别 為 發 送 數 據 編 輯 框 和 接 收 數 據 編 輯 框 相 對 應 的 字 符 串 變 量。

三、 主 程 序 的 編 制

----雙 擊 表 單 上 的Button 控 件, 就 會 産 生 相 應 的 事 件, 如 雙 擊" 打 開" 按 鈕, 就 會 産 生Open() 事 件 函 數。 在 這 些 函 數 中 添 加 代 碼, 以 及Pcomm Pro 的 串 行 控 制 函 數, 就 能 實 現 對 串 口 事 件 的 處 理。 其 中 一 個 需 要 注 意 的 問 題 是SendData 和ReceiveData 都 為 AnsiString 字 符 串, 而Pcomm Pro 的 函 數 所 需 發 送 和 接 收 的 字 符 串 都 為 char 型, 因 此 要 正 确 使 用Pcomm 函 數, 還 要 注 意 字 符 串 轉 換。AnsiString 字 符 串 可 通 過c_str() 函 數 轉 換 為char 型, 而char 行 字 符 串 轉 換 為 AnsiString 則 比 較 簡 單。 可 用AnsiString(char) 把char 型 強 制 轉 換 為AnsiString 型。 程 序 主 要 代 碼 如 下 所 示:

void __fastcall TComm::Open (TObject *Sender)

// 串 口 打 開 函 數

{

int i;

sio_open (port); // 打 開 串 口

sio_ioctl (port, B2400, P_NONE | BIT_7 | STOP_1 );

// 設 置 串 口 參 數

 // 包 括 波 特 率、數 據 位、停 止 位、奇 偶 校 驗

void __stdcall ( *p)(int);

p=cntirq;

i=sio_cnt_irq(port, *p,1);// 設 置 中 斷 函 數

}

// - - - - - - - - - - - - - - - - -

void __fastcall TComm::Sent (TObject *Sender)

// 數 據 發 送 函 數

{

char *SendData=new char[20];

SendData=SentEdit ->Text.c_str();

// 把SendEdit 中 的AnsiString 型 字

符 串 轉 換 為char 型

sio_write(port,SendData,20); // 發 送 數 據

}

// - - - - - - - - - - - - - - - - -

void __fastcall TComm::Close (TObject *Sender)

// 串 口 關 閉 函 數

{

sio_close (port); // 關 閉 串 口

}

// - - - - - - - - - - - - - - - - -

void __stdcall cntirq(int port)

// 中 斷 服 務 函 數( 手 工 生 成 函 數)

{

char ibuf[20];

AnsiString ReceiveData[20];

sio_read (port,ibuf, 20); // 接 收 數 據

ReceiveData = Ansistring(ibuf);

//char 字 符 串 轉 換AnsiString 型 字 符 串

ReceiveEdit ->Text=ReceiveData;

// 顯 示 接 受 到 的 字 符 串

}

----在 程 序 中, 我 們 使 用 了 一 些sio_xxx() 型 的 函 數, 它 們 都 是Pcomm pro 自 帶 的 串 行 通 信 函 數( 函 數 的 具 體 用 法 可 以 參 考Pcomm pro 的 幫 助), 通 過 這 些 函 數, 我 們 可 以 對 串 行 端 口 進 行 設 置。

----sio_open(port) 和sio_close(port) 為 打 開 串 口 和 關 閉 串 口 函 數, 參 數port 可 設 置 具 體 操 作 的 串 口;sio_ ioctl(int port, int baud, int mode) 為 串 口 控 制 函 數, 可 設 置 串 口 的 波 特 率、 數 據 位、 停 止 位、 奇 偶 校 驗; 至 于sio_write(port) 和sio_read(port), 則 為 讀 串 口 和 寫 串 口 函 數;sio_

cnt_irq(int port,VOID (CALLBACK *func)(int port), int count) 為 中 斷 函 數, 當 串 口 有 數 據 時, 就 觸 發 該 函 數, 然 後 該 函 數 就 會 啟 動 其 中 斷 服 務 程 序VOID (CALLBACK *func)(int port)( 為 一 函 數 指 針), 這 裡 是 調 用cntirq() 函 數 接 收 數 據, 該 函 數 需 要 程 序 員 手 工 生 成。

----由 此 我 們 可 以 看 出, 隻 要 我 們 對 程 序 稍 加 修 改, 在 表 單 上 再 添 加 一 些 控 件, 使 得sio_xxx() 這 些 函 數 的 參 數 可 以 由 用 戶 界 面 輸 入, 就 可 以 做 到 由 用 戶 選 定 進 行 數 據 傳 輸 的 通 信 端 口, 并 設 定 這 個 端 口 的 相 關 參 數, 包 括 波 特 率、 數 據 位、 停 止 位、 奇 偶 校 驗 和 流 量 控 制 等

繼續閱讀