Считать данные с COM1

Тема в разделе "WASM.WIN32", создана пользователем Meatcoins, 29 дек 2007.

  1. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Моя программуля что-то считывает с COM1, но неправильно считывает! Другая не моя программуля считывает правильно.
    Код функции ниже. Функция вызывается при нажатии на кнопку в окне.
    Если нажать другую кнопку, то поток закроет COM1 и файл, куда кидаются данные.
    Вообще в файле data.txt полная фигня.
    Данные идут от устройства.
    Вначале устройство посылает строку: "Version 5.0", а потом данные.
    Не моя программуля эту строку получает, а моя программуля эту строку получить не может - вместо неё какая-то ерунда - её вообще нет!
    В чём ошибка???
    Код (Text):
    1. .data
    2. lpBuffer db "B",0h
    3. lpBuffer2 db 0h,0h
    4. handle_memo dd ?
    5. dFlag dd ?
    6. hCom dd ?
    7. hFile_data dd ?
    8. hEvent dd ?
    9. nNumberOfBytesToWrite dd ?
    10. lpNumberOfBytesWritten dd ?
    11. lpOverlapped OVERLAPPED <?>
    12. lpThreadId dd ?
    13. lpThreadHandle dd ?
    14. dExitCode dd ?
    15. .code
    16.  
    17. portfunc PROTO :DWORD,:DWORD
    18.  
    19. portfunc proc open:DWORD,hWnd:DWORD
    20. local _dcb:DCB
    21. local dwWait:DWORD
    22.  
    23. mov handle_memo,eax
    24.  
    25. invoke CreateFile,offset checked_port,GENERIC_READ or GENERIC_WRITE,0h,0h,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0h
    26. mov hCom,eax
    27. invoke GetCommState,hCom,addr _dcb
    28.  
    29. push esi
    30. lea esi,_dcb
    31. assume esi:ptr DCB
    32. mov [esi].BaudRate,CBR_19200
    33. mov [esi].ByteSize,8h
    34. mov [esi].Parity,NOPARITY
    35. mov [esi].StopBits,ONESTOPBIT
    36. assume esi:nothing
    37. pop esi
    38. invoke SetCommState,hCom, addr _dcb
    39.  
    40.  
    41. invoke CreateEvent,0h,TRUE,FALSE,0h
    42. mov hEvent,eax
    43. mov lpOverlapped.hEvent,eax
    44.  
    45.  
    46. comment @
    47. TIMEOUT equ 100h
    48. invoke WaitForSingleObject,hEvent,TIMEOUT
    49. .if eax==WAIT_TIMEOUT
    50. ;invoke Sleep,100h
    51. invoke Beep,100h,100h
    52. .endif
    53. @
    54. mov edx,1h
    55. mov dFlag,edx
    56. mov nNumberOfBytesToWrite,1h
    57. ;mov lpBuffer2,0h
    58.  
    59. jmp over
    60. again:
    61. mov edx,dword ptr nNumberOfBytesToWrite
    62. invoke ReadFile,hCom,offset lpBuffer2,edx,offset lpNumberOfBytesWritten,offset lpOverlapped
    63. ;invoke Sleep,1h
    64.  
    65. invoke WriteFile,hFile_data,offset lpBuffer2,nNumberOfBytesToWrite,offset lpNumberOfBytesWritten,0h
    66.  
    67. invoke SendMessage,handle_memo,WM_SETTEXT,1h,offset lpBuffer2
    68.  
    69. mov eax,dFlag
    70. .if eax!=0h
    71. jmp short again
    72. .endif
    73.  
    74.  
    75.  
    76. exit_thread:
    77.  
    78. invoke CloseHandle,hEvent
    79. invoke CloseHandle,hCom
    80. invoke CloseHandle,hFile_data
    81.  
    82.  
    83. invoke GetExitCodeThread,lpThreadHandle,offset dExitCode
    84. .if eax!=0h
    85. invoke MessageBox,0h,$CTA0("Поток завершается"),$CTA0("Поток завершается"),MB_OK
    86. .else
    87. invoke MessageBox,0h,$CTA0("Error"),$CTA0("Error"),MB_OK
    88. .endif
    89. invoke ExitThread,dExitCode
    90.  
    91.  
    92.  
    93.  
    94. over:
    95.  
    96. invoke CreateFile,$CTA0("data.txt"),GENERIC_READ or GENERIC_WRITE,0h,0h,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
    97. mov hFile_data,eax
    98.  
    99.  
    100. invoke CreateThread,0h,0h,offset again,0h,0h,lpThreadId
    101. mov lpThreadHandle,eax
    102.  
    103. ret
    104. portfunc endp
     
  2. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Чёт я не понимаю в чём проблемма? код смотреть в лом, но ведь всё тревиально:
    Код (Text):
    1. void                   *hPort;
    2. unsigned long       dwBufferLen;
    3. char                   pBuffer[256];
    4.  
    5.  
    6. hPort = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
    7. //...
    8. ReadFile(hPort,pBuffer,sizeof(pBuffer),&dwBufferLen,0);
    9. //...
    10. WriteFile(hPort,pBuffer,sizeof(pBuffer),&dwBufferLen,0);
    11. //...
    12. CloseHandle(hPort);
     
  3. vdk

    vdk New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2003
    Сообщения:
    18
  4. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Вот так получилось:

    Код (Text):
    1. portfunc PROTO :DWORD,:DWORD
    2.  
    3. portfunc proc open:DWORD,hWnd:DWORD
    4. local _dcb:DCB
    5. local dwWait:DWORD
    6.  
    7. mov handle_memo,eax
    8.  
    9. comment @
    10. .data
    11. myport db "//./COM1",0h
    12. .code
    13. @
    14.  
    15. invoke CreateFile,offset checked_port,GENERIC_READ or GENERIC_WRITE,0h,0h,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0h
    16. mov hCom,eax
    17.  
    18.  
    19. invoke GetCommState,hCom,addr _dcb
    20.  
    21. push esi
    22. lea esi,_dcb
    23. assume esi:ptr DCB
    24. mov [esi].BaudRate,CBR_19200
    25. mov [esi].ByteSize,8h
    26. mov [esi].Parity,NOPARITY
    27. mov [esi].StopBits,ONESTOPBIT
    28. assume esi:nothing
    29. pop esi
    30. invoke SetCommState,hCom, addr _dcb
    31.  
    32. invoke CreateEvent,0h,FALSE,FALSE,0h
    33. mov hEvent,eax
    34. mov lpOverlapped.hEvent,eax
    35.  
    36.  
    37. invoke SetCommMask,hCom,EV_RXCHAR
    38.  
    39. mov edx,1h
    40. mov dFlag,edx
    41. mov nNumberOfBytesToWrite,1h
    42.  
    43.  
    44. jmp over
    45. again:
    46.  
    47. mov edx,dword ptr nNumberOfBytesToWrite
    48. invoke ReadFile,hCom,offset lpBuffer2,edx,offset lpNumberOfBytesWritten,offset lpOverlapped
    49. invoke WaitForSingleObject,hEvent,INFINITE
    50. .if eax==WAIT_OBJECT_0
    51. invoke GetOverlappedResult,hCom,offset lpOverlapped,offset lpNumberOfBytesWritten,FALSE
    52. mov eax,lpNumberOfBytesWritten
    53. .if eax==0h
    54. mov eax,dFlag
    55. .if eax==0h
    56. jmp exit_thread
    57. .endif
    58. jmp again
    59. .endif
    60. .endif
    61.  
    62.  
    63.  
    64.  
    65.  
    66. invoke WriteFile,hFile_data,offset lpBuffer2,nNumberOfBytesToWrite,offset lpNumberOfBytesWritten,0h
    67. invoke SendMessage,handle_memo,WM_SETTEXT,1h,offset lpBuffer2
    68. mov eax,dFlag
    69. .if eax!=0h
    70. jmp again
    71. .endif
    72.  
    73.  
    74.  
    75. exit_thread:
    76.  
    77. invoke CloseHandle,hEvent
    78. invoke CloseHandle,hCom
    79. invoke CloseHandle,hFile_data
    80.  
    81.  
    82. invoke GetExitCodeThread,lpThreadHandle,offset dExitCode
    83. .if eax!=0h
    84. invoke MessageBox,0h,$CTA0("Поток завершается"),$CTA0("Поток завершается"),MB_OK
    85. .else
    86. invoke MessageBox,0h,$CTA0("Error"),$CTA0("Error"),MB_OK
    87. .endif
    88. invoke ExitThread,dExitCode
    89.  
    90.  
    91.  
    92.  
    93. over:
    94.  
    95. invoke CreateFile,$CTA0("data.txt"),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0h,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
    96. mov hFile_data,eax
    97.  
    98.  
    99. invoke CreateThread,0h,0h,offset again,0h,0h,lpThreadId
    100. mov lpThreadHandle,eax
    101.  
    102.  
    103. ret
    104. portfunc endp
    Кстати, что-то этот PortMon не понятный какой-то...
    Так и не разобрался что с ним делать...