.data
lpBuffer db "B",0h
lpBuffer2 db 0h,0h
handle_memo dd ?
dFlag dd ?
hCom dd ?
hFile_data dd ?
hEvent dd ?
nNumberOfBytesToWrite dd ?
lpNumberOfBytesWritten dd ?
lpOverlapped OVERLAPPED <?>
lpThreadId dd ?
lpThreadHandle dd ?
dExitCode dd ?
.code
portfunc PROTO :DWORD,:DWORD
portfunc proc open:DWORD,hWnd:DWORD
local _dcb:DCB
local dwWait:DWORD
mov handle_memo,eax
invoke CreateFile,offset checked_port,GENERIC_READ or GENERIC_WRITE,0h,0h,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0h
mov hCom,eax
invoke GetCommState,hCom,addr _dcb
push esi
lea esi,_dcb
assume esi:ptr DCB
mov [esi].BaudRate,CBR_19200
mov [esi].ByteSize,8h
mov [esi].Parity,NOPARITY
mov [esi].StopBits,ONESTOPBIT
assume esi:nothing
pop esi
invoke SetCommState,hCom, addr _dcb
invoke CreateEvent,0h,TRUE,FALSE,0h
mov hEvent,eax
mov lpOverlapped.hEvent,eax
comment @
TIMEOUT equ 100h
invoke WaitForSingleObject,hEvent,TIMEOUT
.if eax==WAIT_TIMEOUT
;invoke Sleep,100h
invoke Beep,100h,100h
.endif
@
mov edx,1h
mov dFlag,edx
mov nNumberOfBytesToWrite,1h
;mov lpBuffer2,0h
jmp over
again:
mov edx,dword ptr nNumberOfBytesToWrite
invoke ReadFile,hCom,offset lpBuffer2,edx,offset lpNumberOfBytesWritten,offset lpOverlapped
;invoke Sleep,1h
invoke WriteFile,hFile_data,offset lpBuffer2,nNumberOfBytesToWrite,offset lpNumberOfBytesWritten,0h
invoke SendMessage,handle_memo,WM_SETTEXT,1h,offset lpBuffer2
mov eax,dFlag
.if eax!=0h
jmp short again
.endif
exit_thread:
invoke CloseHandle,hEvent
invoke CloseHandle,hCom
invoke CloseHandle,hFile_data
invoke GetExitCodeThread,lpThreadHandle,offset dExitCode
.if eax!=0h
invoke MessageBox,0h,$CTA0("Поток завершается"),$CTA0("Поток завершается"),MB_OK
.else
invoke MessageBox,0h,$CTA0("Error"),$CTA0("Error"),MB_OK
.endif
invoke ExitThread,dExitCode
over:
invoke CreateFile,$CTA0("data.txt"),GENERIC_READ or GENERIC_WRITE,0h,0h,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
mov hFile_data,eax
invoke CreateThread,0h,0h,offset again,0h,0h,lpThreadId
mov lpThreadHandle,eax
ret
portfunc endp
Считать данные с COM1
Код функции ниже. Функция вызывается при нажатии на кнопку в окне.
Если нажать другую кнопку, то поток закроет COM1 и файл, куда кидаются данные.
Вообще в файле data.txt полная фигня.
Данные идут от устройства.
Вначале устройство посылает строку: "Version 5.0", а потом данные.
Не моя программуля эту строку получает, а моя программуля эту строку получить не может - вместо неё какая-то ерунда - её вообще нет!
В чём ошибка???
Код:
проверим.