Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 456

/ вопрос открыт /

Приветствую, уважаемые эксперты!
А может кто-нибуть кинуть кусок кода передачи картинки из Timege c одного компа через COM порт в Timege на другом.

GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 29 марта 2008, 11:09
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, GAZ!
Общая технология такая. Сохраняем содержимое TImage в файл или поток в памяти, в сом порт отправляем вначале длину, как способ для определения длины данных. потом сам данные. В конце - снова условную комбинацию для взаимного контроля сторон. Естественно, надо знать, что за тим картинки храниться в TImage.
Припустим, что Readb(b:byte) и Writeb(b:byte) - это процедуры записи и чтения в/с сом порта, тогда

var st:TMemoryStream;
l,i:cardinal;
b:byte;
begin
st := TMemoryStream.create();
Image1.picture.savetostream(st);
st.position := 0;
//пишем размер
l := st.size;
writeb((l and $FF000000) shr 24);
writeb((l and $FF0000) shr 16);
writeb((l and $FF00) shr 8);
writeb((l and $FF));
//пишем данные
for i := 0 to l-1 do begin
  st.read(b,1);
  writeb(b);
end;
//контрольная метка
writeb($F0);writeb($A5);writeb($17);writeb($3C);
st.free;
end;
теперь чтение на том конце
var st:TMemoryStream;
l,i:cardinal;
b:byte;
begin
l:=0;
//читаем размер
for i:=0 to 3 do begin
readb(b); l:=(l shl 8) or b;
end;
st := TMemorystream.create;
//теперь сами данные
for i:=0 to l-1 do
begin
readb(b);
st.write(b,1);
end;
//Чтение контрольной метки. проверки сами ставьте
readb(b);
readb(b);
readb(b);
readb(b);
st.position := 0;
Image1.picture.LoadfromStream(st);
st.free;
end;
предупреждаю, что это не совсем готовый код, это моделька для создания.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 марта 2008, 13:07
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, GAZ!
Проблема передачи данных через COM-порт не раз обсуждалась. Не однократно приводились примеры, статьи, компоненты. Ознакомтесь с вопросами вопрос #1154, вопрос #1140, вопрос #601, вопрос #470, вопрос #366, вопрос #155. В аттаче модуль для работы с COM-портами. Сам я им не пользовался, так что прошу меня не пинать, если че. ;-)
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 31 марта 2008, 10:22


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 30 марта 2008, 01:45; участников в обсуждении: 2.
GAZ

GAZ (статус: Посетитель), 29 марта 2008, 14:30 [#1]:

Вадим К
В принципе всё понятно,только не могли бы Вы чуть подробней остановиться на контрольной метке.

вот эта часть мне и не очень понятна
writeb($F0);writeb($A5);writeb($17);writeb($3C);
$F0, $A5, $17, $3C - откуда это
Вадим К

Вадим К (статус: Академик), 29 марта 2008, 17:44 [#2]:

Числа взяти сугубо с потолка. Обычно берётся комбинация с уникальной последовательностью. а при чтении проверяется. если она не совпадает, значит что то пропустили.
Галочка "подтверждения прочтения" - вселенское зло.
GAZ

GAZ (статус: Посетитель), 29 марта 2008, 19:12 [#3]:

Вадим К
//Чтение контрольной метки. проверки сами ставьте
.....
А что обычно делают ,если они не совпали(выдать сообщение и выйти из процедуры или...) и по какой причине это может произойти
Вадим К

Вадим К (статус: Академик), 30 марта 2008, 01:45 [#4]:

если не совпали, значит либо проблемы в канале - с ком портом достаточно штатная ситуация. Всё зависит от типа данных - в данном случае неверный пакет может быть просто проигнорирован
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.04 сек.