플렛폼 SDK

커뮤티케이션

커뮤니케이션의 함수 일람


함수 설명
BuildCommDCB 지정한 DCB구조체에 디바이스 제어 문자열로 지정한 값을 저장한다.
BuildCommDCBAndTimeouts 디바이스 정의 문자열을 다비아스 제어 블럭 코드에 변환한 후, 디바이스 제어 블럭에 저장한다.
ClearCommBreak 지정한 통신 디바이스의 회선이 끊긴 상태를 해제하고 문자 송신을 다시 시작한다.
ClearCommError 통신 에러의 정보를 얻고 통신 디비이스의 현재 상태를 통지한다.
CommConfigDialog 드라이버가 제공하는 설정 다이얼로그 박스를 표시한다.
EscapeCommFunction 지정한 통신 디바이스에 확장 기능을 실행하도록 지시한다.
GetCommConfig 통신 디바이스의 현재 구성을 얻는다.
GetCommMask 지정한 통신 디바이스의 이벤트 마스트의 값을 얻는다.
GetCommModemStatus 모뎀의 제어 레지스터 값을 얻는다.
GetCommProperties 지정한 통신 디바이스의 통신 프로퍼티의 정보를 버퍼에 넣는다.
GetCommState 지정한 통신 디바이스의 현재의 제어 설정을 디바이스 제어 블럭(DCB구조체)에 저장한다.
GetCommTimeouts 지정한 통신 디바이스로 실행 되는 모든 읽고 쓰는 조작의 타임아웃 파라미터를 얻는다.
GetDefaultCommConfig 통신 디바이스의 초기 설정의 구성을 얻는다.
PurgeComm 지정한 통신 자원의 출력 버퍼 또는 입력 버퍼에 있는 모든 문자를 파기한다.
SetCommBreak 지정한 통신 디바이스의 문자송신을 중단하고ClearCommBreak함수가 호출 되어질때 까지 송신 회선을 절단 상태로 한다.
SetCommConfig 통신 디바이스의 현재의 구성을 설정한다.
SetCommMask 특정 통신 디바이스로 감시하는 일련의 이벤트를 설정한다.
SetCommState 디바이스 제어 블럭(DCB구조체)의 지정에 따라서 통신 디바이스를 구성한다.
SetCommTimeouts 지정한 통신 디바이스로 실행되는 모든 읽기 쓰기 조작의 타임아웃을 설정한다.
SetDefaultCommConfig 통신 디바이스의 기본 설정의 구성을 설정한다.
SetupComm 지정한 통신 디바이스의 통신 파라미터를 초기화한다.
TransmitCommChar 지정한 통신 디바이스의 출력 버퍼에 있는 미처리 데이터보다 전에 특정 문자를 송신한다.
WaitCommEvent 지정한 통신 디바이스에서 이벤트가 발생하는 것을 대기한다.
위 링크는 일본 MSDN의 설명이 링크되어 있음

http://msdn2.microsoft.com/en-us/library/aa363194.aspx

위 함수 일람의 영어 설명은 위에 사이트에 기술되어져 있음
Posted by 띠리
Win32 SDK로 만든 간단한 시리얼 통신 예제
한 문자 보내고 받기

컴포트가 COM1로 고정되어있음으로 테스트 할때
바꾸어 주고 다시 빌드해야됨.


// 시리얼 포트 직접 입출력


#include <Windows.h>

#include "resource.h"


BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

DWORD RecvData(LPVOID );            // 수신 전용 스레드


HWND    hWndCopy;                    // 스레드를 위한 핸들의 카피

HANDLE    hFile;                        // 파일 핸들

int        nSwitch;


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,

                   LPSTR lpszCmdLine, int nCmdShow)

{

    // 다이알로그 표시

    DialogBox(hInst, "DLG_COM", HWND_DESKTOP, (DLGPROC)DlgProc);


    return TRUE;

}


BOOL CALLBACK DlgProc(HWND hWnd, UINT msg,

                      WPARAM wParam, LPARAM lParam)

{

    char szBuffer[200];


    switch(msg){


    case WM_INITDIALOG:


        hWndCopy = hWnd;            // 다이알로그박스 핸들

        nSwitch = 1;


        // 컴포트 열기

        hFile = CreateFile("COM1",

                    GENERIC_READ | GENERIC_WRITE,

                    0,                // 비공유

                    0,                // 시큐리티 속성:사용안함

                    OPEN_EXISTING,    // 기존 파일 오픈

                    0, 0 );            // 속성, 템플레이트


        if(hFile == INVALID_HANDLE_VALUE)

            MessageBox(0, "컴포트 열때 에러났어", "에공", MB_OK);


        DCB                dcb;


        // 지정한 통신 디바이스의 현재 DCB 설정 얻기

        // DCB : Device Control Block 디바이스 제어 블럭

        GetCommState(hFile , &dcb);           


        // 설정을 변경할 때는 코드 추가

        //        :


        // DCB의 지정에 따라 통신 디바이스 구성

        // 하드웨어와 제어 설정 초기화

        SetCommState(hFile , &dcb);           


        wsprintf(szBuffer, "BaudRate %d : ByteSize %d", dcb.BaudRate, dcb.ByteSize);


        // 다이알로그박스 캡션에 BaudRate:ByteSize 사이즈 표시

        SetWindowText(hWnd, szBuffer);


        COMMTIMEOUTS    cTimeout;


        // 현재 설정중인 타임아웃 자료 얻기

        //GetCommTimeouts(hFile, &cTimeout);   


        cTimeout.ReadIntervalTimeout        = 1000;   

        cTimeout.ReadTotalTimeoutMultiplier  = 0;

        cTimeout.ReadTotalTimeoutConstant    = 1000;

        cTimeout.WriteTotalTimeoutMultiplier = 0;

        cTimeout.WriteTotalTimeoutConstant   = 0;


        // 지정한 통신 디바이스의 읽기쓰기 타임아웃 설정

        SetCommTimeouts(hFile, &cTimeout);


        // 수신 스래드 생성하여 스타트

        DWORD            nThreadId;


        // 시리얼 통신 데이터 수신용 스레드 생성

        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, NULL, 0, &nThreadId);


        return TRUE;


    case WM_COMMAND:


        switch(LOWORD(wParam)){


        case ID_EDIT_SEND:       


            // 송신쪽 에디트 컨트롤이 변화할 때

            if(HIWORD(wParam) == EN_CHANGE){       


                char szSend[10];


                // 송신쪽 데이터 버퍼에서 읽어오기

                GetDlgItemText(hWnd, ID_EDIT_SEND, szBuffer, sizeof(szBuffer));   


                // 선택 문자 위치 얻기

                int nPos = (int)SendDlgItemMessage(hWnd, ID_EDIT_SEND, EM_GETSEL, 0, 0);


                // 선택 항목 개시 위치

                int nStart = LOWORD(nPos);               

                szSend[0] = szBuffer[nStart - 1];


                DWORD    nByte;


                // 한문자 송신

                WriteFile(hFile, szSend, 1, &nByte, 0);   

            }

            return TRUE;


        case IDCANCEL:


            nSwitch = 0;        // 스래드 종료용


            // 컴포트 닫기

            CloseHandle(hFile);


            // 다이알로그 닫기

            EndDialog(hWnd, 0);


            return TRUE;

        }

    }


    return FALSE;

}

// 읽어오기 전용 스레드

DWORD RecvData( VOID * dummy )                   

{

    DWORD    dwByte;

    char    szRecv[10];

    int        nRet;


    while(nSwitch){


        // 한 문자 수신

        nRet = ReadFile(hFile, szRecv, 1, &dwByte, 0);


        // ReadFile()은 성공하면 0이외를 반환, 타임아웃도 성공

        if(dwByte == 1)

        {

            SetWindowText(hWndCopy, "수신했어");


            SendDlgItemMessage(hWndCopy, ID_EDIT_RECV, WM_CHAR, szRecv[0], NULL);

        }

        else

            SetWindowText(hWndCopy, "수신 대기중");

    }

    return 0;

}




VS2005의 프로젝트로 되어있는 샘플
빌드해서 두 컴퓨터에 시리얼 케이블로 연결한후
윗 텍스트박스에 글자를 입력하면 상대방 어플리케이션에
글자가 하나씩 전송됨
invalid-file

