来源:网络转载更新时间:2021-07-02 09:32:31点击次数:2008次
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 函数 ( 本文的 DLL 就是用 API 函数实现的, 有关 API 函数的定义和说明可查阅相关资料) 。
本文源于网络转载,如有侵权,请联系删除
×