在 Perl 中读取串口

Reading Serial Port in Perl

我有点厌倦了阅读串口,使用Perl首先Perl不是我的主要开发工具,我来自PHP背景。 所以请以正确的方式指导我。我的目的是从体重机读取数据到网页,我已经对这个主题做了很多研究。

浏览器应用程序无法直接读取串口数据,所以我选择用户端机器可以安装服务器(Apache)并使用 PHP 完成任务,Web 应用程序可以使用 Ajax 调用 localhost url 这个想法在 Linux 机器上运行良好,但在 windows PC 上它卡住了。

我明白 PHP 不能像 Linux 那样从 windows 中的串行端口读取数据,所以我选择 Perl 来做这些事情。我做了一些搜索,得到了一些代码,最后 8 个小时我一直在努力:(

#!E:\xampp\perl\bin\perl.exe
# The above line is perl execution path in xampp
# The below line tells the browser, that this script will send html content.
# If you miss this line then it will show "malformed header from script" error.

  print "Content-type: text/plain\n\n";
  # use strict; use warnings;
  use Win32;
  require 5.003;
  use Win32::SerialPort qw( :STAT 0.19 );
  print "here";
  $PortObj = new Win32::SerialPort ("COM3") || die "Can't open COM3: $^E\n";
  print "here";
  $PortObj->user_msg(ON);
  $PortObj->databits(8);
  $PortObj->baudrate(9600);
  $PortObj->parity("none");
  $PortObj->stopbits(1);
  $PortObj->handshake("rts");
  $PortObj->buffers(4096, 4096);

  $PortObj->error_msg(1);  # prints major messages like "Framing Error"
  $PortObj->user_msg(1);  

  $PortObj->write_settings || undef $PortObj;


  print "here";
  # $PortObj->save($Configuration_File_Name);
  $PortObj->read_interval(100);    # max time between read char (milliseconds)
  $PortObj->read_char_time(5);     # avg time between read char
  $PortObj->read_const_time(100);

   print "here";
   $string_in = $PortObj->read("200");

   print $string_in
  # $PortObj->baudrate(300);
  # $PortObj->restart($Configuration_File_Name);  # back to 9600 baud

  $PortObj->close || die "failed to close";
  undef $PortObj;  

该代码不起作用,但在论坛和许多其他地方它说它像 here , here, this and this 一样工作。

我找不到这是什么意思"use Win32::SerialPort qw( :STAT 0.19 );" 是不是有点像用版本号导入那个库。 ?

我已经安装了 Xampp Perl 和 activePerl Win32::serialport 0.22 及其 API 但是当我 运行 代码时它 return 出现错误

Error message:
End of script output before headers: serial.pl 

500 错误

有什么想法吗??

已解决

阅读部分我使用下面的代码。

# warn "here";
  my ($ser) = @_;
  my ($numChars, $c);
  my $line = '';
  do {
    do {
      ($numChars, $c) = $PortObj->read(1);
      #print "$numChars read=$c\n";
    } while ($numChars < 1);
    # print $c;
    $line .= $c;
  } while ($c ne "\n");
   print $line;

代码在 CLI 中运行良好,所以我只放置了一个 PHP 文件来读取 perl 脚本和 return 数据。

use Win32::SerialPort qw( :STAT 0.19 );

这与

相同
use Win32::SerialPort ':STAT', '0.19';

:STAT 导入了许多有用的状态常量,并在模块

的文档中进行了解释 under Exports

0.19 是 Perl 的一部分,并且坚持认为 Win32::SerialPort 的版本必须是 0.19 或更高版本。当前版本为 0.22。如果您将 0.19 更改为 0.23 那么您将看到它具有的效果