Отправка подчеркивания на последовательный порт в Perl

#perl #encoding #serial-port

#perl #кодирование #последовательный порт

Вопрос:

Когда я отправляю подчеркивание на последовательный порт (COM42), он действует так, как будто я отправил пробел на последовательный порт. Например, если я отправляю «Perl_Great», на моем последовательном порту отображается «PerGreat». В настоящее время последовательный порт настроен таким образом. Есть ли параметр для настройки последовательного порта на другую кодировку, чтобы он не обрабатывал подчеркивание как пробел?

 use Win32::SerialPort;
my $port = new Win32::SerialPort( "\\.\" . $self->{Port} )
        or $self->__Error( "Could not open com port $self->{Port}nt$^En", 'FATAL' );

$port->baudrate($self->{BaudRate});
$port->parity($self->{Parity});
$port->databits($self->{DataBits});
$port->stopbits($self->{StopBits});
$port->handshake( "none" );
$port->are_match( "r" );     # the symbol that "lookfor" will be looking for in a blocking call
$port->read_const_time(2000); #timeout for blocking read (ms)
$port->lookclear;

$port->write_settings();

my $command = "Perl_Great";
$port->write($command);  # where $command is previously loaded with "Perl_Great".  I checked with a Win32::MsgBox That the string is intact at this point
 

Комментарии:

1. к чему подключен последовательный порт и / или как вы видите, что принимается от последовательного порта?

2. У нас есть простая программа в стиле терминала на другой стороне подключения к виртуальному порту. В нашем случае виртуальным соединением является COM52. На терминале дисплей показывает, что подчеркивание действует как пробел, и ответ от программы указывает на то же самое (ошибка недопустимого параметра).

3. Я нахожу это описание очень запутанным. Пожалуйста, опишите полную настройку. В частности, покажите полную обработку отправки «Perl_Great». Например, «программа perl, запущенная на хосте A, программно отправляет набор символов «Perl_Great» на локальное виртуальное устройство COM42, которое настроено на маршрутизацию этих символов по сети, где они принимаются хостом B. Терминальная программа, запущенная на хосте B, видит эти символы как ответ от сервер, для которого он считает, что действует как терминал, но отображает «PerGreat». Каким-то образом что-то также отображает недопустимую ошибку символа? »

4. Приношу свои извинения, я контролирую только часть настройки, и я унаследовал большую часть кода. У нас есть другой скриптовый движок в VB, который может успешно отправлять подчеркивание через последовательный порт на терминал. Настройка предполагает, что мой скриптовый движок использует COM42. С помощью инструмента Network Serial Port Kit у нас есть COM42, связывающийся с COM52. Терминал на другой стороне управляет COM52. Все это на одном компьютере. Текст, который я отправляю через сценарий Perl, отображается в окне терминала.

5. Код, который используется в дальнейшем для помещения строки в COM-порт: ‘$port->write($command); # где $command предварительно загружается с помощью «Perl_Great». Я проверил с помощью Win32 :: MsgBox, что строка на данный момент не повреждена ‘Я думал, что это проблема с кодировкой (движок VB использует UTF8), или есть несколько предопределенных управляющих символов, и подчеркивание является одним из них.

Ответ №1:

Простой ответ на ваш вопрос — «вероятно, нет» 🙂

Ваш вопрос «Есть ли параметр для настройки последовательного порта на другую кодировку, чтобы он не обрабатывал подчеркивание как пробел?», может быть лучше сформулирован как «что заставляет получателя строки «Perl_Great» отбрасывать два символа и получать только «PerGreat»?

Вы спрашиваете о кодировке и упоминаете UTF8, вы проверили, что ваше подчеркивание в «Perl_Great» — это эквалайзер » x5f», а не какая-то волшебная строка utf-8