Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как перевести AVREAL на работу с USB?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Алекс-666
На фирме для прошивки AVR используется AVREAL. Порт LPT соединяется с платой простым шлейфом, все прибамбасы, обеспечивающие прошивку, собраны на плате. LPT явно уходит в небытие. Как с наименьшими потерями реализовать прошивку через USB, не меняя платы?
haker_fox
Цитата(Алекс-666 @ Feb 1 2008, 15:54) *
На фирме для прошивки AVR используется AVREAL. Порт LPT соединяется с платой простым шлейфом, все прибамбасы, обеспечивающие прошивку, собраны на плате. LPT явно уходит в небытие. Как с наименьшими потерями реализовать прошивку через USB, не меняя платы?

В Вашем случае дешевле купить плату контроллера LPT и воткнуть ее в PCI слот компьютера.
ReAl
Выгнать автора AVREAL в отпуск на месяц с запретом посещения форумов :-)
Ещё лучше - наплести что-то его гендиректору, чтобы тот уволил его с работы - тогда он с пол года никуда работать не пойдёт, оттянется наконец-то (что-то переход с работы не на дядю на работу на дядю мало добавил свободного времени :-( Видать отрава где-то в крови, надо много времени, чтобы вышла).

p.s. Самому в новый комп пришлось PCI-LPT плату покупать.
hd44780
Переходите на что-то COM-порт ориентированное.

У меня есть контроллер 1LPT+2COM на чипе NetMos9835CV. COM порты работают, а LPT не могу понять, какой у него базовый адрес, непонятно.
Для MS-DOS дают утилитку, которая позволяет задать адрес порта, а в винде непонятно как это сделать. В итоге, по факту я не могу пользовться этим портом.
Поэтому советую обращать на это внимание.
ReAl
Цитата(hd44780 @ Feb 1 2008, 10:24) *
У меня есть контроллер 1LPT+2COM на чипе NetMos9835CV. COM порты работают, а LPT не могу понять, какой у него базовый адрес, непонятно.
У меня, кажется, MoSys или что-то в этом духе, но это неважно.
В виндовс Мой Компьютер/Свойства/Оборудование/Диспетчер устройств/...LPT - закладка "Ресурсы". Там указан диапазон адресов ввода-вывода. У меня плата села на E800.
zltigo
Цитата(ReAl @ Feb 1 2008, 11:28) *
Там указан диапазон адресов ввода-вывода. У меня плата села на E800.

В том, что может и спрыгуть sad.gif при установке нового оборудования, а вообще можно и поиск железа на PCI организовать - будет хоть и LPT программатор, но самый продвинутый smile.gif smile.gif smile.gif
hd44780
Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка.
Igor26
Цитата(hd44780 @ Feb 1 2008, 12:47) *
Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка.

Скорее всего используются API-функции. Тут уже говорили, что достаточно при вызове нужной API-функции в качестве одного из аргументов указать, например, COM38, или LPT9. И здесь уже не важно к каким адресам привязан данный порт, лишь бы диспетчер устройств их видел и распознавал как COM38, или LPT9.
rx3apf
Цитата(ReAl @ Feb 1 2008, 11:15) *
Выгнать автора AVREAL в отпуск на месяц с запретом посещения форумов :-)
p.s. Самому в новый комп пришлось PCI-LPT плату покупать.

Но если вдруг надумаешь - мне что-то такое помнится про FT245B, что он умеет что-то типа SPI, чтобы на дрыгоножство не особо много времени уходило. Или я путаю ?
Сергей Борщ
Цитата(rx3apf @ Feb 2 2008, 13:47) *
Но если вдруг надумаешь - мне что-то такое помнится про FT245B
Не-не-не!!! Только FT2232! На ней делается море всяких JTAG-отладчиков (OpenOCD, Amontec JTAG-Key, Olimex USB-JTAG-Tiny и т.д.), SPI тоже есть, и было бы очень удобно иметь одну железку под все камни. К тому же, у ReAl уже есть платка с такой микросхемой wink.gif
ReAl
На 245-ой я пробовал как только она у меня в руках появилась. Можно, но это будет тормозило такое, что "редкая птица" доживёт до середиы программирования. Она хороша только ПЛИС залить и перейти в нормальный режим или же кнтроллеры писать, но не верифицировать и не читать.
Асинхронный бит-банг (а только он есть у 245/232) даёт возможность читать по биту за две транзакции по USB, не быстрее.

2232 уже лапочка, платка спаяна больше года назад (умолчим, нсколько больше), только я вот уже боюсь что-то кому-то обещать.
Алекс-666
Господа, правильно ли я понял, что через USB я не смогу заливать программы? Вариант с приобретением платы контроллера LPT непригоден, часто приходится работать на компах клиента, прямо на объекте, и вставлять что-либо в слоты позволит далеко не каждый.
Lepeksiy
С помощью avreal через usb нельзя. Надеюсь только пока.
Хотя есть переходники USB->LPT, но не знаю заработает ли такая связка.

А вообще USB программаторов много. От Prottoss'a например.
GDI
Цитата
Как с наименьшими потерями реализовать прошивку через USB, не меняя платы?

Воспользоваться прогой AVRDUDE - она умеет и LPT, и USB, и много чего еще. Кстати она доступна в исходных кодах и может быть уважаемый ReAl подсмотрит там функции работы с USB и расширит таки свою программу, раз она стала стандартом дефакто у отечественных производителей и разработчиков? smile.gif
mdmitry
С USB и avrdude не все радужно, в ветке http://electronix.ru/forum/index.php?showtopic=42389 есть обсуждение
GDI
Цитата
С USB и avrdude не все радужно, в ветке http://electronix.ru/forum/index.php?showtopic=42389 есть обсуждение

Возможно, но человеку нужен программатор, а не джитаг, сам я пользовался связкой: AVR910USB с прошивкой от AVRDOPER(STK500) и AVRDUDE, Нареканий не было, использовалось это и в виндовс и в линукс.
vvs5
Цитата(hd44780 @ Feb 1 2008, 12:47) *
Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка.

