| 
| 
 | Вопрос # 1 456/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!А может кто-нибуть кинуть кусок кода передачи картинки из Timege c одного компа через COM порт в Timege на другом.
 
|  |   Вопрос задал: 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 (статус: Посетитель), 29 марта 2008, 14:30 [#1]:Вадим К В принципе всё понятно,только не могли бы Вы чуть подробней остановиться на контрольной метке.
 
 вот эта часть мне и не очень понятна
 writeb($F0);writeb($A5);writeb($17);writeb($3C);
 $F0, $A5, $17, $3C - откуда это
 |  
|   | Вадим К (статус: Академик), 29 марта 2008, 17:44 [#2]:Числа взяти сугубо с потолка. Обычно берётся комбинация с уникальной последовательностью. а при чтении проверяется. если она не совпадает, значит что то пропустили. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 29 марта 2008, 19:12 [#3]:Вадим К //Чтение контрольной метки. проверки сами ставьте
 .....
 А что обычно делают ,если они не совпали(выдать сообщение и выйти из процедуры или...) и по какой причине это может произойти
 |  
|   | Вадим К (статус: Академик), 30 марта 2008, 01:45 [#4]:если не совпали, значит либо проблемы в канале - с ком портом достаточно штатная ситуация. Всё зависит от типа данных - в данном случае неверный пакет может быть просто проигнорирован Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |