Николай Коровин (21.11.2015 14:59, просмотров: 326) ответил AlexG на Есть ли простые способы передать монохромную картинку из буфера в памяти микроконтроллера через UART на экран компьютера и на экране ее регулярно обновлять? (разрешение картинки может быть ориентировочно от 122x32 до 320x240)
А чего там писать-то? Вот, рисует прямо по десктопу. Нуль-терминатор начинает новый экран, символы с кодами выше 127 — семёрки пикселов. Накидал за полчаса, особо не тестил, но выхлоп похож на правду.
#include <iostream.h>
#include <conio.h>
#include <process.h>
#include <stdio.h>
#include <fstream.h>
#include <windows.h>
HANDLE hCom;
HDC hDC;
int InitCom(const char *Comm, int Baud)
{
DCB dcb;
COMMTIMEOUTS TO;
BOOL fSuccess;
hCom = CreateFile(Comm, GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attrs
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
NULL); // hTemplate must be NULL for comm devices
if (hCom == INVALID_HANDLE_VALUE) return 0;
GetCommState(hCom,&dcb);
dcb.BaudRate = Baud;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
fSuccess = SetCommState( hCom, &dcb);
if(!fSuccess) return 0;
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
GetCommTimeouts( hCom,&TO);
TO.ReadIntervalTimeout=MAXDWORD; //This magic combiantion means "return received data only";
TO.ReadTotalTimeoutMultiplier=0;
TO.ReadTotalTimeoutConstant=0;
SetCommTimeouts( hCom,&TO);
return 1;
}
int Pos=0;
#define HSIZE 320
void UpdatePixel (char Pixel)
{
if (!Pixel) Pos=0; //sorta null-term
else if (Pixel>127)
{
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel &1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>1&1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>2&1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>3&1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>4&1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>5&1));
Pos++;
SetPixel (hDC, Pos%HSIZE, Pos/HSIZE, 0xFFFFFF * (Pixel>>6&1));
Pos++;
}
}
void main (int argc, char *argv[])
{
char i,o,name[]="COM1";
unsigned long ret;
int speed=115200;
hDC=GetDC(0);
if (argc == 2) speed = atoi (argv[1]);
for (name[3]='9';name[3]>'0';name[3]--) if (InitCom (name, speed))
{
cout<<"COMM Port found on "<<name<<endl;
break;
}
for (;;)
{
if (kbhit())
{
i=getch();
WriteFile(hCom,&i,1,&ret,NULL);
}
ReadFile(hCom,&o,1,&ret,NULL);
if (ret)
{
cout<<o;
UpdatePixel(o);
}
flushall();
}
ReleaseDC(0,hDC);
}