в Ponyprog есть Help, в Help есть FAQ. Самый последний ответ.
Удачи.
Кстати Ponyprog недавно обновился.
ReAl
Цитата(hd44780 @ Feb 1 2008, 11:47) *
Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка.
Есть такой Jan Axelson parallel port FAQ, там приведён способ через некий ключ в реестре определяются наличествующие порты и потом в их ключах в одной двоичной записи берутся два байта и составляется базовый адрес порта. Беда в том, что работает это только с набортными LPT (возможно - с портами, для которых у 2000/XP есть драйвер). А для стоящего у меня PCI-LPT+2COM адаптера (драйвер был на компакте с платой) и ключи в реестре другие, и смещение адреса в двоичном ключе другое (т.е. просто зная адрес я его нашёл в другом месте).
А с набортные имеют стандартные адреса 378/278/3BC и для них достаточно ключиков -p1/-p2/-p3.
Универсального способа я не нашёл (плохо искал?) потому и забросил это дело.
zltigo
Цитата(ReAl @ Feb 5 2008, 23:19) *
Универсального способа я не нашёл (плохо искал?) потому и забросил это дело.

А его скорее всего и нет - конкретные драйвера знают а другим и не надо smile.gif. Однако полууниверсальный сделать несложно - базовые адреса и прочие ресурсы железок PnP-плеятся и лежат по унифицированным фиксированым адресам в конфигурации железа. По Vendor и Device прочитать и пользоваться. Производителей PCI LPT где-то 3-4.
rezident
Цитата(ReAl @ Feb 6 2008, 01:19) *
Универсального способа я не нашёл (плохо искал?) потому и забросил это дело.
В программаторе Курта для MSP430 в режиме RAW пользователем тупо адрес LPT-порта в настройках программы может задаваться.
vesago
Слепить на m8 клон аврисп.
ReAl
Цитата(rezident @ Feb 6 2008, 00:39) *
В программаторе Курта для MSP430 в режиме RAW пользователем тупо адрес LPT-порта в настройках программы может задаваться.
У avreal - уже не помню, с 1.00beta0 или немного позже, но во всяком случае с момента начала выкладывания в интернет году в 1999-том - в ключе -p может задаваться не номер LPT, а его адрес. Число в ключе воспринимается как шестнадцатеричное и если оно больше 0x100 - то это адрес, на адреса меньше 0x100 лазить нефиг.
Люди как раз просят задавать номер, а адрес чтобы искала программа сама.
Хотя я обхожусь адресом, выцепленным вручную из свойств оборудования - я не каждый день глобально меняю конфигурацию компа, а добавление сетевухи и видеозахватчика адрес LPT не подвинуло. Года три-четрые назад игрался с другой PCI-LPT картой, была другая мамка, адрес той карты был другой, но он тоже не подвинулся при мелких изменениях в компе (типа того же видеозахватчика).
На всех компах, на которых я работаю, в окружении прописал переменную AVREAL_PORT и в makefile в вызове avreal стоит -p$(AVREAL_PORT) (в батниках не-для-себя соответственно -p%AVREAL_PORT%), поэтому я просто не замечаю, где какой адрес.
forever failure
Тов. ReAl, а в *никсовых версиях Вашего программатора обращение к порту идёт через соответствующие файлы устройств или через прямой вызов функций inb ()/ outb () ?
ReAl
Цитата(forever failure @ Feb 6 2008, 10:34) *
Тов. ReAl, а в *никсовых версиях Вашего программатора обращение к порту идёт через соответствующие файлы устройств или через прямой вызов функций inb ()/ outb () ?
Там сейчас винегрет - в FreeBSD на /dev/ppi, в линуксе - ioperm() и inb()/outb(). "Исторически сложилось".
Сейчас дописываю единый код - для линукса будет и /dev/parport, для bsd- и прямое обращение, просто в зависимости от формы ключа -p (число или строка).
Заодно делаю для win32 - если не NT-шный ряд осей, то не грузить dlportio и лазить напрямую, всё равно, если я правильно понимаю, в этом случае сама dlportio.dll не обращается к dlportio.sys а лазит напрямую.
DOS-версия будет приостановлена до получения аргументированных возражений против такого положения вещей (а дальше будем торговаться dos16 или dos32-dpmi).

p.s. по дороге я там ещё кое-что в структуре программы поменяю и после этого надеюсь за ft2232 взяться. Надеюсь wink.gif
bodja74
Цитата(ReAl @ Feb 6 2008, 12:03) *
Люди как раз просят задавать номер, а адрес чтобы искала программа сама.


Все доступные для открывания порты как СОМ так и LPT на момент запуска программы в символических именах ,можно определить через API.Там несложно ,могу примерчик скинуть.
Можно поискать и в Gogle типа "COM LPT API" даст кучу ссылок smile.gif
А вот работать с ними через API глухой номер ,я пытался поработать с СОМ ,у меня зараза на больших скоростях пропускает байты при приеме,плюнул ,переполз опять на драйвер,а LPT нужет протокольный обмен ,тоесть отработка сигналов STROBE и ACK на порте,тупо дернуть ногой не удастся.
ИМХО ,лучше сразу подыскивать нормальный драйвер и закладываться на него.
ReAl
Цитата(bodja74 @ Feb 6 2008, 12:42) *
Все доступные для открывания порты как СОМ так и LPT на момент запуска программы в символических именах, можно определить через API. Там несложно, могу примерчик скинуть.
enum-нуть их наличие - таких примеров пруд пруди, "но мне туда не надо", если это не даёт возможность определить базовый адрес порта. А вот с этим не так просто.
В доступных мне на момент "ещё не надоело искать" (года четыре назад) примерах находилось не всё, адрес имеющейся у меня тогда платы не находился.
bodja74
А зачем вам базовый адресс ?
Я допустим по сей день не знаю какие у меня адресса smile.gif
Обратиться можно по имени или по номеру.
Вот например для АПИ.
Код
    ' Initialize Communications
    lngStatus = CommOpen(1, "COM1" , _
        "baud=9600 parity=N data=8 stop=1")
    
    If lngStatus <> 0 Then
    ' Handle error.
        lngStatus = CommGetError(strError)
    MsgBox "COM Error: " & strError
    End If


Вот для драйвера

Код
MSComm.CommPort=1


Порты могут не увидиться в случаях если заняты под принтер,мышку,другим приложением или вообще винда не видит оборудования .У меня дополнительные платы под порты тоже стоят ,уже нераз палил LPT biggrin.gif
ReAl
Цитата(bodja74 @ Feb 6 2008, 19:23) *
А зачем вам базовый адресс ?
А чтобы значение ножки BUSY узнать, прочитав регистр статуса, или там на ножку STROBE выдать "0", потом пощёлкать на данных, потом на STROBE выдать "1". Вот такие извращения.

Цитата(bodja74 @ Feb 6 2008, 19:23) *
Я допустим по сей день не знаю какие у меня адресса smile.gif
Обратиться можно по имени или по номеру.
Вот например для АПИ.
Код
    ' Initialize Communications
    lngStatus = CommOpen(1, "COM1" , "baud=9600 parity=N data=8 stop=1")
А, COM-порт...
Под win32 предпочитаю так:
Код
void eunit_interface_rs232::open_com_port(const char *portstr, uint32_t baud)
{
    hcom = CreateFile(portstr, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    if (hcom == INVALID_HANDLE_VALUE)
        throw eunit_error(EU_CMD_NOCOMM,
...
    EscapeCommFunction(hcom, SETDTR);
    EscapeCommFunction(hcom, SETRTS);
На 115200 байтики не теряются, быстрее не пробовал.
Но это не решает проблемы, связанные с "ногодрыжеством" на LPT.

Цитата(bodja74 @ Feb 6 2008, 19:23) *
Порты могут не увидиться в случаях если заняты под принтер,мышку,другим приложением или вообще винда не видит оборудования .У меня дополнительные платы под порты тоже стоят ,уже нераз палил LPT biggrin.gif
Винда видит (раз через свойства/оборудование/... и так далее для LPT1 на закладке "ресурсы" базовый адрес показывает), принтера на ней нет и не ставился. Не винда не видит, а применяемый в стандартных примерах код поиска базового адреса по реестру, я же писал уже. А вручную подбирать для имеющейся платы и потом нарываться на то, что на другом производителе может и не пойти - вломно как-то. Поэтому предпочитаю указывать вручную, как и у упоминавшегося выше чьего-то программатора для MSP430.
bodja74
ReAl
Если брать по большому счету ,то у вас проблема ,которой не существует smile.gif
Если ваш драйвер не поддерживает выражения типа :

Код
тыры-пыры_имя_драйвера.тыры-пыры_назначить_порт=1 или 2 или 3


а требует только базовый адресс ,то пошлите его лесом гулять,и подыщите нормальный.
Не нужно будет извращаться с копаниями в реестре вообще.
К примеру если для LPT нужно ,есть драйвер TVicPort ,ложится под любой язык ,начиная с Билдера кончая .NET .
Сам определяет какие есть порты ,сколько их,какие у них базовые адресса,дергает любой ногой,
есть даже дополнительные фичи - типа определить серийник винта или назначить лицензию на определенное количество дней .
Можно и другой подыскать на свой вкус.
Я с LPT редко работал ,поэтому коллекцию себе не собирал.
ИМХО если чтото новое мутить ,то лучше на LPT и не закладываться,но это дело хозяйское smile.gif

Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов.
Если подкинете свой рабочий вариант ,с меня будет пиво и уважуха biggrin.gif
singlskv
Цитата(bodja74 @ Feb 7 2008, 20:30) *
Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов.
Если подкинете свой рабочий вариант ,с меня будет пиво и уважуха biggrin.gif
Пиво по интернету передавать умеете ? smile.gif

пользуетесь ли Вы таймаутами ком порта ? (в SetupComm)
пользуетесь ли Вы функцией Sleep(x) ?
bodja74
Цитата(singlskv @ Feb 7 2008, 22:00) *
Пиво по интернету передавать умеете ? smile.gif

Конечно biggrin.gif
Цитата
пользуетесь ли Вы таймаутами ком порта ? (в SetupComm)

Нет
Цитата
пользуетесь ли Вы функцией Sleep(x) ?

Да ,в цикле 100мс ,если байтов нет ,выходим.
singlskv
А какая длина пакета на приеме
и сколько байт на прием передаете функции ReadFile ?

И скорость порта какая ?
ReAl
Цитата(bodja74 @ Feb 7 2008, 19:30) *
ReAl
Если брать по большому счету ,то у вас проблема ,которой не существует smile.gif

Очень рад это слышать. Причём похожая проблема как минимум у уже упоминавшегося в этом треде программатора для MSP430. Вы одним махом решили проблемы минимум двух программаторов.

Цитата(bodja74 @ Feb 7 2008, 19:30) *
а требует только базовый адресс ,то пошлите его лесом гулять,и подыщите нормальный.
Не нужно будет извращаться с копаниями в реестре вообще.
К примеру если для LPT нужно ,есть драйвер TVicPort ,ложится под любой язык ,начиная с Билдера кончая .NET .
Сам определяет какие есть порты, сколько их, какие у них базовые адресса,дергает любой ногой
Это вот этот?
http://www.entechtaiwan.com/dev/port/index.shtm
Слышал про него раньше, но он не был фриварным.
Качаю. Ставлю. Перегружаюсь.
Леплю маленькую программульку.
Код
#include <windows.h>
#include <stdio.h>
#include "TVicPort.h"

#define DLLNAME "TVicPort.dll"

int main()
{    
    USHORT    VICFN (*pGetLPTNumPorts)();
    int ports;    
    HINSTANCE hdll = LoadLibrary(DLLNAME);
    
    if (hdll == NULL) {
        puts("Can't load " DLLNAME);
        return 1;
    }

    puts( DLLNAME " loaded");
    
    pGetLPTNumPorts = GetProcAddress(hdll, "GetLPTNumPorts");
    if( pGetLPTNumPorts == NULL) {
        puts( "Can't get GetLPTNumPorts() address");
        return 1;
    }

    ports = pGetLPTNumPorts();
    printf("%d  LPT ports found\n", ports);

    FreeLibrary(hdll);
    return 0;
}

Запускаю. Получаю.
Код
TVicPort.dll loaded
0  LPT ports found


На всякий случай проверяю - вдруг моль трахнула мой LPT пока я был на работе.
CODE
avreal/WIN32 - AVR controllers LPT programmer by Redchuk Alexandr
v1.25rev6 (Dec 30 2007 17:00:01) http://www.ln.ua/~real/avreal
bug-reports, suggestions and so on mail to avreal@real.kiev.ua

Command:
-ab -pE800 +mega168 -%
% LPT base port 0xE800
% assume that LPT data writes not faster then 1uS
% ByteBlasterMV found
% ByteBlaster mode
% osc = 800kHz -> setup=3, hold=3,2
% Reset
% PgmOn reply 0x00005300
% Synchronised after 1 try
% GetID reply 0x0030001E
% GetID reply 0x00300094
% GetID reply 0x00300006
% Read ID: 0x1E9406
Device connected, MEGA168 detected
% ReadLock command 0x58000000
% ReadLock reply 0x005800FF
Chip not locked
% ReadOsccal command 0x38000000
% ReadOsccal reply 0x003800B0
% ReadFuses command 0x50000000
% ReadFuses reply 0x005000C2
% ReadFuses command 0x58000000
% ReadFuses reply 0x005800FF
% ReadFuses command 0x58080000
% ReadFuses reply 0x005808DD
% ReadFuses command 0x50080000
% ReadFuses reply 0x005008F9
Fuses
OSCCAL = B0
CKDIV = 1
CKOUT = 1
SUT = 0
CKSEL = 2
BLB1 = 3
BLB0 = 3
RSTDISBL = 1
DWEN = 1
WDTON = 1
EESAVE = 1
BODLEVEL = 5
BOOTSZ = 0
BOOTRST = 1
Reset pin released
Adapter disabled

Нет, не трахнула.

Собственно, в хелпе на GetLPTNumPorts ясно написано:
Цитата
Some new ports like PCI LPTs does not report about its resources so you should add this kind of ports to TVicPort manually with the help of AddNewLPT function.
Т.е. возвращаемся к тому, что было - нужно как-то узнать адрес. А если я его уже знаю - мне этит твикпорт для доступа к LPT и не нужен.

Или имелся ввиду какой-то другой TVicPort?
Там рядом ещё есть TVicLPT, который обещает и с нестандартными PCI-портами работать.
Single License is $65 U.S.

Цитата(bodja74 @ Feb 7 2008, 19:30) *
Я с LPT редко работал ,поэтому коллекцию себе не собирал.
ИМХО если чтото новое мутить ,то лучше на LPT и не закладываться,но это дело хозяйское smile.gif

"Тут трактор нужен"...
Вся тема посвящена использованию СТАРОГО, понятно, что лучше быть богатым и здоровым, чем бедным и больным.

Цитата(bodja74 @ Feb 7 2008, 19:30) *
Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов.
Я ничего из интернета не дёргал, MSDN читал. Там есть хороший пример - MTTTY (Multi-Threaded TTY).
У меня никаких Sleep()-ов, отдельный поток спит до появления байтиков в порту.
По осциллографу от стопа последнего байта входящего в PC пакета до старта выходящего ответа микросекунд двести было на атлоне-550MHz/W2000SP3. С тех пор с ком-портом практически не работал.
zltigo
Цитата(ReAl @ Feb 8 2008, 00:06) *
Вы одним махом решили проблемы минимум двух программаторов.

Постараюсь на днях подыскать себе в ноутбук чего-нибудь PCMCIA-йное PCI-USB. Появится стимул - думаю разберусь с базовым адресом безотносительно к драйверу, но не совсем безотносительно к железу sad.gif и доложусь...
Собственно я уже писал, как собираюсь поступить (и поступаю под своей операционкой с PCI мультипортовыми RS232)
- по PCI информации. Базовые адреса там, естественно, присутствуют. Этим:
http://members.datafast.net.au/~dft0802/
для начала можно посмотреть.
singlskv
Цитата(ReAl @ Feb 6 2008, 23:55) *
Винда видит (раз через свойства/оборудование/... и так далее для LPT1 на закладке "ресурсы" базовый адрес показывает), принтера на ней нет и не ставился. Не винда не видит, а применяемый в стандартных примерах код поиска базового адреса по реестру, я же писал уже.


Попробуйте у себя такой метод через реестр:
идем HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Enum
видим типа ключ '0' ACPI\PNP0400\4&2a083901&0
если несколько LPT то ключей будет несколько '1','2',....
идем
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0400\4&2a083901&0\Device Parameters
и убеждаемся по ключу PortName что это нужный нам LPT, например LPT1
идем
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0400\4&2a083901&0\LogConf
читаем ключ BootConfig
в нем по смещению 0x18 должен сидеть адрес LPT
по смещению 0x20 сидит количество портов которые задействованны устройством, например
для стандартного LPT по адресу 0x20 находится 8
Эти 2 числа и используются для вывода диапазона адресов устройства
в панели управления , например 0x378-0x37f

Аналогично ищутся адреса любых устройств.
Например для COM:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Enum
'0' = ACPI\PNP0501\1
'1' = ACPI\PNP0502\2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1\Device Parameters
PortName = COM1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\2\Device Parameters
PortName = COM2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1\LogConf
BootConfig 0x18=0x3F8 0x20=8 итого 0x3f8-0x3ff
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1\LogConf
BootConfig 0x18=0x3F8 0x20=8 итого 0x2f8-0x2ff

Это должно работать на 2000/XP
про более ранние и более позднии версии не знаю

Да, небольшое уточнение, структурка которая сидит в BootConfig одинаковая только
для однотипных(по задействованным ресурсам) устройств, те для портов она всегда такая, а например для
PCI-PCI bridge она другая
VslavX
Для определения базового адреса порта по его номеру в 2K/XP мне видится такой путь:
- определяем device object для нужного номера LPT. Можно просто разрешить Symbolic Links, или воспользоваться готовой информацией из документации на XP DDK - файл parallel.chm - "Parallel Device Interfaces, Internal Names, and Symbolic Links"
- потом выполняем запрос IRP_MJ_INTERNAL_DEVICE_CONTROL c подкодом IOCTL_INTERNAL_PARCLASS_CONNECT -
Цитата
"A client uses the IOCTL_INTERNAL_PARCLASS_CONNECT request to obtain a PARCLASS_INFORMATION structure that contains:
I/O resources allocated to the parallel port
Hardware capabilities of the parallel port
Pointers to callback routines that a kernel-mode driver can use to set the IEEE 1284 operating modes for a parallel device – see Setting and Clearing a Communication Mode for a Parallel Device
Pointers to callback routines that a kernel-mode driver can use to read and write a parallel device – see Reading and Writing a Parallel Device.

Не уверен, что получится выполнить этот запрос из приложения через DeviceIoControl, но попробовать можно. Если не получится - то придется написать небольшой драйверок или дополнить существующий, который разблокирует доступ к портам.
BTW, в ближайшее время попробую, для самого тема актуальная smile.gif
bodja74
Цитата(singlskv @ Feb 7 2008, 22:46) *
А какая длина пакета на приеме

От 256 байт до 256к ,короче бут в перемешку с прогером smile.gif
Цитата
и сколько байт на прием передаете функции ReadFile ?

От 64байт до 8К,по разному пробовал.
Цитата
И скорость порта какая ?

115200,
на каждых 4К ,теряется от 20 до 200 байт,по разному,
я тут думаю ,может буфер переполняется ,но вроде как в ReadFile больше нигде не указывается, laughing.gif

ReAl
Давайте не будем нашу дискуссию переводить в полемику.Хорошо?
Я догадывался ,что при желании вы этот драйвер раскритикуете от и до smile.gif ,поэтому предложил его в качестве примера ,не запрещая при этом найти себе более подходящий.
singlskv
Цитата(bodja74 @ Feb 8 2008, 20:37) *
От 256 байт до 256к ,короче бут в перемешку с прогером smile.gif
От 64байт до 8К,по разному пробовал.
115200,
на каждых 4К ,теряется от 20 до 200 байт,по разному,
я тут думаю ,может буфер переполняется ,но вроде как в ReadFile больше нигде не указывается, laughing.gif

ReadFile как я понимаю используется в варианте с блокировкой, те
без использования OVERLAPPED ?

Судя по Вашему ТТХ, у Вас происходит переполнение буфера FIFO на
приеме, это связанно с тем что если ReadFile не смог сразу считать все запрошенные
байты он фактически выполняет команду Sleep(0), те просто передает управление
следуещему процессу, а у Windows такт операционки достаточно большой...
Если Вы готовы поэкспериментировать, можно попробовать ...
ReAl
Цитата(bodja74 @ Feb 8 2008, 19:37) *
ReAl
Давайте не будем нашу дискуссию переводить в полемику.Хорошо?
Я догадывался ,что при желании вы этот драйвер раскритикуете от и до smile.gif ,поэтому предложил его в качестве примера ,не запрещая при этом найти себе более подходящий.
А давайте сначала Вы в качестве примера будете приводить драйвер, который действительно делает то, что Вы говорите о нём. А то "дискуссия" выглядит так
Цитата
- Винт тут у меня с очень хитрым шлицом, пробовал выточить отвёртку по нескольким разным чертежам - не лезет! Могу, конечно, прикинуть визуально и что-то слепить, но какой смысл, если попадётся другой, в который не полезет. Нужна информация по спецвинтам.
- Надо закрутить винт? Возьмите любой инструмент, которым нормальные люди закручивают винты, например, электроотвёртку с набором из плоской и крестовой вставок, сама лезет в любой винт, сама закручивает!
Ну или что-то другое по вкусу, я вообще мало винтов закручивал, поэтому инструментов много не собирал.
- Дык не лезут из этого набора в шлиц не массового винта!
- Не превращайте дискуссию в полемику, возьмите любой другой инструмент, я не запрещал искать по вкусу.

Ваши слова:
Цитата(bodja74 @ Feb 7 2008, 19:30) *
К примеру если для LPT нужно ,есть драйвер TVicPort ,ложится под любой язык ,начиная с Билдера кончая .NET .
Сам определяет какие есть порты ,сколько их, какие у них базовые адресса, дергает любой ногой, есть даже дополнительные фичи - типа определить серийник винта или назначить лицензию на определенное количество дней .
Можно и другой подыскать на свой вкус.
Я с LPT редко работал ,поэтому коллекцию себе не собирал.
Вы за них отвечаете или нет?
Я просто указал, что они не соответствуют действительности для тех портов, с которыми у меня "несуществующая проблема". Если так с Вами разговаривать нельзя - извините, не хотел обидеть.

Цитата(singlskv @ Feb 8 2008, 03:18) *
Попробуйте у себя такой метод через реестр:
идем HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Enum
...
в нем по смещению 0x18 должен сидеть адрес LPT
по смещению 0x20 сидит количество портов которые задействованны устройством
...
Это должно работать на 2000/XP
Хех... Кабы ж то всё так просто...
Вот с работы, W2000sp4, набортный LPT

Цитата
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Enum]
"0"="ACPI\\PNP0401\\4&2c575acb&0"
"Count"=dword:00000001
"NextInstance"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0401\4&2c575acb&0\Device Parameters]
"FirmwareIdentified"=dword:00000001
"PortName"="LPT1"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0401\4&2c575acb&0\LogConf]
"BootConfig"=hex(8):\
01,00,00,00, 0f,00,00,00, \
00,00,00,00, 01,00,01,00, \
04,00,00,00, 02,01,01,00, \
07,00,00,00, 07,00,00,00, \
ff,ff,ff,ff, 04,01,00,00, \
03,00,00,00, 00,00,00,00, \
00,00,00,00, 01,01,11,00, \
78,03,00,00, 00,00,00,00, \
08,00,00,00, 01,01,11,00, \
78,07,00,00, 00,00,00,00, \
08,00,00,00
Тут почти всё как Вы сказали - разница только в том, что по смещениям 0x18 и 0x20 "что-то не то" (возможно, некие флаговые значения, говорящие, чо надо идти дальше - но по крайней мере есть куда копать), а реальных два диапазона - по смещениям 0x38,0x40; 0x48,0x50.
Ну тут хоть наличие порта видно.

А вот дома, с PCI-платой...
Цитата
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Enum]
"Count"=dword:00000000
"NextInstance"=dword:00000000
"INITSTARTFAILED"=dword:00000001
Всё. Портов просто нет. Что означает INITSTARTFAILED - не знаю, но в свойствах - "устройство работает нормально", ради проверки даже достал из-под стола Epson LQ100+ (кстати, кому-то нужен? отдам бесплатно, самовывоз) проинсталлировал его драйвер на LPT1 и напечатал пробную страницу.

Кстати, в аналогичном HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Enum в наличии только один COM-порт, набортный COM1. А COM4 и COM5 от той же PCI-платы отсутствуют.
А живут они тут:
Цитата
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\MF\PCI#VEN_9710&DEV_9835&SUBSYS_00121000&REV_01\5&c47b19f&0&08F0#Child0002]
"DeviceDesc"="MosChip PCI Parallel Port"
"Capabilities"=dword:00000000
"UINumber"=dword:00000002
"HardwareID"=hex(7):4d,46,5c,50,43,49,39,37,31,30,5f,45,43,50,00,00
"ClassGUID"="{4D36E978-E325-11CE-BFC1-08002BE10318}"
"Class"="Ports"
"Driver"="{4D36E978-E325-11CE-BFC1-08002BE10318}\\0002"
"FriendlyName"="MosChip PCI Parallel Port (LPT1)"
"Mfg"="MosChip Technology"
"Service"="NmPar"
"ConfigFlags"=dword:00000000
"ParentIdPrefix"="6&19ad4653&0"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\MF\PCI#VEN_9710&DEV_9835&SUBSYS_00121000&REV_01\5&c47b19f&0&08F0#Child0002\Device Parameters]
"PortName"="LPT1"
"NationalChecked"=dword:00000001
"NationalChipFound"=dword:00000000
"FilterResourceMethod"=dword:00000001

