Страница 1 из 1

Прочитать Rs232

Добавлено: 29 Май 2008, 14:32
seawolf
Уважаемые коллеги!
Возникала необходимость промониторить com порт (Rs232). Почитав статьи была написана программка которая посылает строку в порт (далее я подсмотрел вынутой из интернета утилитой что данные сыпятся). Но мне никак не прочитать эти данные своей другой программкой. Поскольку порт в момент записи не открывается (думаю ошибка доступа). Когда порт закрылся, то все работает.
Использую стандартные функции API

MODULE('WinComm.dll')
CreateFile(LONG PtrToFilename,|
DWORD DesiredAccess,|
DWORD SharedMode,|
LONG SecurityAttributes,|
DWORD CreationDisposition,|
DWORD Flags,|
HANDLE TemplateFile),Handle,Raw,Pascal,Name('CreateFileA')

BuildCommDCB(LONG PtrToDeviceControlString,|
LONG PtrToDCB),BOOL,RAW,PASCAL,Name('BuildCommDCBA')

SetCommState(HANDLE PortHandle,LONG PtrToDCB),BOOL,RAW,PASCAL

SetCommTimeouts(HANDLE,ulong pCOMMTIMEOUTS),BOOL,PASCAL,RAW,proc

ReadFile(HANDLE HandleToFile, |
LONG PtrToBuffer, |
DWORD NumberOfBytesToRead, |
LONG PtrToNumberOfBytesRead, |
LONG PtrToOverlappedStructure),BOOL,Raw,Pascal,Proc

WriteFile(HANDLE HandleToFile,|
LONG PtrToBuffer,|
DWORD NumberOfBytesToWrite, |
LONG PtrToNumberOfBytesWritten, |
LONG PtrToOverlappedStructure),BOOL,Raw,Pascal

CloseHandle(HANDLE PortHandle),BOOL,PASCAL,RAW
END

Сначала открываем порт по CreateFile получаем Handle

2 параметр для DesiredAccess - GENERIC_READ + GENERIC_WRITE + GENERIC_EXECUTE
3 параметр для SharedMode - FILE_SHARE_WRITE + FILE_SHARE_READ

Затем по Handle пишем в порт через WriteFile и если в этот момент пытаться читать из порта по ReadFile имеем ошибку. Как только запись окончена (типа файл и порт закрылся) ReadFile читает из порта и пишет что нет данных. Как -же все-таки считать данные из порта?

Re: Прочитать Rs232

Добавлено: 19 Июнь 2008, 13:13
WadimZapara
...думаю ошибка доступа...
а что, GetLastError() - использовать не пробовал ?

Re: Прочитать Rs232

Добавлено: 19 Июнь 2008, 13:29
WadimZapara
а ещё есть ли уверенность, что:
1) HANDLE - это 4 байта, а не два ?
я описываю:
CreateFile(*CString lpFileName, ULONG dwDesiredAccess, ULONG dwShareMode, |
ULONG Addr_SecurityAttributes=0, ULONG dwCreationDisposition, ULONG dwFlagsAndAttributes, |
UnSigned hTemplateFile=0),UnSigned, PASCAL,RAW,Name('CreateFileA'),DLL(TRUE)
2) а что в CreationDisposition, а в FlagsAndAttributes, а в TemplateFile ?
я вызываю:
hFile = CreateFile(lpcFileName, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_BOTH, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL)