Моя программуля что-то считывает с COM1, но неправильно считывает! Другая не моя программуля считывает правильно. Код функции ниже. Функция вызывается при нажатии на кнопку в окне. Если нажать другую кнопку, то поток закроет COM1 и файл, куда кидаются данные. Вообще в файле data.txt полная фигня. Данные идут от устройства. Вначале устройство посылает строку: "Version 5.0", а потом данные. Не моя программуля эту строку получает, а моя программуля эту строку получить не может - вместо неё какая-то ерунда - её вообще нет! В чём ошибка??? Код (Text): .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
Чёт я не понимаю в чём проблемма? код смотреть в лом, но ведь всё тревиально: Код (Text): void *hPort; unsigned long dwBufferLen; char pBuffer[256]; hPort = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); //... ReadFile(hPort,pBuffer,sizeof(pBuffer),&dwBufferLen,0); //... WriteFile(hPort,pBuffer,sizeof(pBuffer),&dwBufferLen,0); //... CloseHandle(hPort);
послушай несвою программу с помощью portmon http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx многое может стать на свои места
Вот так получилось: Код (Text): portfunc PROTO :DWORD,:DWORD portfunc proc open:DWORD,hWnd:DWORD local _dcb:DCB local dwWait:DWORD mov handle_memo,eax comment @ .data myport db "//./COM1",0h .code @ 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,FALSE,FALSE,0h mov hEvent,eax mov lpOverlapped.hEvent,eax invoke SetCommMask,hCom,EV_RXCHAR mov edx,1h mov dFlag,edx mov nNumberOfBytesToWrite,1h jmp over again: mov edx,dword ptr nNumberOfBytesToWrite invoke ReadFile,hCom,offset lpBuffer2,edx,offset lpNumberOfBytesWritten,offset lpOverlapped invoke WaitForSingleObject,hEvent,INFINITE .if eax==WAIT_OBJECT_0 invoke GetOverlappedResult,hCom,offset lpOverlapped,offset lpNumberOfBytesWritten,FALSE mov eax,lpNumberOfBytesWritten .if eax==0h mov eax,dFlag .if eax==0h jmp exit_thread .endif jmp again .endif .endif 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 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,FILE_SHARE_READ,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 Кстати, что-то этот PortMon не понятный какой-то... Так и не разобрался что с ним делать...