VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 911|回复: 8

急:串口调用失败?

[复制链接]

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-20 23:30:02 | 显示全部楼层 |阅读模式
考勤机动态库说明:
说明:所有函数只接受两个参数
参数一:Params结构
参数二:表示硬件类型的数值, 取值[30, 60, 2000, 2100, 2200, 2300, 2600]

Params结构定义
Public Type Params
    Port As String * 3                //串口号,[1~255]
    CtrlID As String * 3                //设备号,[1~127]
    Params As String * 1024        //输入:传递给设备处理的参数表,多参数间以分号分隔,以分号结束
                           //输出:接口返回值
End Type

接口返回值定义
100                //调用接口失败
101                //不支持该类型设备
102                //该设备不支持该接口
103                //设备无响应
104                //参数错误
105                //调用成功
106                //串口没打开
107        //打开文件错误
108        //通讯参数错误,要求重发
109        //返回值数据校验错误
110        //创建线程错误
111        //设备忙

一.        IT2100
1.        打开串口
声明
Public Declare Function OpenComm Lib "CM60.dll" (ByRef lParam As Params, ByVal sType As Integer) As Integer
调用例子
dim p as Params
dim sType as Integer
dim ret as Long

sType = 2100
p.Port = “001”                 ‘打开串口一
p.CtrlID = “001”                  ‘设备号为1

ret = OpenComm(p, sType)
select case ret
        case 100        ‘打开失败
case 105 ‘打开串口成功
                case else
    end select




我测试:
unit Ukq;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TParams = Record
    Port: String[3];
    CtrlID: String[3];                        //设备号,[1~127]
    Params: string[250];
  end ;

var
  Form1: TForm1;


implementation

{$R *.dfm}
function OpenComm(var lParam:tParams;sType:Integer): Integer;stdcall; external 'CM60.dll' ;
function CloseComm(var lParam:tParams;sType:Integer): Integer;stdcall; external 'CM60.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  p: TParams;
  sType, ret: Integer;
begin
  sType := 2100;
  p.Port :=edit1.text;
  p.CtrlID :=edit2.Text;
  ret := OpenComm(p, sType);
    showmessage(inttostr(ret));


  ret := CloseComm(p, sType);
   p.CtrlID :='';
    showmessage(inttostr(ret));

end;
end.


打开串口和关闭串口都是返回100(调用串口失败),而用考勤机自己的终端管理是可以打开第1,2个串口的,不知道是不是我的测试程序有问题

回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-3 08:45:02 | 显示全部楼层
打开串口,你是否确定没有其它程序正在占用你所要打开的串口,
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-5-6 19:00:01 | 显示全部楼层
没有啊,我用考勤机自己的终端管理是可以打开第1,2个串口,可以关闭,我也在其它电脑上都试过,都返回100
回复

使用道具 举报

0

主题

22

帖子

23.00

积分

新手上路

Rank: 1

积分
23.00
发表于 2020-5-7 07:30:01 | 显示全部楼层
PParams = ^TParams;
var p: PParams; OpenComm(p, sType);
或者p: TParams; OpenComm(^p, sType);
OpenComm的第一个参数是传址
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-5-8 12:30:01 | 显示全部楼层
PParams = ^TParams;
var p: PParams; OpenComm(p, sType);
或者p: TParams; OpenComm(^p, sType);
OpenComm的第一个参数是传址

改了之后,编辑提示错误:types of actual and formal var parametes must be identical
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-10 01:45:02 | 显示全部楼层
是传址引用,但是在delphi的申明中也使用了var了,这已经跟VB的byref对应了。
问题不是这里,你的串口设备参数是不是应该在TParams 记录里的Params字符数组里设置一下。
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-5-13 15:45:02 | 显示全部楼层
修改成了以下代码:

unit Ukq;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TParams = Record
    Port: String[3];
    CtrlID: String[3];                        //设备号,[1~127]
    Params: string[250];
  end ;

  pparams=^TParams;

var
  Form1: TForm1;


implementation

{$R *.dfm}
function OpenComm(var lParam:pParams;sType:Integer): Integer;stdcall; external 'CM60.dll' ;
function CloseComm(var lParam:pParams;sType:Integer): Integer;stdcall; external 'CM60.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  p:pparams;
  sType, ret: Integer;
begin
  sType := 2100;
  p.Port :=edit1.text;
  p.CtrlID :=edit2.Text;

  ret := OpenComm(p,sType);
    showmessage(inttostr(ret));


  ret := CloseComm(p, sType);
   p.CtrlID :='';
    showmessage(inttostr(ret));

end;

end.

编辑成功,运行的时候,出现access violation at address 0040211......地址错误
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-5-14 09:30:01 | 显示全部楼层
00402A11,0042C590
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-5-16 15:15:01 | 显示全部楼层
是在 p.Port :=edit1.text;
  p.CtrlID :=edit2.Text;
这两个地方出现地址错误,改成p.port :='001'也一样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表