Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать 16-тиричное число через com порт? В USB дисплей.Преобраз-тель (USB<->R232) 
:(
    Опции темы
mr_smit
Дата 11.2.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 27.2.2008
Где: Самара

Репутация: нет
Всего: 4



Здравствуйте. Необходимо передать изображение через com порт в контроллер.

1. Чтобы получить цвет каждого пиксела, мы с каждым пикселем картинки проделываем следующее: 

Код

// картинка предварительно сохранена в фотошопе в формате bmp 5-6-5
// pix - цвет пикселя
// s - строка (string) с цветом в формате hex
...
pix:= Image1.Canvas.Pixels[k,Image1.Picture.Height-1-i];

r1:=GetRValue(pix) shr 3;
g1:=GetGValue(pix) shr 2;
b1:=GetBValue(pix) shr 3;

pix:= (r1 shl 11) + (g1 shl 5) + b1; // получили цвет
 
// можем перевести его в hex формат
s:=IntToHex(pix,4);


Т.е. для каждой из 5 точек знаем её цвет: F800, 0000, 0000, FFFF, FFFF 
user posted image

2. Дисплей работает в -5-6-5- (-R-G-B-) режиме цветопередачи. Это означает, что в потоке данных первые 5 бит устанавливают красный цвет, следующие 6 - зеленый, и последние 5 синий. (0xFFFF белый, 0x0000 черный). 

3. Необходимо передать цвета каждого пикселя картинки контроллеру ATMega8, а он отправит их в дисплей.
user posted image

4. В Delphi использую компонент CPortLib.
Для записи в порт у него есть:

Write - Writes non-typed variable to output buffer.
WriteAsync - Writes non-typed variable to output buffer in asynchronous mode.

WriteStr - Writes string type variable to output buffer.
WriteStrAsync - Writes string type variable to output buffer in asnychronous mode.

5. Как их передать? Как разбить на 8+8? Т.е. как передать 16-тиричное число через com порт?

Это сообщение отредактировал(а) mr_smit - 11.2.2010, 20:56
PM MAIL   Вверх
mr_smit
Дата 14.2.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 27.2.2008
Где: Самара

Репутация: нет
Всего: 4



Цитата
... 2 байта также называют словом (word). Отсюда и название соответствующего числового типа данных - Word  (число, занимающее в памяти 2 байта, значения от 0 до 65535)


Код

ComPort1.WriteStr(IntToStr(pix));


И всё что ли? Но это строка.

Код

PixColorArray: array of Word;
...
PixColorArray[0]:=pix; // для одной точки (пока)
ComPort1.Write(PixColorArray[0],2); 


[Error]: Incompatible types: 'Word' and 'PAnsiChar'

Код
ComPort1.Write(Addr(PixColorArray[0]),2); 

Компилируется, но при нажатии на кнопку ошибка в этой строке PixColorArray[0]:=pix;

Пример из справки к компоненту:
Код
var
  Str: String;

begin
  Str := 'Hello';
  ComPort1.WriteStr(Str); // string type variable
  ComPort1.Write(Str[1], Length(Str)); // no defined type

end;


Если отправить 3 цвета подряд, то получаем: 63488201631

63488 = F800 = 1111100000000000 = красный
2016 = 07E0 = 0000011111100000 = зеленый
31 = 001F = 0000000000011111 = синий 

Как то ещё можно передавать? 
PM MAIL   Вверх
mr_smit
Дата 17.2.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 27.2.2008
Где: Самара

Репутация: нет
Всего: 4



Нашел компонент TBComPort.

У него функция:
Код

function Write(const Buffer; Count: Integer): Integer;


Код

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
    r1,g1,b1:integer;
begin
  i:=clred;
  r1:=GetRValue(i) shr 3;
  g1:=GetGValue(i) shr 2;
  b1:=GetBValue(i) shr 3;
  i:= (r1 shl 11) + (g1 shl 5) + b1;

  form1.Caption :=' Старший байт='+IntToHex(Hi(i),2)+'Младший байт='+IntToHex(Lo(i),2);
end;


Как эти 2 байта отправить в ком порт???????

Код

  BComPort1.Open;
  BComPort1.Write(Hi(i),sizeof(Hi(i))); //ругается [Error] Unit1.pas(71): Variable required

PM MAIL   Вверх
mr_smit
Дата 18.2.2010, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 27.2.2008
Где: Самара

Репутация: нет
Всего: 4



Свершилось!!!!!!!!!!!!!
user posted image

Существенный прогресс!!!!!!!! Работает!!!!!!!! Я поставил компонент TBComPort

Код

procedure TForm1.Button2Click(Sender: TObject);
var r1,g1,b1:integer;
    Data: Byte;
begin
  r1:=GetRValue(i) shr 3;
  g1:=GetGValue(i) shr 2;
  b1:=GetBValue(i) shr 3;
  i:= (r1 shl 11) + (g1 shl 5) + b1;  // i - глобальная integer, из ColorDialog1

  BComPort1.Open;
  Data := Hi(i);
  BComPort1.Write(Data, SizeOf(Data));
  Data := Lo(i);
  BComPort1.Write(Data, SizeOf(Data));
end;


Т.е. делим полученный цвет на 2 отдельных байта, Hi и Lo, и побайтно отправляем. Сначала первый, затем второй.

user posted image    user posted image

Я счастлив...!!! И это всё на ATMega8...

Теперь осталось разобраться с выводов изображения в заданную область и передачей текста в дисплей.

user posted image

Единственное только картинка выводится ооочень долго, 4-5 сек, но я думаю это из-за скорости COM порта. Я поставил 38400. Надо будет увеличить. Потому что заливка экрана одним цветом происходила очень быстро, < 1сек.

P.S. Кстати, в диспетчере устройств для TUSB 3410 можно выставить максимум 128000 бит/сек. Хотя вроде бы производитель обещает гораздо больше, странно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.