|
|
| Посл.отвђт | Сообщен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 |