· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› ACPI и COM Порты

Посл.отвђт Сообщенiе


Дата: Янв 23, 2004 10:05:54

Добро утро всем.
Написал программу, которая работает с уст-ом через COM.
Использовал GiveIO. В NT системах при чтении байта из порта, он всё время равен FF. Я поискал здесь на форуме, нашёл, что ACPI отключает ?Микросхему? управления ком портами. То есть хочеш читать из портов в NT => отключи в биосе ACPI. А с включенным ACPI решения не нашёл.
Вопрос остаётся открытым: КАК ЧИТАТЬ В NT СИСТЕМАХ ИЗ COM ПОРТА НА ПРЯМУЮ (Через порт 3F8) ПРИ ВКЛЮЧЕННОМ ACPI?

Может надо открыть порт в своей проге с помощью CreateFile, тогда включится питание микросхемы COM портов, а дальше читать/писать на прямую (Через порт 3F8)?
Или питание не включится при CreateFile?
Тогда вопрос : Как читьть/писать в COM вообще в NT системах с помощью API, если питание микросхемы COM отключено?
Или оно будет включатся при ReadFile, и сразуже отключатся?
Щас это устройство с компом у меня улетит в окно, уже всё перепробовал, месяц целый не могу разобратся. Буде очень признателен за любае ответы/рассуждения.


Дата: Янв 23, 2004 16:57:14

в общем могу сказать что я писал под W2k связь через COM на API всё просто отлично работает... и даже не надо в порты лазить... делал через CreateFile... CreateEvent (OVERLAPPED) . в общем первый тестовый вариант писал на делфе, щас вот написал dll на MASM32 в Chrome (первое боевое крещение).
в общем если интерес есть пиши.a_shef@list.ru a_shef@tut.by


Дата: Янв 26, 2004 09:24:27

API не подходит, так как прога под DOS изначально была, я её переделал под Винду. Техн. док-ции к утрой-у с которым она работает нет никакой, самому весь код под API переписывать, можно конечно, но добавятся новые глюки.
Да и к томуже уже несколько раз пробовал, под API переписывать, Всё равно потом возвращался к портам.

Ну так если открыть порт с помощью CreateFile, питание включится, и можно будет читать/писать через порты ?


Дата: Янв 26, 2004 16:32:09

CromaX
конечно можно будет писать - с помощью WriteFile. какая разница, КАК именно писать - ведь логика-то не менятся.


Дата: Янв 26, 2004 17:13:43 · Поправил: CromaX

Да. Но CreateFile я хочу использовать чтобы включить питание микросхемы COM порта.
Я и спрашиваю, как включить питание Микросхемы COM порта.
ЭТО ОСНОВНАЯ ЗАДАЧА. может с помощью CreateFile или ёще как?


Дата: Янв 26, 2004 18:26:39

INT 14


Дата: Янв 29, 2004 09:29:31

Что INT14??? Если я буду использовать Int14 вместо 3f8/2f8 то питание включится?
Как из виндов его вызвать.
Какая функция Int 14?


Дата: Янв 30, 2004 14:08:28

не совсем я понимаю про какое питание речь но это стоит глянуть. честно говоря не совсем я долго над этим думал, так что извиняйте....

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

.data
COM1 db 'COM1',0
COM2 db 'COM2',0
RSOpen BOOL FALSE

.data?
ccHandle HANDLE ?
ccDCB DCB <>
ccOverlap OVERLAPPED <>
lpRSName dd ?
ccRealRW dd ?

.code
DLLEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserver1:DWORD ;DLL ENDTRY FUNCTION
mov eax,TRUE
ret
DLLEntry endp

SetRSConfig proc BaudRate:DWORD ;bool
invoke GetCommState,ccHandle,addr ccDCB
.if eax==TRUE
mov eax,BaudRate
mov ccDCB.BaudRate,eax
mov ccDCB.ByteSize,8
mov ccDCB.StopBits,0
invoke SetCommState,ccHandle,addr ccDCB
.else
mov eax,FALSE
.endif
ret
SetRSConfig endp

