perl - 使用 Win32::API 调用 OpenComPort

标签 perl winapi serial-port rfid catalyst

我在调用第三方 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;
}

以下是该函数的原型(prototype):

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, $baud, $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");

   ...
}

未经测试。

关于perl - 使用 Win32::API 调用 OpenComPort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46741972/

相关文章:

c++ - 如何检查给定路径是否指向现有文件或目录?

perl - 如何在 Perl 中进行 64 位算术运算?

Perl 触发器运算符和行号

带有键数组的 Perl 散列

perl - foreach 语句中的值是如何打印的?

java - Topaz Signature Applet 未连接到 COM1 上的 Serial ClipGem

c# - 如何抓取父进程标准输出?

c - 从编辑控件获取 Unicode 字符串

c# - 串口数据丢失 - C#

node.js - 在docker容器中运行nodejs串行端口