ну и где затык ?
На компе открываете Ваш файл как бинарник, грузите в массив.Бьете массив на пакеты, закрываете контрольной суммой каждый пакет.
Выгружаете пакет в ком-порт, мк его проверяет и пересылает в дисплей, дальше ждете подтверждение от мк, если у него что-то там не сложилось, повтор пакета, иначе - передача следующего.Байты считаем, закончились - конец обмена.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Как это в коде реализовать не знаю. getchar() принимает по одному символу. Например:
Код:
// возьмем например размер блока 24 unsigned int image[23];
// i - флаг начала передачи изображения (отправляет ПК) if (getchar() == 'i'){ while (getchar() != 'e') { // конец блока (end) принимаем данные в массив Как??? }
когда он заполнен отправляем в дисплей (или если пришел флаг конца передачи) }
_________________ Нельзя всё знать, достаточно понимать.
// возьмем например размер блока 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++; }
я интуитивно сделалбы так. Если не прав, поправьте.
_________________ Если не трудно, то отвечайте мне названиями буржуйских схем.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Не ругайтесь сильно, пытаюсь разобраться.
В каком формате в этом случае должны идти данные cо стороны ПК?
Например, массив цветов каждого пикселя картинки размером 5х1 (красный,черный,черный,белый,белый) в формате 5-6-5 (готовый для записи в дисплей) выглядит так:
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?
_________________ Нельзя всё знать, достаточно понимать.
делфи я не знаю, как бы сделал на си - у Вас каждая точка выдается 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;
юнион - это союз двух переменных, которые занимают одно и то же место в оперативной памяти. Меняешь одну - сразу меняется другая.
Ок, пошли сначала.
Ком -порт выдает только инфу побайтно в любых раскладах, так ?
был вопрос - как разделить, хоть непонятно зачем это деление в принципе - тот самый инт, что пришел с уарта, прямо отправляете в дисплей.
Вот выложена библиотека в соседней ветке
http://radiokot.ru/forum/viewtopic.php?t=17721&start=0 - видимо, я не понимаю вопроса
Как отправить я знаю, я не понимаю ЧТО отправить???
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); // отправляем на заливку цветом
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Итак, не работает. Точнее не так как надо.
Код:
... // 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.
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(); // второй байт цвета принимаем
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения