谘詢電話
ENGLISH0755-88840386發布時間:2021-09-09 15:38:26 |來源:網絡轉載
1概述
隨著計算機軟硬件技術的飛速發展和廣泛應用,微型計算機(PC)的應用已非常普及,衡器行業也不例外,采用計算機進行稱重管理的電子秤逐年增多。雖然各衡器廠家都有自己配套的稱重管理軟件,但是隨著各行各業對稱重管理的更高和不同的需求,特別是生產過程中的稱重管理與生產的產品和工藝流程密切相關,無法用通用的稱重軟件來滿足不同用戶的要求,要開發適合不同行業且實用性強的稱重軟件,編程人員必須對不同行業的稱重過程或工藝流程非常熟悉,為了縮短開發周期增強軟件的實用性和便於維護,用戶一般會選擇熟悉本行業的編程人員來開發此類軟件。目前,各稱重顯示器的生產廠家,沒有配備串口通信驅動程序,雖然現在的軟件開發工具如VB. VFP等都自帶串口通信控件,較易實現串口通信程序的設計,但是對於大多數善於編寫管理程序而對串口通信不熟悉的非衡器行業的編程人員來說,還是有一定難度的。
為了滿足對串口通信不熟悉的編程人員盡快掌握稱熏顯示器與計算機的通信,避免接觸陌生而枯燥的串口通信術語,通過把串口通信的複雜性用較易使用的動態鏈接庫(DLD封裝起來,編程人員隻要通過幾個函數的簡單調用,就可實現電子秤的稱重數據讀取,極大地方便了串口通信的設計。下麵將介紹用Delphi編寫稱熏顯示器串口通信動態鏈接庫的方法(以耀華XK3190-AI-I稱重顯示器為例)。
2稱重顯示器串口通信動態鏈接庫的實現
動態鏈接庫是一個能夠被應用程序和其它的DLL調用的過程和函數的集合體,它裏麵包含的是公共代碼或資源。DLL代碼使用了內存共享技術為不同語言間代碼共享提供了一條方便的途徑,因而DLL在編程時應用較為廣泛。
2 1用Delphi編寫DLL庫
在Delphi環境中,編寫一個DLL同編寫一個一般的應用程序並沒有太大的區別,除了在內存、資源的管理上有所不同外並不需要其它特別的手段。
在Delphi主菜單File中選New子菜單的0ther…項,在彈出的窗口中雙擊DLL圖標,便會自動繪出DLL源模塊框架如下:
library Project1:
{注釋 }
uses
SysU tils C lasses
{SR *res}
begin
end.
接下來便可在uses和begin之間加入想在該DLL中實現的過程和函數的定義並用export和ex-ports保留字把它們引出,以便於模塊引用,在begin和end之間加入初始化代碼。本文編寫的動態鏈接庫名稱及函數定義如下:
ComD ev32 dll為動態鏈接庫,ComD ev32 dll中包括四個對串口操作的函數,分別為0penComm:打開設備;ReceiveData讀取設備數據:SendData發送數據到設備;StopComm:關閉設備。
按照定義的庫名稱並加入函數後的動態鏈接庫的源代碼如下:
library ComDev32:
{注釋 }
uses
SysUtils, W indows, Classes;
{$R * res}
∥打開通信端口函數
function OpenComm (port, baud: integer):integer: ex-por stdcall;
var
hComm: Thandle;
cc: TCOMMCONFIG;
Temp: string;
begin
if port>4 then
M essageBox(0,’端口號不能大於4! !’,”,MB_OK);
case port of
1: Tempp:=’COMl’;
2: Temp=’COM2’;
3: Temp:=’COM 3’;
4: Temp=’COM 4’;
end;
Result=0;
hComm:=CreateFile(Pchar(temp),GENERIC_READ orGENERIC__ WRITE,0,nil OPEN EXISTING,0,0);
//打開COM
if( hComm =INVALID_HANDLE__ VALUD then
begin∥如果COM未打開
M essageBox(0’打開通信端口錯誤!!’,”,MB_OK);
exit
end;
SetupComm( hComm , 1024, 512);
GetCommState(hComm,cc dcb); ∥得知目前COM的狀態
cc dch BaudRate =baud; ∥設置波特率為baud
cc dch ByteSize =8; ∥字節為8 bit
cc dch Parity:=NOPARITY. ∥Parity為None
cc dcb StopB its=ONESTOPBIT ∥1個Stop bit
if not SetCommState(hComm,cc dcb) then begin ∥設置COM的狀態
M essageBox(0,’通信端口設置錯誤!!!’,",MB_OK);
CloseH andle( hComm):
exit
end;
R esult=hComm;
end;
∥關閉通信端口函數
function StopComm(comdev:integer):export;
stdcall;
begin
Result=0;
try
CloseHandle( comdev):
except
Resu lt=-l;
end;
end;
exports
OpenComm, S topComm, ReceiveD ata SendD ata;
begin
end
2 2編譯生成動態鏈接庫
在D elph莊菜單Project中選Compile ComDev32子菜單項進行編譯,最後生成所需的稱重顯示器串口通信動態鏈接庫為:ComD ev32 dll。
3動態鏈接庫的使用
ComDev32.dll 中 主 要 包 括 三 個 函 數 Open-Comm、 ReceiveData、 StopComm , 函數的功能為:OpenComm: 打開設備; ReceiveData: 讀取設備數據;StopComm: 關閉設備; comdev 為全局變量。
使用時,首先把ComD ev32 dll文件複製到調用程序的安裝目錄(可執行文件所在的目錄)或操作係統的systemn(或system32目錄下,然後在調用它的程序中按:打開設備→讀取設備數據→關閉設備的順序調用。不同開發工具函數調用示例如下:
在VFP中:** 在表單的初始化事件中 ( Init Event )
DECLARE INTEGER OpenComm IN comdev32.dll INTEGER , INTEGER
comdev=OpenComm ( 1 , 4800 ) ** 打開串口, 如稱重顯示器接計算機 COM1 口, 且稱重顯示器波特率設為 4800
** 在讀取按鈕事件中 ( Click Event )
DECLARE STRING ReceiveData IN comdev32.dll INTEGER
instring=ReceiveData ( comdev ) ** 把讀取的重量數據賦給 instring 字符串變量
** 在表單的退出事件中 ( Destroy Event )
DECLARE INTEGER StopComm IN comdev32.dll INTEGER
StopComm ( comdev ) ** 關閉打開的串口
在 VB中:
(在通用模塊中聲明 ( Module1 )
Option Explicit
Global comdev As Long
‘ comm function
Declare Function OpenCommLib "comdev32.dll" ( ByVal port As Long , ByVal baud As Long ) As Integer
Declare Function StopCommLib "comdev32.dll" ( ByVal comdev As Long ) As Integer
DeclareFunctionReceiveDataLib"comdev32.dll" ( ByVal comdev As Long ) As String
‘在表單的 Load 事件中
Private Sub Form_Load ( )
comdev=OpenComm ( 1 , 4800 )’打開串口, 如稱重顯示器接計算機 COM1 口, 且稱重顯示器波特率設為 4800
End Sub
‘在表單的 UnLoad 事件中
Private Sub Form_Unload ( Cancel As Integer )
Stop Comm ( comdev ) ‘關閉打開的串口
End Sub
‘在按鈕的 Click 事件中
Private Sub Command1_Click ( )
Text1.Text = ReceiveData ( comdev )’在 Text1 編輯框中, 顯示電子秤數據
End Sub
在 Delphi中:
// 在 implementation 中, 添加函數如下:
var
Form1 : TForm1 ;
comdev : integer ; //comdev 為全局變量
implementation
{SR *.dfm}
function OpenComm ( port,baud:integer ) : integer ; far ;
stdcall ; external ‘ comdev32.dll ‘;
function StopComm ( comdev:integer ) : integer ; stdcall ;
external ‘comdev32.dll ‘;
function ReceiveData ( comdev:integer ) : pchar ; stdcall ;
external ‘ comdev32.dll’;
// 在窗體的 Create 事件中
procedure TForm1.FormCreate ( Sender : TObject ) ;
begin
comdev:=OpenComm ( 1 , 4800 ) ; // 例如打開 COM1口, 波特率為 4800
end ;
// 在窗體的 Destroy 事件中
procedure TForm1.FormDestroy ( Sender : TObject ) ;
begin
StopComm ( comdev ) ; // 關閉打開的串口
End
// 在 Button1 的 Click 事件中
procedure TForm1.Button1Click ( Sender : TObject ) ;
begin
edit1.Text:=ReceiveData ( comdev ) ;//在 Edit1 編輯框中, 顯示電子秤數據
end ;
4 結束語
本文介紹了用動態鏈接庫實現稱重顯示器與計算機通信的方法, 在實際應用中為了可靠讀取數據應把讀取數據模塊放到定時器的定時事件中循環讀取&其實對熟悉串口通信的編程人員來說, 有很多更好的方法來實現串口通信, 如利用微軟的 MSCOMM控件或 API 函數 。
本文源於網絡轉載,如有侵權,請聯係刪除