Child0000 и Child0001 - это COM-порты от неё.
Я там дальше нашёл в данных адреса, могу их выковыривать, но когда и где вылезет очередная плата? Без нормального описания возможных ключей в этой части реестра можно всю жизнь экспериментировать и подбирать. Но в тех нескольких книгах по реестру, которые я видел - этого нет совсем. А примеры, включая и этот - я видел, но они далеко не всегда работают :-(


Цитата(VslavX @ Feb 8 2008, 09:56) *
Для определения базового адреса порта по его номеру в 2K/XP мне видится такой путь:
- определяем device object для нужного номера LPT. Можно просто разрешить Symbolic Links, или воспользоваться готовой информацией из документации на XP DDK - файл parallel.chm - "Parallel Device Interfaces, Internal Names, and Symbolic Links"
Вот в сторону DDK совсем не хотелось лезть.
Раз для "типовых" портов можно обойтись реестром, раз и на свою PCI-LPT я всё нужное глазами в реестре нашёл, значит где-то должно быть достаточно полное описание ключей реестра :-)

Самое смешное, что с моей точки зрения проблемы тоже не существет, только по другой причине. Потенциальные пользователи avreal, по идее, должны быть достаточно "образованы", чтобы найти на закладке "ресурсы" нужного порта его базовый адрес и вписать его куда надо.
Мне кажется, что на конкретном компьютере он меняется самовольно не так часто - у меня даже при некоторых изменениях конфигурации не менялся. В любом случае - по сравнению с уствновкой драйверов на что-то новое не так и много работы опять заглянуть на нужную страничку.
Тот же avrdude не заморачивается и под виндовс, по крайней мере судя по его документации, просто жёстко привязывает адреса к словам lpt1, lpt2, lpt3 никуда не заглядывая. Мой порт, естественно, не увидел. Я даже не поленился Pony скачать (avrdude-то идёт с WinAVR) - тоже все три дырочки "LPT" серые. На этом фоне -pE800 уже достижение :-)


