Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как передать 16-тиричное число через com порт?


Автор: mr_smit 11.2.2010, 19:42
Здравствуйте. Необходимо передать изображение через 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 14.2.2010, 19:57
Цитата
... 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 = синий 

Как то ещё можно передавать? 

Автор: mr_smit 17.2.2010, 20:06
Нашел компонент 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

Автор: mr_smit 18.2.2010, 07:56
Свершилось!!!!!!!!!!!!!
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, и побайтно отправляем. Сначала первый, затем второй.

http://radikal.ru/F/i080.radikal.ru/1002/bc/9d05e4408e2a.jpg.html    http://radikal.ru/F/s002.radikal.ru/i200/1002/b0/7e8041690a8a.jpg.html

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

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

http://radikal.ru/F/i071.radikal.ru/1002/3e/b76590b0a7cf.jpg.html

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

P.S. Кстати, в диспетчере устройств для TUSB 3410 можно выставить максимум 128000 бит/сек. Хотя вроде бы производитель обещает гораздо больше, странно.

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