CreateOVPT proc ;bool
mov ccOverlap.Internal,0
mov ccOverlap.InternalHigh,0
mov ccOverlap.loffset,0
mov ccOverlap.OffsetHigh,0
mov ccOverlap.hEvent,0
invoke CreateEvent,NULL,TRUE,FALSE,NULL
mov ccOverlap.hEvent,eax
invoke GetLastError
.if eax==0
mov eax,TRUE
.else
mov eax,FALSE
.endif
ret
CreateOVPT endp

DestroyOVPT proc ;bool
invoke CloseHandle,ccOverlap.hEvent
ret
DestroyOVPT endp

;***************************
;***** DLL EXPORT PART *****
;***************************
OpenRS232 proc PortNum:BYTE, BaudRate:DWORD ;bool
mov eax,FALSE
cmp RSOpen,TRUE
jz _OPSExit
cmp PortNum,1
jnz _Port2
mov lpRSName,offset COM1
jmp _CreateFile
_Port2:
cmp PortNum,2
jnz _OPSExit
mov lpRSName,offset COM2
_CreateFile:
invoke CreateFile,lpRSName,GENERIC_READ or GENERIC_WRITE,0,NULL,\
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0
.if eax!=INVALID_HANDLE_VALUE
mov ccHandle,eax
invoke SetRSConfig,BaudRate
.if eax==TRUE
mov RSOpen,TRUE
.else
invoke CloseHandle,ccHandle
mov eax,FALSE
.endif
.else
mov eax,FALSE
.endif
_OPSExit:
ret
OpenRS232 endp

CloseRS232 proc ;bool
mov eax,FALSE
cmp RSOpen,TRUE
jnz _NoOpen
invoke CloseHandle,ccHandle
mov eax,TRUE
mov RSOpen,FALSE
_NoOpen:
ret
CloseRS232 endp

WriteToRS proc AddrBuffer:LPCVOID,BuffSize:DWORD,TimeOut:DWORD ;count of write byte -> eax
mov ccRealRW,0
cmp RSOpen,TRUE
jnz _NoOpen
;---- work part ----
invoke CreateOVPT
.if eax==TRUE
invoke WriteFile,ccHandle,AddrBuffer,BuffSize,addr ccRealRW,addr ccOverlap
.if eax!=TRUE
invoke GetLastError
.if eax==ERROR_IO_PENDING
invoke WaitForSingleObject,ccOverlap.hEvent,TimeOut
.if eax==WAIT_OBJECT_0
invoke GetOverlappedResult,ccHandle,addr ccOverlap,addr ccRealRW,TRUE
.endif
.endif
.endif
invoke DestroyOVPT
.endif
;-------------------
_NoOpen:
mov eax,ccRealRW
ret
WriteToRS endp

ReadFromRS proc AddrBuffer:LPCVOID,BuffSize:DWORD,TimeOut:DWORD ;count of read byte -> eax
mov ccRealRW,0
cmp RSOpen,TRUE
jnz _NoOpen
;---- work part ----
invoke CreateOVPT
.if eax==TRUE
invoke ReadFile,ccHandle,AddrBuffer,BuffSize,addr ccRealRW,addr ccOverlap
.if eax!=TRUE
invoke GetLastError
.if eax==ERROR_IO_PENDING
invoke WaitForSingleObject,ccOverlap.hEvent,TimeOut
.if eax==WAIT_OBJECT_0
invoke GetOverlappedResult,ccHandle,addr ccOverlap,addr ccRealRW,TRUE
.endif
.endif
.endif
invoke DestroyOVPT
.endif
;-------------------
_NoOpen:
mov eax,ccRealRW
ret
ReadFromRS endp
end DLLEntry


Дата: Янв 30, 2004 14:11:46

не совсем я понимаю про какое питание речь но это стоит глянуть. честно говоря не совсем я долго над этим думал, так что извиняйте....

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

.data
COM1 db 'COM1',0
COM2 db 'COM2',0
RSOpen BOOL FALSE

.data?
ccHandle HANDLE ?
ccDCB DCB <>
ccOverlap OVERLAPPED <>
lpRSName dd ?
ccRealRW dd ?

.code
DLLEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserver1:DWORD ;DLL ENDTRY FUNCTION
mov eax,TRUE
ret
DLLEntry endp

SetRSConfig proc BaudRate:DWORD ;bool
invoke GetCommState,ccHandle,addr ccDCB
.if eax==TRUE
mov eax,BaudRate
mov ccDCB.BaudRate,eax
mov ccDCB.ByteSize,8
mov ccDCB.StopBits,0
invoke SetCommState,ccHandle,addr ccDCB
.else
mov eax,FALSE
.endif
ret
SetRSConfig endp

CreateOVPT proc ;bool
mov ccOverlap.Internal,0
mov ccOverlap.InternalHigh,0
mov ccOverlap.loffset,0
mov ccOverlap.OffsetHigh,0
mov ccOverlap.hEvent,0
invoke CreateEvent,NULL,TRUE,FALSE,NULL
mov ccOverlap.hEvent,eax
invoke GetLastError
.if eax==0
mov eax,TRUE
.else
mov eax,FALSE
.endif
ret
CreateOVPT endp

DestroyOVPT proc ;bool
invoke CloseHandle,ccOverlap.hEvent
ret
DestroyOVPT endp

;***************************
;***** DLL EXPORT PART *****
;***************************
OpenRS232 proc PortNum:BYTE, BaudRate:DWORD ;bool
mov eax,FALSE
cmp RSOpen,TRUE
jz _OPSExit
cmp PortNum,1
jnz _Port2
mov lpRSName,offset COM1
jmp _CreateFile
_Port2:
cmp PortNum,2
jnz _OPSExit
mov lpRSName,offset COM2
_CreateFile:
invoke CreateFile,lpRSName,GENERIC_READ or GENERIC_WRITE,0,NULL,\
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0
.if eax!=INVALID_HANDLE_VALUE
mov ccHandle,eax
invoke SetRSConfig,BaudRate
.if eax==TRUE
mov RSOpen,TRUE
.else
invoke CloseHandle,ccHandle
mov eax,FALSE
.endif
.else
mov eax,FALSE
.endif
_OPSExit:
ret
OpenRS232 endp

CloseRS232 proc ;bool
mov eax,FALSE
cmp RSOpen,TRUE
jnz _NoOpen
invoke CloseHandle,ccHandle
mov eax,TRUE
mov RSOpen,FALSE
_NoOpen:
ret
CloseRS232 endp

WriteToRS proc AddrBuffer:LPCVOID,BuffSize:DWORD,TimeOut:DWORD ;count of write byte -> eax
mov ccRealRW,0
cmp RSOpen,TRUE
jnz _NoOpen
;---- work part ----
invoke CreateOVPT
.if eax==TRUE
invoke WriteFile,ccHandle,AddrBuffer,BuffSize,addr ccRealRW,addr ccOverlap
.if eax!=TRUE
invoke GetLastError
.if eax==ERROR_IO_PENDING
invoke WaitForSingleObject,ccOverlap.hEvent,TimeOut
.if eax==WAIT_OBJECT_0
invoke GetOverlappedResult,ccHandle,addr ccOverlap,addr ccRealRW,TRUE
.endif
.endif
.endif
invoke DestroyOVPT
.endif
;-------------------
_NoOpen:
mov eax,ccRealRW
ret
WriteToRS endp

ReadFromRS proc AddrBuffer:LPCVOID,BuffSize:DWORD,TimeOut:DWORD ;count of read byte -> eax
mov ccRealRW,0
cmp RSOpen,TRUE
jnz _NoOpen
;---- work part ----
invoke CreateOVPT
.if eax==TRUE
invoke ReadFile,ccHandle,AddrBuffer,BuffSize,addr ccRealRW,addr ccOverlap
.if eax!=TRUE
invoke GetLastError
.if eax==ERROR_IO_PENDING
invoke WaitForSingleObject,ccOverlap.hEvent,TimeOut
.if eax==WAIT_OBJECT_0
invoke GetOverlappedResult,ccHandle,addr ccOverlap,addr ccRealRW,TRUE
.endif
.endif
.endif
invoke DestroyOVPT
.endif
;-------------------
_NoOpen:
mov eax,ccRealRW
ret
ReadFromRS endp
end DLLEntry


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070