Мда... Слишком старательно движок конфы сливает смежные посты в один. Хоть бы по размеру поста глянул, большие не сливал...
singlskv
Цитата(ReAl @ Feb 8 2008, 23:18) *
Тут почти всё как Вы сказали - разница только в том, что по смещениям 0x18 и 0x20 "что-то не то" (возможно, некие флаговые значения, говорящие, чо надо идти дальше - но по крайней мере есть куда копать), а реальных два диапазона - по смещениям 0x38,0x40; 0x48,0x50.
Ну тут хоть наличие порта видно.
Да, все правильно, есть такие порты с двумя диапазонами, для них
структура более длинная...
Я тут недавно софт переставлял и случайно стер DDK,
попробую найти DDK и найти эти структуры...
Цитата
А вот дома, с PCI-платой...
Всё. Портов просто нет. Что означает INITSTARTFAILED - не знаю, но в свойствах - "устройство работает нормально", ради проверки даже достал из-под стола Epson LQ100+ (кстати, кому-то нужен? отдам бесплатно, самовывоз) проинсталлировал его драйвер на LPT1 и напечатал пробную страницу.
А что у Вас сидит в Control Panel/Device Menager/Hardwar/LPT1 ?
Интересует закладка Details и параметер Device Instance Id, собственно там и сидит путь к
Вашему LPT.
Цитата
Кстати, в аналогичном HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Enum в наличии только один COM-порт, набортный COM1. А COM4 и COM5 от той же PCI-платы отсутствуют.
А живут они тут:
Child0000 и Child0001 - это COM-порты от неё.
Нда..., ключевое слово здесь видимо
"ParentIdPrefix"="6&19ad4653&0"
У Вас просто многофункциональный девайс...
ReAl
Цитата(singlskv @ Feb 8 2008, 22:40) *
А что у Вас сидит в Control Panel/Device Menager/Hardwar/LPT1 ?
Интересует закладка Details и параметер Device Instance Id, собственно там и сидит путь к
Вашему LPT.
Оно!
Там строка
Код
MF\PCI#VEN_9710&DEV_9835&SUBSYS_00121000&REV_01\5&c47b19f&0&08F0#Child0002

Т.е. мне надо как-то выковыривать из винды эту строку и приписывать её к
Код
HKLM\SYSTEM\CurrentControlSet\Enum


Цитата(singlskv @ Feb 8 2008, 22:40) *
Нда..., ключевое слово здесь видимо
"ParentIdPrefix"="6&19ad4653&0"
У Вас просто многофункциональный девайс...

Ну, на работе тот LPT, который нашёлся - тоже не "малофункциональный" - он ещё сидит в
Код
[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\8\ParallelController\0]
"Component Information"=hex:40,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,ff
"Identifier"="PARALLEL1"
"Configuration Data"=hex(9):\
  01,00,00,00, 00,00,00,00,  00,00,00,00, 02,00,00,00, \
  01,01,01,00, 78,03,00,00,  00,00,00,00, 03,00,00,00, \
  02,00,01,00, 07,00,00,00,  07,00,00,00, ff,ff,ff,ff
