работа с портами в winxp

skyformstd

как можно осуществить? например доступ к LPT и к конкретной его ножке?

kokoc88

Написать сервис или драйвер, которые в режиме ядра будут делать out в порт.

skyformstd

то есть стандартными апи функциями ничего не добиться? как я понимаю outport & inport под виндоуз не работают...

Dasar

если ножки стандартные data-овские, то открыть как файл.
если нестандартные, то тоже можно, как файл, но уже с извратами, и не все ножки

skyformstd

createfile?

Dasar

да

skyformstd

Вообщем есть у меня на лпт порту самодельное устройство с 8 светодиодиками, которые приделаны к дата пинам лпт.В работоспособности девайса сомнений нет. Как мне на конкретную ножку через writefile подать данные, чтобы диод загорелся?Пробовал вот так:
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
void main
{
HANDLE hLPT=CreateFile("LPT1",GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
int p=255;
DWORD dw;
OVERLAPPED ov;
WriteFile(hLPT,&p,sizeof(p&dw,&ov);
CloseHandle(hLPT);
}
else cout << "Error Open" << endl;
}

Ни одна не загорается
Правда потом понял у меня writefile возвращается с ошибкой номер 5 ERROR_ACCESS_DENIED.Как это поправить мож кто знает?

psm-home

Правда потом понял у меня writefile возвращается с ошибкой номер 5 ERROR_ACCESS_DENIED.
Ну это понятно. Ты же пишешь
 HANDLE hLPT=CreateFile("LPT1", GENERIC_READ ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

А сам пишешь в устройство. Ставь GENERIC_WRITE вместо GENERIC_READ.

skyformstd

блин после предыдущей модификации не заметил ) ща попробую. теперь 6-ую выдает ERROR_INVALID_HANDLE .Хотя createfile нормально открывает порт(успешно)

Dasar

попробовать так

HANDLE hLPT=CreateFile("LPT1", GENERIC_READ | GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Проверить, что lpt называется именно lpt1 и что он определился в Windows-е (включен в биосе)

rosali

Кажись надо писать "LPT1:"
PS. Хотя не, ничего про LPT в MSDN-е не вижу, только про COM пишут. Может и нельзя LPT через CreateFile открыть

Dasar

какой-то у тебя неправильный msdn
навскидку
http://support.microsoft.com/default.aspx?scid=kb;en-us;823179&Product=vb6
в качестве, имени можно попробовать и (если записывать в коде, то слэшей соответственно будет в два раза больше)

skyformstd

так он его открывает успешно.Хендл получает нормально.Ошибки в открытии никакой нет.Или все равно может быть в дальнейшем что-то не так?

skyformstd

Все попробовал. 0 реакции.Все также.Открытие порта ок.Получение хендла ок.Запись - ошибка номер 6.Инвалид хэндл.Бред какой-то.
У меня есть программка кем-то другим написанная(без исходников там можно по битам данные в лпт кидать.Так вот с нее лампочки загораются и тухнут как милые.(так что лпт определен и работает хорошо)

Dasar

OVERLAPPED нафиг убери

int p=255;
DWORD dw;
WriteFile(hLPT,&p,sizeof(p&dw,0);

skyformstd

прогресс есть: Пишет OK Open LPT1 и виснет нах всмысле не завершается
Сейчас вариант такой:
void main
{
HANDLE hLPT=CreateFile("LPT1", GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hLPT!=INVALID_HANDLE_VALUE)
{
cout << " Ok Open LPT1" << endl;
int p=255;
DWORD dw;
int t=WriteFile(hLPT,&p,sizeof(p&dw,NULL);
CloseHandle(hLPT);
}
else cout << "Error Open" << endl;
}

Dasar

Ждет когда ему железка подтвердит прием данных.

Dasar

ботай функцию SetCommState
тебе ее с правильными параметрами надо вызывать перед WriteFile-ом.
ps
Также еще можно повызывать функцию SetCommTimeouts

skyformstd

SetCommState только для Serial портов

dimabel

А мб. это надо делать через UNC-пути? Всё-таки, LPT1 - это порт принтера и открываться он должен, по идее, как текстовый файл. - для вывода текста.
Оставить комментарий
Имя или ник:
Комментарий: