Я немного устал читать последовательный порт, используя Perl
прежде всего Perl
не мой основной инструмент разработки, я из PHP
фон.
Поэтому, пожалуйста, ведите меня правильно. Я собираюсь прочитать данные с весов на веб-страницу, я уже провел много исследований по этой теме.
Приложение браузера не может читать данные последовательного порта напрямую, поэтому я выбираю, чтобы пользовательский компьютер мог быть установлен с сервером (Apache), и выполняю задачу с помощью PHP, а веб-приложение может прочитать результат, используя вызов Ajax для localhost url
Идея прекрасно работает на машинах с Linux, но на Windows PC она застряла.
Я понимаю, что PHP не может читать данные из последовательного порта в окнах, таких как Linux, поэтому я выбираю 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;
Код не работает, но на форуме и во многих других местах написано, что работает как Вот , Вот, этот а также этот.
Я не могу найти, что это значит «использовать Win32 :: SerialPort qw (: STAT 0.19);» это что-то вроде импорта этой библиотеки с номером версии. ?
Я уже установил Xampp с Perl и activePerl Win32::serialport 0.22
и его API, но когда я запускаю код, он возвращает ошибку вроде
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 и вернуть данные.
use Win32::SerialPort qw( :STAT 0.19 );
Это так же, как
use Win32::SerialPort ':STAT', '0.19';
:STAT
импортирует ряд полезных констант статуса и объясняет под экспорт в документации к модулю
0.19
является частью Perl, и настаивает на том, что версия Win32::SerialPort
должно быть 0,19 или позже. Текущая версия 0.22. Если вы измените 0.19
в 0.23
тогда вы увидите эффект, который он имеет
Других решений пока нет …