и у этого MultifunctionAdapter\8 там ещё куча всего, включая FDC и контроллер клавиатуры.
singlskv
Цитата(ReAl @ Feb 8 2008, 23:58) *
Оно!
Там строка
Код
MF\PCI#VEN_9710&DEV_9835&SUBSYS_00121000&REV_01\5&c47b19f&0&08F0#Child0002

Т.е. мне надо как-то выковыривать из винды эту строку и приписывать её к
Код
HKLM\SYSTEM\CurrentControlSet\Enum
Ну на крайний случай есть вариант с перебором всей ветки ...\Enum
на предмет наличия Device Parameters\PortName = LPTx
и последующем чтением LogConf\BootConfig
здесь оно главное, в BootConfig пишется адрес девайса действительный на момент загрузки...
Цитата
Ну, на работе тот LPT, который нашёлся - тоже не "малофункциональный" - он ещё сидит в
[code][HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\8\ParallelController\0]
да, там они тоже все сидят, только это не то что получилось на момент загрузки...
Это скорее всего то, что покажет Device Manager в случае загрузки в Safe mode.

вобщем надо еще думать... жаль что у меня нет таких PCI-LPT...

кстати, попробуйте найти Ваш адаптер вот так:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xxxxx\Enum
где xxxxx - это например MF(MultifunctionDevice) или что то в этом роде...
там и должно дальше быть:
'0' MF\PCI#VEN_9710&DEV_9835&SUBSYS_00121000&REV_01\5&c47b19f&0&08F0#Child0002
bodja74
Цитата(singlskv @ Feb 8 2008, 21:52) *
ReadFile как я понимаю используется в варианте с блокировкой, те
без использования OVERLAPPED ?
Если Вы готовы поэкспериментировать, можно попробовать ...


У меня получается есть ряд конечных пользовательских функций обьявленные как Public,а все декларации вынесены в отдельном модуле,код там не маленький smile.gif ,если если есть интерес могу все это скинуть,так как все эти маневры с кодом пересказать трудно.


ReAl
Цитата
Вы за них отвечаете или нет?
Я просто указал, что они не соответствуют действительности для тех портов, с которыми у меня "несуществующая проблема". Если так с Вами разговаривать нельзя - извините, не хотел обидеть.

У меня без проблем определяет все порты ,как встроенные так и на картах,поэтому говорил то ,что видел сам.
Если у вас все равно не определяет ,можно пробовать ,про который говорили -TVicLPT ,не на всех сайтах он платный biggrin.gif , у меня он "кушать" не просит.
singlskv
Цитата(bodja74 @ Feb 9 2008, 23:51) *
У меня получается есть ряд конечных пользовательских функций обьявленные как Public,а все декларации вынесены в отдельном модуле,код там не маленький smile.gif ,если если есть интерес могу все это скинуть,так как все эти маневры с кодом пересказать трудно.
Не, весь код не надо...
Покажите инициализацию COM и использование ReadFile +- пару строчек,
те что бы понятно было как оно должно работать.
а про OVERLAPPED, это такой флаг при открытии при котором функция не висит в ожидании ответа, а
через спец механизм оповещает о событиях.
bodja74
Цитата(singlskv @ Feb 10 2008, 01:41) *
Не, весь код не надо...
Покажите инициализацию COM и использование ReadFile +- пару строчек,
те что бы понятно было как оно должно работать.


Ок. Вот содержание функции инициализации CommOpen.
Код
'-------------------------------------------------------------------------------
' CommOpen - Opens/Initializes serial port.
'
'
' Parameters:
'   intPortID   - Port ID used when port was opened.
'   strPort     - COM port name. (COM1, COM2, COM3, COM4)
'   strSettings - Communication settings.
'                 Example: "baud=9600 parity=N data=8 stop=1"
'
' Returns:
'   Error Code  - 0 = No Error.
'
'-------------------------------------------------------------------------------
Public Function CommOpen(intPortID As Integer, strPort As String, _
    strSettings As String) As Long
    
