加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 使用Win32 :: API调用OpenComPort

发布时间:2020-12-16 06:14:09 所属栏目:大数据 来源:网络整理
导读:我在调用第三方dll控制rfid阅读器时遇到问题. 这是我的代码: use Win32::API;Win32::API::More-Import("kernel32","int GetCurrentProcessId()");Win32::API::More-Import("UHFReader288.dll","OpenComPort","IPPI","I","_cdecl");sub OpenReader { my $com
我在调用第三方dll控制rfid阅读器时遇到问题.
这是我的代码:

use Win32::API;
Win32::API::More->Import("kernel32","int GetCurrentProcessId()");
Win32::API::More->Import("UHFReader288.dll","OpenComPort","IPPI","I","_cdecl");

sub OpenReader {
    my $comport = 1;
    my $comAddr = " " x 255;
    my $baud = "5";
    my $handle = -1;

    my $result =  OpenComPort($comport,$comAddr,$baud,$handle);

    return $result;
}

以下是该函数的原型:

int OpenComPort(int port,BYTE* ComAdr,BYTE baud,int* FrmHandle);

该功能的文档由下图提供(对不起):

Documentation for OpenComPort

有人可以告诉我我做错了什么吗?当我调用该函数时,Perl解释器崩溃了!!

我在Win10上运行草莓Perl 5.24

解决方法

use strict;
use warnings qw( all );
use feature qw( state );

use Win32::API qw( );

use constant {
   COM1 => 1,COM2 => 2,COM3 => 3,COM4 => 4,COM5 => 5,COM6 => 6,COM7 => 7,COM8 => 8,COM9 => 9,# etc

   COM_ADR_BROADCAST => 0xFF,BAUD_9600   => 0,BAUD_19200  => 1,BAUD_38400  => 2,BAUD_57600  => 5,BAUD_115200 => 6,};

sub OpenComPort {
   my ($port,$ComAdr_ref,$FrmHandle_ref) = @_;

   state $OpenComPort = Win32::API::More->new('UHFReader288.dll','OpenComPort','iPCP','i','_cdecl')
      or die($^E);

   my $ComAdr_buf    = pack('C',$$ComAdr_ref);
   my $FrmHandle_buf = pack('i',-1);

   my $rv = $OpenComPort->Call($port,$ComAdr_buf,chr($baud),$FrmHandle_buf);

   $$ComAdr_ref    = unpack('C',$ComAdr_buf);
   $$FrmHandle_ref = unpack('i',$FrmHandle_buf);

   return $rv;
}

{
   my $ComAdr = COM_ADR_BROADCAST;
   my $FrmHandle;
   OpenComPort(COM1,$ComAdr,BAUD_57600,$FrmHandle)
      or die("Error");

   ...
}

未经测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读