Автор статьи Чута Олег.
Разработка устройств подключаемых к компьютеру и способных обмениваться данными на уровне железа, всегда будоражило моё сознание.
Так например можно управлять любым механическим устройством от простого электромагнита до сложных шаговых двигателей. И в тоже время вводить в ПК угол наклона относительно земли, скорость вращения, уровень освещенности.
Это единицы примеров, по большому счету любой аналоговый химико-физический можно преобразовать в двоичный и код и в обратном направлении управлять процессом с помощью кода.
Первый мой проект (бакалаврская работа) — это работа с LPT-портом. А точнее это подключение 8-битного параллельного АЦП к двунаправленному параллельному порту ПК.
Почему параллельный порт?
Параллельные порты исторически появились раньше. Причина — простота. Конечно последовательные порты идут вслед, наступают и "выигрывают" (!) в некоторых областях.
Так вот, с точки зрения электроники этот порт выглядит как 8 контактов, на которых в зависимости от установленного бита 1 или 0 — установлено напряжение 5 В = лог 1, 0 В = лог 0 это пример только для ТТЛ.
Простота:
WriteFile( b010110000 , LPT1);
и на выходе порта у нас на первом выводе 0 В на втором 5 В, на третем 0 В и т.д.
Но это раритет — сделаешь девайс на нем — засмеют. Проскакиваем Com-port.
И сразу USB — Universal Serial Bus — последовательный порт, понятно из названия.
И благодаря не самым новейшим хардварным разработкам мы и тут проскакиваем мимо изучения стэка протокола, всех команд и всех спецификаций.
Микросхема FT245 — преобразователь USB -> RS232 (COM-port) -> 8 bit FIFO.
Эта микросхема ничем бы не отличалась от обычного кабеля к телефону средней давности, если бы не RS232 (COM-port) -> 8 bit FIFO.
А вот здесь мы как раз получаем 8 бит двоичный код в параллельном виде. Как в LPT.
"Hello, word" — это программа с которой начинают все книги по изучению программных языков. Подключение светодиодов на выход для индикации кода, который послан в порт — это и есть самая простая схема которая может показать работоспособность нашего программно-аппаратного комплекса.
Паяем все с первого раза правильно. Подключаем к USB - и увидели устройство. Подкинули на него драйвера с оригинального сайта www.ftdichip.com.
И теперь это USB-to-serial converter или Virtual COM7 — номер будет отличатся при разных операционках.
Так как плата испытательная, то схему не разводил, собрал все на монтажной плате:
Для того чтобы быстро проверить работоспособность, запускаем HyperTerminal и конектимся к определившемуся COM порту. Настройки соединения по умолчанию.
Печатаем символы -- получаем на выходе схемы двоичный код из ASCII-таблицы соответствующий посланному символу.
Дальше пишем свою программу (код на C++)
#include "stdafx.h"
#include
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
DCB dcb;
BYTE a=128;
BYTE b=1;
BYTE c=0;
HANDLE hCom_1=NULL;
OVERLAPPED osWrite = {0};
DWORD dwWritten;
DWORD dwRes;
BOOL fRes;
char* str = (char*) malloc(sizeof(char) * 1000);
ZeroMemory(&dcb,sizeof(DCB));
hCom_1=CreateFile("COM3", GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCom_1==INVALID_HANDLE_VALUE)
{
return false;
}
if (!GetCommState(hCom_1, &dcb))
{
CloseHandle(hCom_1);
return false;
}
dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.StopBits=ONESTOPBIT;
dcb.Parity=NOPARITY;
if (!SetCommState(hCom_1,&dcb))
{
CloseHandle(hCom_1);
return false;
}
// Create this write operation's OVERLAPPED structure's hEvent.
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osWrite.hEvent == NULL)
return FALSE;
while ( TRUE )
{
if (!WriteFile (hCom_1,&c,sizeof (BYTE),&dwWritten, &osWrite))
dwRes = WaitForSingleObject(osWrite.hEvent, INFINITE);
Sleep(100);
if (a == 1)
{
a=b-a;
b=b-a;
a=a+b;
}
if (a == 8)
{
a=a/2;
b=b*2;
}
c = a+b;
b=b*2;
a=a/2;
}
CloseHandle(hCom_1);
return 0;
?>