因为公司有个读卡器由键盘口换成了COM口的,所以原来的程式要做个小小的调整,要改成从串口读数据。一般的系统默认使用COM2口——如要用其它的COM口请到设备管理器里修改。由于没有没过delphi,就只有摆渡了,并加上自己仅有的一些JAVA、C的编程知识成功调试出来了,现分享如下:
首先,我们要用到MSComm控件,如果没有添加到控件面板的请先从component(控件)菜单里调出来,如下图:
先选Import Active Conrol...菜单项——
弹出的导入控件对话框——
添加后的控件放在ActiveX控件面板——
注:在使用时记得给Events里的OnComm事件添加写好的监听器——
一、MSComm控件的主要属性及事件
(1)CommPort:设置或返回串行端口号,缺省值1。
(2)Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:=′9600,n,8,1′
(3)PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False}
(4)InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
(5)InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。
(6)RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。
(7)SThreshold:该属性为一阀值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。
(8)InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。
(9)Input:从接收缓冲区读取一串字符。
(10)OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
(11)OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。
(12)OutPut:向发送缓冲区传送一串字符。
如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:
(1)ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。
(2)ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。
(3)ComEvFrame:值为1004,硬件检测到帧错误。
(4)ComEvRxOver:值为1008,接收缓冲区溢出。
(5)ComEvTxFull:值为1010,发送缓冲区溢出。
(6)ComEvRxParity:值为1009,奇偶校验错误。
(7)ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符
二、示例代码
先看看运行的结果(文本框内的数字就是由COM口读卡器读入的)——
//这个代码是从网上找的代码改的,测试时,只须在一个TForm里加一个TMSComm控件和一个文本框TEdit控件
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;
type
TForm1 = class(TForm)
MSComm1: TMSComm;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure MSComm1Comm(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Mscomm1.InBufferCount :=0; // 清空接收缓冲区
Mscomm1.InputLen :=0; // Input读取整个缓冲区内容
Mscomm1.RThreshold :=1; // 每次接收到字符即产生OnComm事件
//Mscomm1.Settings :=ComboBox1.Text;
//if ComboBox2.Text ='com1' then // 假设只考虑com1和com2两种情况
// Mscomm1.CommPort :=1
// else
Mscomm1.CommPort :=2;
Mscomm1.PortOpen :=true; // 打开串口
Mscomm1.DTREnable :=true; // 数据终端准备好
Mscomm1.RTSEnable :=true; // 请求发送
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:String;
begin
if Mscomm1.CommEvent = 2 then
begin
recstr := Mscomm1.Input ;
Edit1.text := recstr;
end;
end;
end.