|
Как перевести AVREAL на работу с USB?, AVREAL работает через LPT, как заставить через USB? |
|
|
|
Feb 1 2008, 07:54
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-06-07
Пользователь №: 28 233

|
На фирме для прошивки AVR используется AVREAL. Порт LPT соединяется с платой простым шлейфом, все прибамбасы, обеспечивающие прошивку, собраны на плате. LPT явно уходит в небытие. Как с наименьшими потерями реализовать прошивку через USB, не меняя платы?
|
|
|
|
|
 |
Ответов
(1 - 49)
|
Feb 1 2008, 08:28
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(hd44780 @ Feb 1 2008, 10:24)  У меня есть контроллер 1LPT+2COM на чипе NetMos9835CV. COM порты работают, а LPT не могу понять, какой у него базовый адрес, непонятно. У меня, кажется, MoSys или что-то в этом духе, но это неважно. В виндовс Мой Компьютер/Свойства/Оборудование/Диспетчер устройств/...LPT - закладка "Ресурсы". Там указан диапазон адресов ввода-вывода. У меня плата села на E800.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 1 2008, 12:10
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата(hd44780 @ Feb 1 2008, 12:47)  Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка. Скорее всего используются API-функции. Тут уже говорили, что достаточно при вызове нужной API-функции в качестве одного из аргументов указать, например, COM38, или LPT9. И здесь уже не важно к каким адресам привязан данный порт, лишь бы диспетчер устройств их видел и распознавал как COM38, или LPT9.
|
|
|
|
|
Feb 3 2008, 07:07
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
На 245-ой я пробовал как только она у меня в руках появилась. Можно, но это будет тормозило такое, что "редкая птица" доживёт до середиы программирования. Она хороша только ПЛИС залить и перейти в нормальный режим или же кнтроллеры писать, но не верифицировать и не читать. Асинхронный бит-банг (а только он есть у 245/232) даёт возможность читать по биту за две транзакции по USB, не быстрее.
2232 уже лапочка, платка спаяна больше года назад (умолчим, нсколько больше), только я вот уже боюсь что-то кому-то обещать.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 4 2008, 07:50
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-06-07
Пользователь №: 28 233

|
Господа, правильно ли я понял, что через USB я не смогу заливать программы? Вариант с приобретением платы контроллера LPT непригоден, часто приходится работать на компах клиента, прямо на объекте, и вставлять что-либо в слоты позволит далеко не каждый.
|
|
|
|
|
Feb 4 2008, 07:58
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294

|
С помощью avreal через usb нельзя. Надеюсь только пока. Хотя есть переходники USB->LPT, но не знаю заработает ли такая связка.
А вообще USB программаторов много. От Prottoss'a например.
|
|
|
|
|
Feb 4 2008, 09:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата С USB и avrdude не все радужно, в ветке http://electronix.ru/forum/index.php?showtopic=42389 есть обсуждение Возможно, но человеку нужен программатор, а не джитаг, сам я пользовался связкой: AVR910USB с прошивкой от AVRDOPER(STK500) и AVRDUDE, Нареканий не было, использовалось это и в виндовс и в линукс.
--------------------
|
|
|
|
|
Feb 5 2008, 08:02
|
Участник

Группа: Свой
Сообщений: 40
Регистрация: 29-08-05
Из: новосибирск
Пользователь №: 8 054