Dim lngStatus       As Long
Dim udtCommTimeOuts As COMMTIMEOUTS

    On Error GoTo Routine_Error
    
    ' See if port already in use.
    If udtPorts(intPortID).blnPortOpen Then
        lngStatus = -1
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommOpen"
            .strErrorMessage = "Port in use."
        End With
        
        GoTo Routine_Exit
    End If

    ' Open serial port.
    udtPorts(intPortID).lngHandle = CreateFile(strPort, GENERIC_READ Or _
        GENERIC_WRITE, 0, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

    If udtPorts(intPortID).lngHandle = -1 Then
        lngStatus = SetCommError("CommOpen (CreateFile)")
        GoTo Routine_Exit
    End If

    udtPorts(intPortID).blnPortOpen = True

    ' Setup device buffers (1K each).
    lngStatus = SetupComm(udtPorts(intPortID).lngHandle, 1024, 1024)
    
    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (SetupComm)")
        GoTo Routine_Exit
    End If

    ' Purge buffers.
    lngStatus = PurgeComm(udtPorts(intPortID).lngHandle, PURGE_TXABORT Or _
        PURGE_RXABORT Or PURGE_TXCLEAR Or PURGE_RXCLEAR)

    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (PurgeComm)")
        GoTo Routine_Exit
    End If

    ' Set serial port timeouts.
    With udtCommTimeOuts
        .ReadIntervalTimeout = -1
        .ReadTotalTimeoutMultiplier = 0
        .ReadTotalTimeoutConstant = 1000
        .WriteTotalTimeoutMultiplier = 0
        .WriteTotalTimeoutMultiplier = 1000
    End With

    lngStatus = SetCommTimeouts(udtPorts(intPortID).lngHandle, udtCommTimeOuts)

    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (SetCommTimeouts)")
        GoTo Routine_Exit
    End If

    ' Get the current state (DCB).
    lngStatus = GetCommState(udtPorts(intPortID).lngHandle, _
        udtPorts(intPortID).udtDCB)

    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (GetCommState)")
        GoTo Routine_Exit
    End If

    ' Modify the DCB to reflect the desired settings.
    lngStatus = BuildCommDCB(strSettings, udtPorts(intPortID).udtDCB)

    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (BuildCommDCB)")
        GoTo Routine_Exit
    End If

    ' Set the new state.
    lngStatus = SetCommState(udtPorts(intPortID).lngHandle, _
        udtPorts(intPortID).udtDCB)

    If lngStatus = 0 Then
        lngStatus = SetCommError("CommOpen (SetCommState)")
        GoTo Routine_Exit
    End If

    lngStatus = 0

Routine_Exit:
    CommOpen = lngStatus
    Exit Function

Routine_Error:
    lngStatus = Err.Number
    With udtCommError
        .lngErrorCode = lngStatus
        .strFunction = "CommOpen"
        .strErrorMessage = Err.Description
    End With
    Resume Routine_Exit
End Function


Блиииииин... Наверное это оно twak.gif
Код
    ' Setup device buffers (1K each).
    lngStatus = SetupComm(udtPorts(intPortID).lngHandle, 1024, 1024)

Только сейчас заметил ,попробую поцепить все назад к проге ,скажу результат.
singlskv
Цитата(bodja74 @ Feb 10 2008, 18:26) *
Ок. Вот содержание функции инициализации CommOpen.
А ReadFile +- пару строк ?
bodja74
Цитата(singlskv @ Feb 10 2008, 20:03) *
А ReadFile +- пару строк ?


Вот ReadFile
Код
'-------------------------------------------------------------------------------
' CommRead - Read serial port input buffer.
'
' Parameters:
' intPortID - Port ID used when port was opened.
' strData - Data buffer.
' lngSize - Maximum number of bytes to be read.
'
' Returns:
' Error Code - 0 = No Error.
'-------------------------------------------------------------------------------
Public Function CommRead(intPortID As Integer, strData As String, _
lngSize As Long) As Long

Dim lngStatus As Long
Dim lngRdSize As Long, lngBytesRead As Long
Dim lngRdStatus As Long, strRdBuffer As String * 4096
Dim lngErrorFlags As Long, udtCommStat As COMSTAT

On Error GoTo Routine_Error

strData = ""
lngBytesRead = 0
DoEvents

' Clear any previous errors and get current status.
lngStatus = ClearCommError(udtPorts(intPortID).lngHandle, lngErrorFlags, _
udtCommStat)

If lngStatus = 0 Then
lngBytesRead = -1
lngStatus = SetCommError("CommRead (ClearCommError)")
GoTo Routine_Exit
End If

If udtCommStat.cbInQue > 0 Then
If udtCommStat.cbInQue > lngSize Then
lngRdSize = udtCommStat.cbInQue
Else
lngRdSize = lngSize
End If
Else
lngRdSize = 0
End If

If lngRdSize Then
lngRdStatus = ReadFile(udtPorts(intPortID).lngHandle, strRdBuffer, _
lngRdSize, lngBytesRead, udtCommOverlap)

If lngRdStatus = 0 Then
lngStatus = GetLastError
If lngStatus = ERROR_IO_PENDING Then
' Wait for read to complete.
' This function will timeout according to the
' COMMTIMEOUTS.ReadTotalTimeoutConstant variable.
' Every time it times out, check for port errors.

' Loop until operation is complete.
While GetOverlappedResult(udtPorts(intPortID).lngHandle, _
udtCommOverlap, lngBytesRead, True) = 0

lngStatus = GetLastError

If lngStatus <> ERROR_IO_INCOMPLETE Then
lngBytesRead = -1
lngStatus = SetCommErrorEx( _
"CommRead (GetOverlappedResult)", _
udtPorts(intPortID).lngHandle)
GoTo Routine_Exit
End If
Wend
Else
' Some other error occurred.
lngBytesRead = -1
lngStatus = SetCommErrorEx("CommRead (ReadFile)", _
udtPorts(intPortID).lngHandle)
GoTo Routine_Exit

End If
End If

strData = Left$(strRdBuffer, lngBytesRead)
End If

Routine_Exit:
CommRead = lngBytesRead
Exit Function

Routine_Error:
lngBytesRead = -1
lngStatus = Err.Number
With udtCommError
.lngErrorCode = lngStatus
.strFunction = "CommRead"
.strErrorMessage = Err.Description
End With
Resume Routine_Exit
End Function


Но это уже не актуально biggrin.gif
Все работает как швейцарские часы ,проблема действительно оказалась в иницилизации буферов.
beer.gif
gluckmaker
А удавалось ли кому-нибудь заставить AVReal работать через Oxford OX16PCI95x? У меня при попытке это сделать не обнаруживает байт-бластер. Адрес порта смотрю через диспетчер устройств, пробовал указывать все 3 видимых там диапазона. Завтра посмотрю, происходит ли вообще что-нибудь с портом...
gluckmaker
Посмотрел. Оказался дохлый сам байтбластер. Видимо, аврыл его определяет не только по наличию сопли между 7 и 10 ногой. После замены буфера как минимум прочитались фьюзы. Шить пока ничего не пробовал, но, по идее, должно работать. Карточку использую такую , из неё ещё можно путём некоторого рукоприкладства вывести 2 ком-порта.
Mik174
Такое ощущение, что нужно внести ясность, что собственно, нужно - шашечки или ехать?

Из личной практики:
Для настольного ПК купил плату PCI с двумя COM и одним LPT. Avreal с ней замечательно работает.
Проблема с адресом, на мой взгляд, высосана из пальца. Например, если я установлю дополнительную плату в комп, я на ее установку потрачу времени больше чем нужно, чтобы сунуться в свойства порта LPT и посмотреть его новый адрес. После этого открою командный файл и поменяю в нем одну цифру.
Ну так долго и сложно, прямо сил нет smile.gif

Если проблема в прошивке имеющихся плат, которые шились с помощью avreal, на машине у которой нет LPT, есть несколько вариантов:

1) идете, например, в Аргуссофт, покупаете там программатор AS-4 с подключением к USB и гальванической развязкой.
И работаете.
Лично сам, когда потребовалось выезжать на объект с ноутбуком где нет LPT, так и сделал.
Мне это обошлось в 1200 рублей - не огромные деньги.
Пока нареканий программатор не вызвал.

2) в продаже готовые переходники USB to COM, покупаете такой и берете любой программатор, который работает с СОМ-портом.

3) в инете легко можно найти как минимум несколько вариантов схем программаторов, которые можно изготовить самому. Ищете и собираете.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.