Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > передача большого каличество данных через CPortLib


Автор: Malicious 13.09.10, 14:01
Необходимо передать довольно много данных через COM-порт. Решил использовать CPortLib, как отправлять строку я разобрался, а как отправить 1000?
Если делать так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    while not eof(txt) do
      begin
      Readln(txt,Str);
      Str := Str + #13#10;
      ComPort.WriteStr(Str);
      end;
    CloseFile(txt)

и выводить в мемо
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    var
      Str: AnsiString;
    begin
      ComPort.ReadStr(Str, Count);
      Memo.Text := Memo.Text + Str;
    end;

то получается что вместо 56кб отправляется всего 7кб. Чую что порт не успевает передавать и надо где-то то ли задержку сделать, то ли еще что-то. Подскажите, как сделать, а еще лучше где прочитать как сделать. В хелпе CPortLib не нашел ничего...

Автор: northener 13.09.10, 16:48
Цитата Malicious @
то ли еще что-то

Общие соображенияю
1. Выходной буфер увеличить.
2. Отправлять следующую строку после передачи предыдущей. С данной библиотекой не работал, но у всех известных мне компонент по работе с СОМ-портом есть событие типа данные переданы, выходной буфер пуст и т.п.

Автор: Malicious 14.09.10, 13:37
Извиняюсь за свою неразумность, но никак не могу найти, как отловить событие о том, что данные отправлены в этом компоненты :-( А есть другие бесплатные библиотеки, которые работают в Delphi 2010?

Автор: northener 14.09.10, 16:45
Цитата Malicious @
никак не могу найти, как отловить событие о том, что данные отправлены в этом компоненты

Разве у него нет события OnTxEmpty?

Автор: Malicious 15.09.10, 12:55
Спасибо northener, разобрался. Действительно, по событию OnTxEmpty передаю данные и все приходит.

Автор: Serega_mexanik 24.12.18, 18:21
Подниму старую тему. Читаю по событию ComPort1RxChar



unsigned char *buffer = new unsigned char[1024];

void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
{
String message="";

ComPort1->Read(buffer, Count);

for (int i = 0; i < Count; i++)
message += ByteToHex(buffer[i]) + " ";

Memo1->Lines->Add(Now().TimeString()+" <- " + message);
}
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    [CODE=pas]


[/CODE]
В Memo наблюдаю следующее:


17:20:02 -> 03 03 00 00 00 0A C4 2F
17:20:02 <- 03 03 14 00
17:20:02 <- 01 00 16 00 1E 00 02 00 07 00 00
17:20:02 <- 00 01 00 00 00 00 00 00
17:20:02 <- 7A 78


При запуске стороннего приложения. Когда спрашиваю такую команду, приходит так:


Tx:03 03 00 00 00 0A C4 2F
Rx:03 03 14 00 01 00 16 00 1E 00 02 00 07 00 00 00 01 00 00 00 00 00 00 7A 78



Т.е. вроде бы все нормально, и у меня. Все байты пришли. контрольные crc совпадают. Но почему кусками !!?.
Мануалов толковых не нашел.
Может где-то какие настройки.

Автор: Fr0sT 25.12.18, 07:05
А в чем проблема-то? Это ж не датаграммный протокол, а поточный порт.

Автор: Serega_mexanik 25.12.18, 07:24
Не могу придумать, как ждать, стоп бит или конец посылки, по таймаутам.

Автор: Fr0sT 25.12.18, 10:36
А это уже зависит от содержания данных. В общем случае всегда предпочтительней сигнатура окончания либо префикс с длиной, но в твоем случае все зависит от источника данных

Автор: Serega_mexanik 25.12.18, 12:36
Если я спрашиваю устройство на чтение/запись одного регистра(8байт), то и ответ приходит 8байт. Все нормально, на скорости 9600, без провалов приходит вся посылка. Если спрашиваю, чуть больше, 2-4 регистра, например состояние входов, то каждый по два байта, и как бы не успеваю в одну посылку получить... 8 байт ответа +количество регистров *2байта данных

Автор: Serega_mexanik 25.12.18, 17:26
В этом чудо компоненте, есть чудо приблуда ComDataPacked и событие onPacked, которая в свою очередь ждёт начала и конца пакета и возвращает сам пакет. Теперь внимание вопрос, как ей дать стартовый и стоповый бит

Добавлено
Или не ждёт, тогда придется работать с тайм-аутами. Что сильно не надёжно

Автор: Fr0sT 26.12.18, 06:57
Для таких мизерных объемов данных таймаут в общем-то сойдет. Но да, лучше без него. А что мешает вообще не отслеживать концов пакета? Собирай по событию в буфер и пробуй разбирать ответ. Получилось - окей, пакет целый. Не получилось - ждем еще какое-то время.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)