2013-06-15 3 views
0

Я пытаюсь читать потоковые последовательные данные на 115200b и не могу, кажется, забрать все.Отсутствует либо данные, либо целые строки на последовательном порту.

используя метод ввода ($ data = $ Port -> input), я получаю первые 14 или 15 символов каждой строки. Мне нужна целая линия.

с использованием метода чтения ($ data = $ Port -> read (4096)), и, отрегулировав read_interval, я могу либо получить частичные числа каждой строки, используя $ Port-> read_interval (1);

или полностью каждая третья строка с использованием $ Port-> read_interval (2);
Мне нужна всякая строка.

здесь код

my $App_Main_Port = Win32::SerialPort->start ($Test_cfgfile); 
$App_Main_Port->read_interval(1); 
$App_Main_Port->read_char_time(1); 
for ($i=0;;) { 
    # $data = $App_Main_Port -> input; 
    $data= $App_Main_Port -> read(4096); 
    print "$data\n"; 
} 

путем регулировки интервала чтения я получаю результаты, упомянутые выше. Я начал с значений по умолчанию 100 в параметрах интервала и char_time, но получал только каждую третью строку.

Tx для любого понимания! Chris

+5

Просьба указать код, демонстрирующий проблему. По крайней мере, укажите, какой модуль вы используете! – ikegami

ответ

0

Последовательный порт считывает часто только то, что буферизуется в последовательном порту в этот момент. 16550 UART только буферизирует всего 16 байтов, и это то, что имитирует большинство компьютеров.

На странице Win32 :: SerialPort вам нужно вызвать ->read() в контексте списка, чтобы вы могли узнать, сколько байтов действительно прочитано. Если вы действительно хотите, чтобы блокировать до тех пор, пока вы получили все 4K символов, попробуйте цикл так:

# read in 4K bytes 
my ($data, $temp, $count_in, $total_in); 
$total_in = 0; 
while ($total_in < 4096) { 
    ($count_in, $temp) = $App_Main_Port->read(4096 - $total_in); 
    $data .= $temp; 
    $total_in += $count_in; 
} 

Тем не менее, ваша реальная проблема звучит, как это может быть проблема управления потоком. Даже при таком цикле вы все равно можете потерять символы, если у вас нет правильного управления потоком. Вы можете экспериментировать с handshake("dtr") или handshake("rts").

Смежные вопросы