|
Цитата(hd44780 @ Feb 1 2008, 12:47)  Да, адреса показывает, не вопрос, но, например, всем известный PonyProg вообще адрес не спрашивает, стоят 3 радиокнопки - LPT1 .. LPT3 и все. Как он определяет базовые адреса - загадка. в Ponyprog есть Help, в Help есть FAQ. Самый последний ответ. Удачи. Кстати Ponyprog недавно обновился.
|
|
|
|
|
Feb 5 2008, 20:19
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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. Универсального способа я не нашёл (плохо искал?) потому и забросил это дело.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 6 2008, 08:03
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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%), поэтому я просто не замечаю, где какой адрес.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 6 2008, 09:20
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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 взяться. Надеюсь
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 6 2008, 10:42
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(ReAl @ Feb 6 2008, 12:03)  Люди как раз просят задавать номер, а адрес чтобы искала программа сама. Все доступные для открывания порты как СОМ так и LPT на момент запуска программы в символических именах ,можно определить через API.Там несложно ,могу примерчик скинуть. Можно поискать и в Gogle типа "COM LPT API" даст кучу ссылок  А вот работать с ними через API глухой номер ,я пытался поработать с СОМ ,у меня зараза на больших скоростях пропускает байты при приеме,плюнул ,переполз опять на драйвер,а LPT нужет протокольный обмен ,тоесть отработка сигналов STROBE и ACK на порте,тупо дернуть ногой не удастся. ИМХО ,лучше сразу подыскивать нормальный драйвер и закладываться на него.
|
|
|
|
|
Feb 6 2008, 17:23
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
А зачем вам базовый адресс ? Я допустим по сей день не знаю какие у меня адресса  Обратиться можно по имени или по номеру. Вот например для АПИ. Код ' 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
|
|
|
|
|
Feb 6 2008, 20:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(bodja74 @ Feb 6 2008, 19:23)  А зачем вам базовый адресс ? А чтобы значение ножки BUSY узнать, прочитав регистр статуса, или там на ножку STROBE выдать "0", потом пощёлкать на данных, потом на STROBE выдать "1". Вот такие извращения. Цитата(bodja74 @ Feb 6 2008, 19:23)  Я допустим по сей день не знаю какие у меня адресса  Обратиться можно по имени или по номеру. Вот например для АПИ. Код ' 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  Винда видит (раз через свойства/оборудование/... и так далее для LPT1 на закладке "ресурсы" базовый адрес показывает), принтера на ней нет и не ставился. Не винда не видит, а применяемый в стандартных примерах код поиска базового адреса по реестру, я же писал уже. А вручную подбирать для имеющейся платы и потом нарываться на то, что на другом производителе может и не пойти - вломно как-то. Поэтому предпочитаю указывать вручную, как и у упоминавшегося выше чьего-то программатора для MSP430.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 7 2008, 17:30
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
ReAlЕсли брать по большому счету ,то у вас проблема ,которой не существует  Если ваш драйвер не поддерживает выражения типа : Код тыры-пыры_имя_драйвера.тыры-пыры_назначить_порт=1 или 2 или 3 а требует только базовый адресс ,то пошлите его лесом гулять,и подыщите нормальный. Не нужно будет извращаться с копаниями в реестре вообще. К примеру если для LPT нужно ,есть драйвер TVicPort ,ложится под любой язык ,начиная с Билдера кончая .NET . Сам определяет какие есть порты ,сколько их,какие у них базовые адресса,дергает любой ногой, есть даже дополнительные фичи - типа определить серийник винта или назначить лицензию на определенное количество дней . Можно и другой подыскать на свой вкус. Я с LPT редко работал ,поэтому коллекцию себе не собирал. ИМХО если чтото новое мутить ,то лучше на LPT и не закладываться,но это дело хозяйское  Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов. Если подкинете свой рабочий вариант ,с меня будет пиво и уважуха
|
|
|
|
|
Feb 7 2008, 18:00
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(bodja74 @ Feb 7 2008, 20:30)  Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов. Если подкинете свой рабочий вариант ,с меня будет пиво и уважуха  Пиво по интернету передавать умеете ? пользуетесь ли Вы таймаутами ком порта ? (в SetupComm) пользуетесь ли Вы функцией Sleep(x) ?
|
|
|
|
|
Feb 7 2008, 18:35
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Feb 7 2008, 22:00)  Пиво по интернету передавать умеете ?  Конечно Цитата пользуетесь ли Вы таймаутами ком порта ? (в SetupComm) Нет Цитата пользуетесь ли Вы функцией Sleep(x) ? Да ,в цикле 100мс ,если байтов нет ,выходим.
|
|
|
|
|
Feb 7 2008, 21:14
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(bodja74 @ Feb 7 2008, 19:30)  ReAlЕсли брать по большому счету ,то у вас проблема ,которой не существует  Очень рад это слышать. Причём похожая проблема как минимум у уже упоминавшегося в этом треде программатора для 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/avrealbug-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 и не закладываться,но это дело хозяйское  "Тут трактор нужен"... Вся тема посвящена использованию СТАРОГО, понятно, что лучше быть богатым и здоровым, чем бедным и больным. Цитата(bodja74 @ Feb 7 2008, 19:30)  Насчет СОМ ,функции CreateFile, ReadFile, SetupComm, WriteFile и т.д. у меня в коде они есть,я выдернул с инета уже четыре варианта и у всех одна и таже проблема с пропуском байтов. Я ничего из интернета не дёргал, MSDN читал. Там есть хороший пример - MTTTY (Multi-Threaded TTY). У меня никаких Sleep()-ов, отдельный поток спит до появления байтиков в порту. По осциллографу от стопа последнего байта входящего в PC пакета до старта выходящего ответа микросекунд двести было на атлоне-550MHz/W2000SP3. С тех пор с ком-портом практически не работал.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 7 2008, 21:19
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ReAl @ Feb 8 2008, 00:06)  Вы одним махом решили проблемы минимум двух программаторов. Постараюсь на днях подыскать себе в ноутбук чего-нибудь PCMCIA-йное PCI-USB. Появится стимул - думаю разберусь с базовым адресом безотносительно к драйверу, но не совсем безотносительно к железу  и доложусь... Собственно я уже писал, как собираюсь поступить (и поступаю под своей операционкой с PCI мультипортовыми RS232) - по PCI информации. Базовые адреса там, естественно, присутствуют. Этим: http://members.datafast.net.au/~dft0802/для начала можно посмотреть.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 8 2008, 01:18
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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 она другая
|
|
|
|
|
Feb 8 2008, 07:56
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Для определения базового адреса порта по его номеру в 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, в ближайшее время попробую, для самого тема актуальная
|
|
|
|
|
Feb 8 2008, 17:37
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Feb 7 2008, 22:46)  А какая длина пакета на приеме От 256 байт до 256к ,короче бут в перемешку с прогером  Цитата и сколько байт на прием передаете функции ReadFile ? От 64байт до 8К,по разному пробовал. Цитата И скорость порта какая ? 115200, на каждых 4К ,теряется от 20 до 200 байт,по разному, я тут думаю ,может буфер переполняется ,но вроде как в ReadFile больше нигде не указывается, ReAlДавайте не будем нашу дискуссию переводить в полемику.Хорошо? Я догадывался ,что при желании вы этот драйвер раскритикуете от и до  ,поэтому предложил его в качестве примера ,не запрещая при этом найти себе более подходящий.
|
|
|
|
|
Feb 8 2008, 17:52
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(bodja74 @ Feb 8 2008, 20:37)  От 256 байт до 256к ,короче бут в перемешку с прогером  От 64байт до 8К,по разному пробовал. 115200, на каждых 4К ,теряется от 20 до 200 байт,по разному, я тут думаю ,может буфер переполняется ,но вроде как в ReadFile больше нигде не указывается,  ReadFile как я понимаю используется в варианте с блокировкой, те без использования OVERLAPPED ? Судя по Вашему ТТХ, у Вас происходит переполнение буфера FIFO на приеме, это связанно с тем что если ReadFile не смог сразу считать все запрошенные байты он фактически выполняет команду Sleep(0), те просто передает управление следуещему процессу, а у Windows такт операционки достаточно большой... Если Вы готовы поэкспериментировать, можно попробовать ...
|
|
|
|
|
Feb 8 2008, 20:18
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(bodja74 @ Feb 8 2008, 19:37)  ReAlДавайте не будем нашу дискуссию переводить в полемику.Хорошо? Я догадывался ,что при желании вы этот драйвер раскритикуете от и до  ,поэтому предложил его в качестве примера ,не запрещая при этом найти себе более подходящий. А давайте сначала Вы в качестве примера будете приводить драйвер, который действительно делает то, что Вы говорите о нём. А то "дискуссия" выглядит так Цитата - Винт тут у меня с очень хитрым шлицом, пробовал выточить отвёртку по нескольким разным чертежам - не лезет! Могу, конечно, прикинуть визуально и что-то слепить, но какой смысл, если попадётся другой, в который не полезет. Нужна информация по спецвинтам. - Надо закрутить винт? Возьмите любой инструмент, которым нормальные люди закручивают винты, например, электроотвёртку с набором из плоской и крестовой вставок, сама лезет в любой винт, сама закручивает! Ну или что-то другое по вкусу, я вообще мало винтов закручивал, поэтому инструментов много не собирал. - Дык не лезут из этого набора в шлиц не массового винта! - Не превращайте дискуссию в полемику, возьмите любой другой инструмент, я не запрещал искать по вкусу. Ваши слова: Цитата(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 уже достижение :-) Мда... Слишком старательно движок конфы сливает смежные посты в один. Хоть бы по размеру поста глянул, большие не сливал...
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 8 2008, 20:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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" У Вас просто многофункциональный девайс...
|
|
|
|
|
Feb 8 2008, 20:58
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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 и контроллер клавиатуры.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 8 2008, 22:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(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
|
|
|
|
|
Feb 9 2008, 20:51
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Feb 8 2008, 21:52)  ReadFile как я понимаю используется в варианте с блокировкой, те без использования OVERLAPPED ? Если Вы готовы поэкспериментировать, можно попробовать ... У меня получается есть ряд конечных пользовательских функций обьявленные как Public,а все декларации вынесены в отдельном модуле,код там не маленький  ,если если есть интерес могу все это скинуть,так как все эти маневры с кодом пересказать трудно. ReAl Цитата Вы за них отвечаете или нет? Я просто указал, что они не соответствуют действительности для тех портов, с которыми у меня "несуществующая проблема". Если так с Вами разговаривать нельзя - извините, не хотел обидеть. У меня без проблем определяет все порты ,как встроенные так и на картах,поэтому говорил то ,что видел сам. Если у вас все равно не определяет ,можно пробовать ,про который говорили -TVicLPT ,не на всех сайтах он платный  , у меня он "кушать" не просит.
|
|
|
|
|
Feb 9 2008, 21:41
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(bodja74 @ Feb 9 2008, 23:51)  У меня получается есть ряд конечных пользовательских функций обьявленные как Public,а все декларации вынесены в отдельном модуле,код там не маленький  ,если если есть интерес могу все это скинуть,так как все эти маневры с кодом пересказать трудно. Не, весь код не надо... Покажите инициализацию COM и использование ReadFile +- пару строчек, те что бы понятно было как оно должно работать. а про OVERLAPPED, это такой флаг при открытии при котором функция не висит в ожидании ответа, а через спец механизм оповещает о событиях.
|
|
|
|
|
Feb 10 2008, 15:26
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(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 Блиииииин... Наверное это оно Код ' Setup device buffers (1K each). lngStatus = SetupComm(udtPorts(intPortID).lngHandle, 1024, 1024) Только сейчас заметил ,попробую поцепить все назад к проге ,скажу результат.
|
|
|
|
|
Feb 10 2008, 17:53
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(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 Но это уже не актуально Все работает как швейцарские часы ,проблема действительно оказалась в иницилизации буферов.
|
|
|
|
|
Mar 30 2008, 19:51
|
Местный
  
Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139

|
Такое ощущение, что нужно внести ясность, что собственно, нужно - шашечки или ехать? Из личной практики: Для настольного ПК купил плату PCI с двумя COM и одним LPT. Avreal с ней замечательно работает. Проблема с адресом, на мой взгляд, высосана из пальца. Например, если я установлю дополнительную плату в комп, я на ее установку потрачу времени больше чем нужно, чтобы сунуться в свойства порта LPT и посмотреть его новый адрес. После этого открою командный файл и поменяю в нем одну цифру. Ну так долго и сложно, прямо сил нет  Если проблема в прошивке имеющихся плат, которые шились с помощью avreal, на машине у которой нет LPT, есть несколько вариантов: 1) идете, например, в Аргуссофт, покупаете там программатор AS-4 с подключением к USB и гальванической развязкой. И работаете. Лично сам, когда потребовалось выезжать на объект с ноутбуком где нет LPT, так и сделал. Мне это обошлось в 1200 рублей - не огромные деньги. Пока нареканий программатор не вызвал. 2) в продаже готовые переходники USB to COM, покупаете такой и берете любой программатор, который работает с СОМ-портом. 3) в инете легко можно найти как минимум несколько вариантов схем программаторов, которые можно изготовить самому. Ищете и собираете.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|