시리얼 통신 간단 예제

Posted by 띠리

VB.NET에서 시리얼 통신하는 정말 간단한 예제
VB.NET은 해본적이 없어서 아직 아는게 별로 없다.
오늘 처음으로 Delgate라는 것을 봤다.
Invoke도 그렇고...

잘은 모르겠지만 예전에 VB6에서는 메세지 박스가 떠있으면
컨트롤은 다른 이벤트가 발생하지 않았다.
그런데 Delgate와 Invoke를 쓰면 메세지 박스가 떠있더라도
메세지를 받을 수 있다.


Imports System.IO.Ports    ' Serial 통신용

Imports System.Threading    ' 쓰레드용


Public Class frmMain


    Private WithEvents ComPort As New System.IO.Ports.SerialPort


    ' Delegate : 대리자를 선언하는 데 사용한다.

    ' 대리자는 형식의 Shared 메서드 또는 개체의 인스턴스 메서드를

    ' 참조하는 참조 형식이다.

    ' 이 대리자 클래스의 인스턴스를 만들기 위해 매개 변수 형식 및

    ' 반환 형식이 일치하는 모든 프로시저를 사용할 수 있다.

    ' 이러한 프로시저는 대리자 인스턴스를 통해 나중에 호출될 수 있다.


    Delegate Sub AddMessageDelegate(ByVal str As String)


    ' 컴포트 열기

    Private Sub cmdConnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnConnect.Click


        Try

            ComPort.PortName = "COM" & Trim(txtPort.Text)

            ComPort.BaudRate = 9600

            ComPort.Parity = Parity.None

            ComPort.DataBits = 8

            ComPort.StopBits = StopBits.One


            If (ComPort.IsOpen = True) Then

                MessageBox.Show(ComPort.PortName & "는 벌써 열려져 있는데...", "에러야", _

                MessageBoxButtons.OK, MessageBoxIcon.Error)

                Exit Sub

            End If


            Call ComPort.Open()


            btnConnect.Enabled = False

            btnDisconnect.Enabled = True


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러야", MessageBoxButtons.OK, MessageBoxIcon.Error)


        End Try

    End Sub


    ' 데이터 수신 이벤트

    Private Sub ComPort_DataReceived(ByVal sender As Object, _

                                ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _

                                Handles ComPort.DataReceived


        Dim addmsg As New AddMessageDelegate(AddressOf AddMessage)

        Dim strDataReceived As String


        Try

            ' 시리얼 통신으로 데이터 수신

            strDataReceived = ComPort.ReadLine


        Catch ex As Exception


            strDataReceived = ex.Message


        End Try


        ' Control.Invoke (Delegate)

        ' 컨트롤의 내부 창 핸들이 들어 있는 스레드에서

        ' 지정된 대리자를 실행한다.

        ' .NET Compact Framework에서 지원된다.


        txtRecv.Invoke(addmsg, New Object() {"RCV>" + strDataReceived})


    End Sub


    ' 텍스트박스 메시지 표시

    Private Sub AddMessage(ByVal str As String)


        txtSend.Text = ""

        txtRecv.Text = DateTime.Now.ToString("HH:mm:ss") + " " + _

                          str + ControlChars.CrLf + _

                          txtRecv.Text

    End Sub


    ' 문자열 송신

    Private Sub btnSend_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnSend.Click


        If (txtSend.Text.Length = 0) Then

            MessageBox.Show("송신 문자열을 입력해 줘", "에러야", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

            txtSend.Focus()

            Exit Sub

        End If


        Try

            ' 시리얼 통신으로 데이터 송신

            ComPort.WriteLine(txtSend.Text)

            Call AddMessage("SND>" + txtSend.Text)


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try


    End Sub


    ' 컴포트 닫기

    Private Sub btnDisconnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnDisconnect.Click


        btnConnect.Enabled = True

        btnDisconnect.Enabled = False

        Call ComPort.Close()


    End Sub


    Private Sub lblTitle_DoubleClick(ByVal sender As Object, _

                                ByVal e As System.EventArgs) _

                                Handles lblTitle.DoubleClick


        MsgBox("나 메세지 박스야")


    End Sub


End Class



VB8 소스
Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 977,901
Today : 71 Yesterday : 132