Perl Доступ к последовательному порту [Windows 10] - PullRequest
4 голосов
/ 20 февраля 2020

Я делаю небольшой проект с GPS-модулем Neo-6M , таблица данных , в Windows 10 для треков GPS спутников.

Фрагмент кода ниже демонстрирует communication core программы.

Я обнаружил, что иногда при запуске программы она не связывается с GPS-модулем , и мне приходится его прерывать нажав несколько раз Ctrl + C, чтобы иметь возможность перезапустить его и установить sh связь между программой и GPS модулем.

Иногда может потребоваться несколько попыток, прежде чем программа будет считывать данные из модуля GPS .

GPS модуль, подключенный к компьютеру через USB к последовательному порту модуль cp2102 , таблица cp2102 .

GPS модуль и драйверы работают должным образом - подтверждено программным обеспечением u-center .

Может кто-нибудь определить причину описанной проблемы с взаимодействием между программой и GPS модулем?

use strict;
use warnings;
use feature 'say';

use Time::HiRes qw(usleep);

use Win32::SerialPort; 
use Win32::Process;
use Win32::Console::ANSI qw/Cls Title Cursor/;
use Term::ANSIScreen qw/:color :cursor :screen/;
use sigtrap 'handler' => \&sig_handler, qw(INT TERM KILL QUIT);

use Data::Dumper;

my $debug = 1;

my $port_name   = 'COM4';
my $baudrate    = 9600;
my $databits    = 8;
my $parity      = 'none';
my $stopbits    = 1;

my $portObj = new Win32::SerialPort($port_name)
     || die "Can't open $port_name: $^E\n";    # $quiet is optional

$portObj->baudrate($baudrate);
$portObj->databits($databits);
$portObj->parity($parity);
$portObj->stopbits($stopbits);

sub sig_handler {
    Cls();
    cursor_mode('on');
    $portObj->lookclear();
    $portObj->close();
    exit 0;
}

cursor_mode('off');

while(1) {
    my $line = $portObj->lookfor();
    if( $line ) {
        {
            local $/ = "\r";
            chomp $line;
        }
        say "[$line]" if $debug;
        # Some data processing takes place
    } else {
        usleep(50);     # Allocate time for other processes to run
    }
}

# Data processing subroutines
# Positioned output to terminal window

sub cursor_mode {
    my $mode = shift;

    print "\e[?25l" if $mode eq 'off';
    print "\e[?25h" if $mode eq 'on';       
}
...