Как оказалось мне для компиляции текста программы в файле .inc нет никакой необходимости в определении процедур, просто удалил их оттуда.Работает. А так-же удалил определение IOCTL-тоже работает. Похоже они нужны когда используешь голый чип, для его программирования, а он у нас уже запрограммирован (здорово). Единственная проблемка была при написании прототипов, но выручил WordPad, Открыл ним файл библиотеки и выписал оттуда всё что нужно типа: CH341OpenDevice@4 в отдельный файл EXTERN CH341OpenDevice@4:NEAR, а под ним: CH341OpenDevice PROTO DWORD то есть, если в Windows все данные четырёхбайтные то разумно @4 разделить на 4 и получаем количество DWORD. Следовательно: EXTERN CH341WriteRead@28:NEAR Код (ASM): CH341WriteRead PROTO :DWORD, :DWORD,:DWORD, :DWORD,:DWORD, :DWORD,:DWORD Как-то так. А поиски программы которая сама пишет инклуды, у меня по крайней мере, не увенчались успехом. Единственное что удалось нарыть это dllexp.exe --- Сообщение объединено, 27 авг 2023 --- И очень жалею об огромном количестве времени потраченном на изучение написания кода драйверов и изучение протоколов USB. Как оказывается в этом нет никакой необходимости в простейшем виде.
Теперь кажется всё-разобрались. Остался последний вопрос и возможно слегка не по теме. Решил использовать такой финт для просмотра, что принимает ПК: Код (ASM): .data InBufDATASize db ? InBufDATA db ? .code mov al, 1 mov InBufDATASize, al invoke CH341EppReadData, iIndex, ADDR InBufDATA, ADDR InBufDATASize mov eax,OFFSET InBufDATA ; изменяем название окна программы на принятое число movzx edx,ofn.nFileOffset add eax,edx invoke SetWindowText,hWnd,eax ; показываем новое название, но почему-то не показывается Хотя : Код (ASM): mov eax, 7 mov iBuffer, eax mov al, 1 mov ioLength, al invoke CH341EppWriteData, iIndex, ADDR iBuffer, ADDR ioLength Передаёт чётко. Приходит цифра 7 в бинаре, а при приёме хостом пусто. Где косяк?
Благодаря Вашему молчанию нашёл другой способ проверить, что принял ПК. Это принять от МК байт и отправить его обратно. Полученное отобразить на счётчике импульсов. Спасибо всем.
Devasya, у вас прям один способ лучше другого. нельзя что-ли нормально вывести результат на консоль или в форточку? Это во-первых.. а во-вторых - вы используете вызов функций по соглашению _stdcall, где аргументы передаются через стек (хотя в исходники пишите их в одну строчку). Стек в системе должен быть всегда выровнен, а у вас аргумент "InBufDATASize" размером в байт, хотя в х32 все аргументы должны быть 4-байта. Не знаю как masm, но fasm вообще-бы не скомпилировал такой исходник, ругаясь на размер операнда. Короче вам нужно задать всем переменным размер "dd", и под буфер резервировать не байт, а 1 Кб, как указывается в инклуде, т.е. "InBufDATA rb 1024".
Marylin, на счёт способов это кому какой доступнее. А в одну строчку потому как использую invoke. Разница в размерах из-за объёма информации, обработка идёт не буферная, а побайтная для точности передачи. Скорость ниже но какчество лучше. Я разобрался, в заголовочном файле всё написано для программирования самого чипа, по этому убрал из своих инклудов всё лишнее оставив только сами функции и их прототипы потому, что в DLL драйвера всё это уже имеется. Возвращаясь к способу проверки, то меня устроил бы ответ по первому способу. Думаю, что, нужна конвертация?
Вычисленный CH341_MAX_NUMBER ,а точнее ноль. Код (ASM): .else mov eax, CH341_MAX_NUMBER dec eax cmp eax, -1 jle metka2 ; сообщаем об отсутствии mov CH341_MAX_NUMBER, eax jnl metka1 ; возвращаемся
Константа MAX_NUMBER прописана в хидере и равна 16 - это макс.возможное значение "iIndex", а реальное вы должны посмотреть в диспетчере устройств Windows. Когда система обнаружит ваше устройство CH341, то выделит ему порт USB, а номер этого порта вы должны передать программе как "iIndex". Код (Text): mCH341_MAX_NUMBER = 16 ;// потолок iIndex mMAX_BUFFER_LENGTH = 4096 ;// макс размер буфера mDEFAULT_BUFFER_LEN = 1024 ;// размер буфера в дефолте вы можете вызывать функцию как угодно, но ассемблер переведёт ваш текст на язык процессора "push -> call". поэтому я и говорю, что размер "push" (а это аргумент функции) должен быть строго 4-байта. вот как это выглядит в отладчике (см.последний столбец):
Чтобы подтвердить Ваше высказывание изменил eax на ax и dd на dw. Скомпилировалось, но вызов устройства не прошёл указывая на его отсутствие согласно программы. Но вот со всеми остальными аргументами всё норм, размер байт ведь в хидере указан максимальный размер, а мы уже говорим точно, главное не превышать также? Как назвать аргумент решает программист, для компилятора важно содержание это я уже понял год назад, ну и конечно же синтаксис- это как за-кон. И в общем то не так всё грустно. --- Сообщение объединено, 3 сен 2023 --- Посмотрите у себя на отладчике пожалуйста. --- Сообщение объединено, 3 сен 2023 --- Филе .EXE не хочет загружать --- Сообщение объединено, 3 сен 2023 --- В заголовочном файле есть ещё такие строчки: #define mCH341_PACKET_LENGTH 32 // Длина пакетов данных, поддерживаемых CH341 #define mCH341_PKT_LEN_SHORT 8 // Длина коротких пакетов поддерживаемых CH341
Devasya, вы можете ответить на простой вопрос: "Под каким номером в диспетчере у вас определяется девайс CH341" ??? Нужно смотреть или в разделе COM или USB. Например у меня там пусто, т.к. нет устройства, иначе появился-бы ещё один COM, с номером в диапазоне от 3 до "mCH341_MAX_NUMBER=16".
Устройство по типу. Interface USB-EPP/I2C...CH341A Port_#0001/Hub_#0004 драйвер CH341WDM.SYS (Рекомендую потому как даже программаторы на них собраны.)
Жаль. Хотя в общем , по подключению и связи посредством этой платы с внешним устройством мне всё понятно. А в китайский документ ch341a-datasheet_code , к языкам использования можно дописать Assembler.