Сампл работы с COM-портом

Раздел посвящен программированию с использованием Power Basic.
NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сампл работы с COM-портом

Сообщение NashRus » 02.07.2007 (Пн) 11:56

День добрый, Други!

Хочу вот влиться в стройные, но редкие ряды девелоперов на PB. И сразу по актуальной для меня теме.

Есть ли у кого ссылочка или свой модуль для работы с портом, не через бейсиковский Open File, а через CreateFile. По функционалу, аналог MSCOMM32.OCX, т.е. с работой в несколько нитей и, видимо, с келбеками вместо событий. Есть свой класс на VB для этого, но хотелось бы именно посмотреть все грабли при работе с потоками и их синхронизацией, а также вот реализацией всего этого на PB.

Потоки нужны, т.к. даже асинхронный режим чтения/записи не спасает от зависания GUI при открытии порта.

Хочу на самле проникнуться идеалогией построения приложений на PB и получить практическую пользу от данного действа.

Буду очень благодарен.

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Re: Сампл работы с COM-портом

Сообщение PBDN » 02.07.2007 (Пн) 18:53

NashRus писал(а):хотелось бы именно посмотреть все грабли при работе с потоками и их синхронизацией, а также вот реализацией всего этого на PB.

Потоки нужны, т.к. даже асинхронный режим чтения/записи не спасает от зависания GUI при открытии порта.


API's
BuildCommDCB
BuildCommDCBAndTimeouts
ClearCommBreak
ClearCommError
CommConfigDialog
DeviceIoControl
EscapeCommFunction
GetCommConfig
GetCommMask
GetCommModemStatus
GetCommProperties
GetCommState
GetCommTimeouts
GetDefaultCommConfig
PurgeComm
SetCommBreak
SetCommConfig
SetCommMask
SetCommState
SetCommTimeouts
SetDefaultCommConfig
SetupComm
TransmitCommChar
WaitCommEvent

В обрабатывающем потоке WaitCommEvent
и по результату соответствующее действие
Рутину по инизиализации можно сделать на ПБшных операторах
а вытащить настоящие (не ПБшные) хэндлы можно через FILEATTR(#x,2)

Реальная воплощение зависит от от логики работы с девайсом.
Посмотрите в примерах на ПБ-шном сайте есть реализация Zmodem

ниже простенький генератор, который устанавливает линию TX либо в 1 либо в 0 вручную или молотит на сколько хватает скорости машины как генератор. Генератор работает в отдельном потоке, поэтому не вешает ГУИ.

Код: Выделить всё
#COMPILER PBWIN
#COMPILE EXE
#DIM ALL

#INCLUDE "win32api.inc"
'************************************************************************************
$title="mainDLG"
%IDC_Static01 = 1001
%IDC_Edit01   = 1002
%IDC_Button01 = 1003
%IDC_Button02 = 1004
%IDC_Button03 = 1005
'************************************************************************************
GLOBAL flag AS LONG

FUNCTION Gen (BYVAL hCom AS DWORD) AS LONG
    WHILE flag=1
         EscapeCommFunction(hCom,%SETBREAK)'; //1
         EscapeCommFunction(hCom,%CLRBREAK)'; //0
    WEND
END FUNCTION


CALLBACK FUNCTION cbDLGmainProc()
  STATIC hWndSaveFocus, hCom AS DWORD

    SELECT CASE AS LONG CBMSG
        CASE %WM_INITDIALOG
            hCom=CreateFile("COM1",%GENERIC_READ OR %GENERIC_WRITE, 0, BYVAL 0, %OPEN_EXISTING, 0, 0)
            IF hCom =%INVALID_HANDLE_VALUE THEN ? "Err1"
            flag=0
        CASE %WM_NCACTIVATE
            IF ISFALSE CBWPARAM THEN
                hWndSaveFocus = GetFocus()
            ELSEIF hWndSaveFocus THEN
                SetFocus(hWndSaveFocus) : hWndSaveFocus = 0
            END IF
            '
        CASE %WM_COMMAND
            SELECT CASE AS LONG CBCTL
                CASE %IDC_Button01
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                         EscapeCommFunction(hCom,%SETBREAK)'; //1
                    END IF
                CASE %IDC_Button02
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        EscapeCommFunction(hCom,%CLRBREAK)'; //0
                    END IF
                CASE %IDC_Button03
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        STATIC hThread AS DWORD : STATIC lRes AS LONG
                        IF flag=0 THEN
                            CONTROL SET TEXT CBHNDL,%IDC_Button03, "Press2stop"
                            flag=1
                            THREAD CREATE Gen (BYVAL hCom) TO hThread
                        ELSE
                            flag=0
                            CONTROL SET TEXT CBHNDL,%IDC_Button03, "CloseGen"
                            WaitForSingleObject(hThread,%INFINITE)
                            THREAD CLOSE hThread TO lRes
                            CONTROL SET TEXT CBHNDL,%IDC_Button03, "Press2start"
                        END IF
                    END IF
                    '
            END SELECT
            '
        CASE %WM_SYSCOMMAND
        CASE %WM_DESTROY
            CloseHandle (hCom)
    END SELECT
END FUNCTION
'************************************************************************************
'
'<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
FUNCTION PBMAIN () AS LONG
    LOCAL hDlg AS DWORD
    '------------------------------------------------------------------
    DIALOG NEW 0, $title,,, 200, 120 ,%WS_OVERLAPPEDWIN TO hDlg

    CONTROL ADD BUTTON , hDlg, %IDC_Button01, "SetTxd",   6, 42, 84, 15
    CONTROL ADD BUTTON , hDlg, %IDC_Button02, "ClearTXD", 6, 62, 84, 15
    CONTROL ADD BUTTON , hDlg, %IDC_Button03, "Generator", 6, 82, 84, 15
    '------------------------------------------------------------------
    DIALOG SHOW MODAL hDlg, CALL cbDLGmainProc 'TO lRes
END FUNCTION
                                         

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 02.07.2007 (Пн) 22:39

2PBDN, спасиб, на ВБ у меня тоже через АПИ. Хотелось вот как раз посмотреть как и что в ПБ.
буду мучать...

HAWK
Википедик
Википедик
 
Сообщения: 74
Зарегистрирован: 02.04.2009 (Чт) 19:28

Re: Сампл работы с COM-портом

Сообщение HAWK » 02.04.2009 (Чт) 19:54

Вот DLL-ка для работы с COM портом, в том числе и виртуальным.
Написана на языке PureBasic.
Инстукция в архиве.


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

    TopList