Форум РадиоКот https://radiokot.ru/forum/ |
|
Как принять поток данных из массива (изображение) по USART? https://radiokot.ru/forum/viewtopic.php?f=20&t=25898 |
Страница 1 из 2 |
Автор: | urry [ Вт фев 09, 2010 22:49:45 ] |
Заголовок сообщения: | |
так принимать или отпрвлять ??? я не понял Код: typedef union{
struct{ unsigned char lo; unsigned char hi; }st; unsigned int all; }un; un un1; for(i=0;i<16;i++) { un1.all=array[i]; putchar(un1.st.lo); putchar(un1.st.hi); } |
Автор: | mr_smit [ Ср фев 10, 2010 07:30:40 ] |
Заголовок сообщения: | |
Принять данные от ПК. Потом МК отправляет их в дисплей. ![]() |
Автор: | urry [ Ср фев 10, 2010 11:16:02 ] |
Заголовок сообщения: | |
ну и где затык ? На компе открываете Ваш файл как бинарник, грузите в массив.Бьете массив на пакеты, закрываете контрольной суммой каждый пакет. Выгружаете пакет в ком-порт, мк его проверяет и пересылает в дисплей, дальше ждете подтверждение от мк, если у него что-то там не сложилось, повтор пакета, иначе - передача следующего.Байты считаем, закончились - конец обмена. |
Автор: | mr_smit [ Ср фев 10, 2010 15:16:40 ] |
Заголовок сообщения: | |
Как это в коде реализовать не знаю. getchar() принимает по одному символу. Например: Код: // возьмем например размер блока 24
unsigned int image[23]; // i - флаг начала передачи изображения (отправляет ПК) if (getchar() == 'i'){ while (getchar() != 'e') { // конец блока (end) принимаем данные в массив Как??? } когда он заполнен отправляем в дисплей (или если пришел флаг конца передачи) } |
Автор: | HekuToc [ Ср фев 10, 2010 15:50:47 ] |
Заголовок сообщения: | |
Код: // возьмем например размер блока 24
unsigned int image[23]; // i - флаг начала передачи изображения (отправляет ПК) char in; in=getchar(); if (in == 'i'){ while (in != 'e') { // конец блока (end) in=getchar(); image[x]=in; // Lower byte in=getchar(); image[x]+=in*256;//high byte x++; } я интуитивно сделалбы так. Если не прав, поправьте. |
Автор: | mr_smit [ Ср фев 10, 2010 21:51:12 ] |
Заголовок сообщения: | |
Не ругайтесь сильно, пытаюсь разобраться. В каком формате в этом случае должны идти данные cо стороны ПК? Например, массив цветов каждого пикселя картинки размером 5х1 (красный,черный,черный,белый,белый) в формате 5-6-5 (готовый для записи в дисплей) выглядит так: ![]() Код: const unsigned int array[5] = { 0xF800, 0x0000, 0x0000, 0xFFFF, 0xFFFF }; Чтобы его получить, в Delphi мы с каждым пикселем картинки проделываем следующее: Код: ...
// pix - цвет пикселя // s - строка (string) с цветом в формате hex 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 И можем его передать. Ну к примеру возьмем блок из 3 цветов. Т.е. 3 цвета получили -> отправили в дисплей, получили оставшиеся 2 -> отправили с дисплей. В 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. Т.е. при нажатии кнопки мы можем написать что то типа: ComPort1.Write(0-ой элем. массива цветов); // F800 ComPort1.Write(1-й элем. массива цветов); // 0000 ComPort1.Write(2-й элем. массива цветов); // 0000 ComPort1.Write(3-й элем. массива цветов); // FFFF ComPort1.Write(4-й элем. массива цветов); // FFFF Распознаются ли эти цвета кодом приведенным HekuToc? |
Автор: | urry [ Ср фев 10, 2010 22:22:20 ] |
Заголовок сообщения: | |
делфи я не знаю, как бы сделал на си - у Вас каждая точка выдается 2 байтами, выдача через ком порт - неважно, как - делфи, си - побайтовая. Определяем тип переменной Код: typedef union{
struct{ unsigned red:5; // 5 бит unsigned green:6;// 6 бит unsigned blue:5; // 5 бит }st; // = 16 бит, 2 байта unsigned char all[2]; // эти самые байты в массиве }un; Делаем массив точек, скажем их 256 un un_arr[256]; выдаем их побайтово for(i=0;i<256;i++) { WriteByte(un_arr[i].all[0]); WriteByte(un_arr[i].all[1]); } на стороне контроллера делаем такой же юнион, но на меньшее количество элементов (по размеру буфера) По заполнению получаем цвета green_var=un_arr[i].st.green; и так далее |
Автор: | mr_smit [ Чт фев 11, 2010 17:14:11 ] |
Заголовок сообщения: | |
urry писал(а): Код: unsigned char all[2]; // эти самые байты в массиве ... WriteByte(un_arr[i].all[0]); WriteByte(un_arr[i].all[1]); ... green_var=un_arr[i].st.green; Не понял эту запись. |
Автор: | urry [ Чт фев 11, 2010 18:59:20 ] |
Заголовок сообщения: | |
Код: Не понял эту запись.
юнион - это союз двух переменных, которые занимают одно и то же место в оперативной памяти. Меняешь одну - сразу меняется другая. Ок, пошли сначала. Ком -порт выдает только инфу побайтно в любых раскладах, так ? |
Автор: | mr_smit [ Чт фев 11, 2010 19:24:24 ] |
Заголовок сообщения: | |
Да. Сейчас у delphi программистов на форуме проконсультируюсь насчет правильной отправки. |
Автор: | HekuToc [ Вс фев 14, 2010 19:50:15 ] |
Заголовок сообщения: | |
mr_smit, ты не мог бы поделится Delphi исходничком? а то вторй день копаю делфи не могу норм. либу найти. |
Автор: | urry [ Вс фев 14, 2010 23:46:31 ] |
Заголовок сообщения: | |
mr_smit писал(а): 63488 = F800 = 1111100000000000 = красный 2016 = 07E0 = 0000011111100000 = зеленый 31 = 001F = 0000000000011111 = синий Эту строчку можно распознать на стороне МК? ну я же писал... Код: char green.blue,red;
union { struct{ unsigned char blue:5; unsigned char green:6; unsigned char red:5; }st; unsigned char all[2]; }un1; //---------- un1.all[0]=getchar(); un1.all[1]=getchar(); green=un1.st.green; red=un1.st.red; blue=un1.st.blue; |
Автор: | mr_smit [ Пн фев 15, 2010 14:25:57 ] |
Заголовок сообщения: | |
mr_smit писал(а): В Delphi использую компонент CPortLib.
http://sourceforge.net/projects/comport/files/ urry, извини, всё равно не понимаю. Как мне потом пришедший цвет пикселя в дисплей отправить? Код: green=un1.st.green;
red=un1.st.red; blue=un1.st.blue; Не понимаю как перейти к виду 0хА800 или 0хEA07 или 0хАВ01 и т.д. чтобы в дисплей отправить. |
Автор: | urry [ Пн фев 15, 2010 14:55:30 ] |
Заголовок сообщения: | |
был вопрос - как разделить, хоть непонятно зачем это деление в принципе - тот самый инт, что пришел с уарта, прямо отправляете в дисплей. Вот выложена библиотека в соседней ветке http://radiokot.ru/forum/viewtopic.php?t=17721&start=0 - видимо, я не понимаю вопроса ![]() |
Автор: | mr_smit [ Пн фев 15, 2010 15:59:33 ] |
Заголовок сообщения: | |
Как отправить я знаю, я не понимаю ЧТО отправить??? Ну вот к примеру, заливаем дисплей одним цветом: Код: // заливка дисплея цветом color
void fill_screen(unsigned int color) { CS= 0; // select display lcd_reg(0x16);lcd_dat(0x8300); lcd_reg(0x17);lcd_dat(0xAF00); lcd_reg(0x21);lcd_dat(0x0000); lcd_reg(0x22);lcd_write8(0x76); // start data transmission for (i=0; i<DISP_H; i++) { for(j=0;j<DISP_W;j++) { lcd_write(color); } } CS= 1; // deselect display } т.е в цикле отправляем цвет, ну в общем понятно. fill_screen (0х0000); Как мне полученный цвет записать вместо 0х0000 ??? |
Автор: | ARV [ Пн фев 15, 2010 16:27:04 ] |
Заголовок сообщения: | |
mr_smit писал(а): Как отправить я знаю, я не понимаю ЧТО отправить??? элементарно, ватсон! модифицируете ранее предложенный код так:fill_screen (0х0000); Как мне полученный цвет записать вместо 0х0000 ??? Код: union {
struct{ unsigned char blue:5; unsigned char green:6; unsigned char red:5; }st; unsigned char all[2]; unsigned int color; // вот эта самая модификация }un1; //---------- un1.all[0]=getchar(); // первый байт цвета принимаем un1.all[1]=getchar(); // второй байт цвета принимаем fill_screen(un1.color); // отправляем на заливку цветом |
Автор: | mr_smit [ Пн фев 15, 2010 21:33:35 ] |
Заголовок сообщения: | |
Итак, не работает. Точнее не так как надо. Код: ...
// Declare your global variables here union { struct{ unsigned char blue:5; unsigned char green:6; unsigned char red:5; }st; unsigned char all[2]; unsigned int color; // вот эта самая модификация }un1; ... // заливка дисплея цветом color void fill_screen (unsigned int color) { int i; for (i=0; i<132*176; i++) WRDATA(color); } void main(void) { ... LCD_init(); fill_screen(0xFFFF); // Global enable interrupts #asm("sei") while (1) { un1.all[0]=getchar(); // первый байт цвета принимаем un1.all[1]=getchar(); // второй байт цвета принимаем fill_screen(un1.color); // отправляем на заливку цветом }; } При отправке красного цвета, дисплей заливается сначала светло-синим, потом синим, т.е. как бы 2 раза. Снифер фиксирует 63488. Вот прикладываю видео, смотрите, выложил на ютуб: http://www.youtube.com/watch?v=tRCStwB8EUY Видео с комментариями. Или можете скачать посмотреть, снимал на телефон (mp4): http://ifolder.ru/16431552 http://narod.ru/disk/17946441000/15022010036.mp4.html |
Автор: | urry [ Пн фев 15, 2010 23:54:46 ] |
Заголовок сообщения: | |
Cуществует big-endian и litl-endian формат представления чисел - в числе инт 1 байт старший. а второй младший, или наоборот. Зависит от компилятора. Просто поменяйте байты местами, т.е Код: union {
unsigned char all[2]; unsigned int color; // вот эта самая модификация }un1; while (1) { un1.all[1]=getchar(); // первый байт цвета принимаем un1.all[0]=getchar(); // второй байт цвета принимаем |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |