Programming - cpueblo.com

SERIAL IOCTL 을 살펴볼수 있는 FutureNet RS포토 컨트롤 프로토콜


글쓴이 : 유광희 날짜 : 2004-07-20 (화) 15:27 조회 : 8942
***********************************************************************

FutureNet RS포토 컨트롤 프로토콜

              FA-10 version 1.30


        ■ 듀얼 채널·풀 컨트롤 모드
        ■ 싱글 채널·풀 컨트롤 모드
        ■ 싱글 채널·리미티드 컨트롤 모드
        ■ 싱글 채널·프리콘피규아드모드



                                                Glenn Toshi Martin
                                                Century Systems
                                                November 2, 1998


**********************************************************************


듀얼 채널·풀 컨트롤 모드


■ 개요

 이 사양은 이하를 목표로 설계했다.
 
 · FA-10의 시리얼 포트를 네트워크 인터페이스를 통해서 투과적으로 액세스 할 수 있다
  같게 한다.
 · FA-10의 시리얼 포트가 PC의 시리얼 포트와 같이 동작하기 위한 커멘드를 제
  제공한다.(이벤트의 서포트, 신호선의 설정, 스테이터스의 취득 등)
 · FA-10의 시리얼 포트와 네트워크 인터페이스의 사이에 고속으로  신뢰성이 있어, 효과
  적인 데이터 전송을 가능하게 한다.
 · 에러나 통계치가 용이하게 얻을 수 있도록(듯이) 한다.
 · 유저가 FA-10의 시리얼 포트의 상세를 의식해있어로 해결되도록(듯이) 한다.

■ 임플리멘테이션

 이 프로토콜은 상기의 목표를 달성하기 위해서, FTP 프로토콜의 컨셉을 부분적으로 채
 넣고 있다.FTP는 높은 신뢰성, 성능, 효과를 얻을 수 있도록(듯이) 설계되고 있다.이 설계의
 특징은 2개의 소켓을 이용하는 것이다.소켓의 하나는 커멘드의 교환에 사원
 , 이제(벌써) 다른 한쪽은 데이터의 교환에 사용된다.커멘드와 데이터의 스트림을 나누었던 것에
 따라서, 데이터의 혼란이 일어날 가능성이 없어진다.커멘드가 일단 코만드스트림소
 모포를 통해서 보내지면, 데이터 스트림은 커멘드가 처리되어 리턴 할 때까지 일시정
 지 한다.LAN상의 소켓 어플리케이션이 커멘드 포토로서 2001, 데이터포트와
 해 2002를 사용하는 경우의 전형적인 교환의 모습을 다음에 나타낸다.


 -----------------------------------------------------------------------------
 |어플리케이션측(클라이언트)  |   |FA-10측(서버)        |
 | 커멘드 포토에 2001을 사용하면 가정 |←→ | 커멘드 포토:33333으로 Listen |
 | 데이터포트에  2002를 사용하면 가정 |   |(33333은 FA-10의 설정으로 변경 가능)| 
 |-----------------------------------------------------------------------------
  |클라이언트는 2개의 소켓을 작성  |      |  서버는 소켓 2001으로부터 접속요점 |
  |.하나는 커멘드 포토의 2001(크라이|      | 구를 받는다(accept).      |                       
  |안트모드), 하나는 데이터포트의 |      |                              |
  |2002(서버 모드)                |  →  |                                                                          |
  |커멘드 포토의 소켓은 서버측의 코 |      |                              |
  |만드포트의 33333에 접속한다.데이타포|    |                                |
  | 트의 소켓 번호는 다음에 서버에 보낸다.|      |                              |
  |-----------------------------------------------------------------------------
  |커멘드 포토가 접속된 것에 의해 코 |      |서버는 커멘드를 송수신 하기 위한(해) |
  |만드의 송수신의 준비가 갖추어졌다.        | ←  |의 링크를 확립한다.            |
  |데이터포트는 Listen 상태가 된다.      |      |                              |
  |-----------------------------------------------------------------------------
  |클라이언트는 데이터포트의 소켓차례 |      |서버는 커멘드 포토(소켓차례| 
  |호 2002를 포함한 커멘드를 보내 FA-10의 시 | →  | 호 2001)으로부터 시리얼 포트 예약의 |         
  |리얼 포토를 오픈한다.          |      |요구를 받아들인다.                |
  |------------------------------------------------------------------------------
  |클라이언트는 데이터포트에의 접속 요구 |      |서버는 클라이언트가 listen 해  |
  |(을)를 받아, 데이터포트의 접속을 확립 |      |있는 데이터포트(2002번의 포토)|
  |.이후, 데이터는 데이터포트를 통해서 | ←  |접속 요구를 보낸다.              |
  |송수신 할 수 있다.                      |      |                                |
  |------------------------------------------------------------------------------
  |    ···                        |  →  |    ···                      |
  |------------------------------------------------------------------------------



■ 서버의 동작

 클라이언트는 커멘드 포토측을 제어하는데 대해, 서버(FA-10)는 데이터포트측
 (을)를 제어한다.커멘드 포토의 접속은 클라이언트와 서버의 접속이 존재하고 있는 동안은 항상 계
 속 된다.데이터포트의 접속도 계속되지만, 타임 아웃의 경우는 서버측으로부터 절단, 재
 접속을 한다.커멘드 포토의 접속과 데이터포트의 접속은 기본적으로는 시리얼 드라이버
 함수와 같이 기능하지만, 커멘드 포토에 보내지는 리퀘스트안에는 데이터포트가
 사용중의 사이는 큐잉 해야 하는 것이 있다.한층 더 몇개의 함수에서는 데이터
 포토가 디폴트 함수를 가진다.디폴트 함수는 FA-10의 시리얼 포트를 상기의 사양으로 해
 하고 싶어해 직접 액세스 할 수 있도록(듯이) 한다.그 이외의 서버의 동작은 FTP(RFC 959)에 따른다.


■ 커멘드와 응답

 FA-10에 보내는 커멘드와 그 응답은 WindowNT 시리얼 드라이버 사양에 따른 부분집합
 되고 있다.FA-10의 IRP(I/O Request Packet)는 네트워크의 커멘드 포토를 사
 (이)라고 보내진다.이 IRP는 WindowsNT IRP와 같은 형식이지만, 기능은 제한되고 있다.FA-10
 의 IRP 리퀘스트는 데이터포트가 액티브(데이터가 흐르고 있다) 화도인가에는 관계없이
 커멘드 포토를 사용해 보내진다.커멘드 IRP와 응답 IRP는 고정 바이트의 구조체로서 송
 수신된다.기본이 되는 IRP의 형식은 다음대로.

 ※ Big endian 형식

 이하에서는 unsigned int(integer) 형은 4 byte로 한다.
 FA-10에 보내는 구조체는 다음의 형식을 가진다.

 typedef struct tag_example_FA10_input_IRP
 {
        unsigned int type = 0;        /* 0 - command 1 - response */
        unsigned int IoctlCode;        /* I/O control code/function code */
        unsigned int sDataBuffer;        /* Size of valid data in the data buffer */
        BYTE DataBuffer[36];        /* Data */
 } example_FA10_input_IRP;

 DataBuffer의 사이즈는 최대 36(CREATE 커멘드의 파라미터의 경우)이기 위해, 구조
 몸의 사이즈는 48 byte 고정으로 한다.이 오바헷드를 피하고 싶은 경우는, 각각의 커멘드
 하지만 실제의 커멘드 사이즈에 따라 그 데이터 사이즈를 지정할 수 있다.사이즈를 고정하고 있는 것은
 개발을 용이하게 하기 위한(해).

 FA-10으로부터 받는 구조체는 다음의 형식을 가진다.

 typedef struct tag_example_FA10_output_IRP
 {
 unsigned int type = 1;        /* 0 - command 1 - response */
        unsigned int IoctlCode;        /* I/O control code/function code */
        unsigned int Status;        /* Status field */
        unsigned int Information;        /* Information field */
        unsigned int sDataBuffer;        /* Size of the data buffer */
        BYTE DataBuffer[64];        /* Data */
 } example_FA10_output_IRP;

 DataBuffer의 사이즈는 최대 64(62)(SERIAL_COMMPROP 구조체의 경우)이기 위해,
 구조체의 사이즈는 84 byte 고정으로 한다.이 오바헷드를 피하고 싶은 경우는, 각각의 팽이
 드가 실제의 커멘드 사이즈에 따라 그 데이터 사이즈를 지정할 수 있다.사이즈를 고정하고 있다
 의는 개발을 용이하게 하기 위한(해).

 SERIAL_COMMPROP 구조체의 예:
 typedef struct _SERIAL_COMMPROP {
        USHORT PacketLength;
        USHORT PacketVersion;
        ULONG ServiceMask;
        ULONG Reserved1;
        ULONG MaxTxQueue;
        ULONG MaxRxQueue;
        ULONG MaxBaud;
        ULONG ProvSubType;
        ULONG ProvCapabilities;
        ULONG SettableParams;
        ULONG SettableBaud;
        USHORT SettableData;
        USHORT SettableStopParity;
        ULONG CurrentTxQueue;
        ULONG CurrentRxQueue;
        ULONG ProvSpec1;
        ULONG ProvSpec2;
        WCHAR ProvChar[1];
 } SERIAL_COMMPROP, *PSERIAL_COMMPROP;

 이 구조체는 이 프로토콜로 정의되는 최대의 구조체이기 위해, 이 설계의 기준으로서
 사용된다.Status 필드의 값은 이하로 커멘드 마다 정의된다.

■ IRP 리퀘스트를 사용하는 FA-10의 프로토콜

 이하, DataBuffer/Data 필드에 대해서는 값을 지정하지 않을 때는 0으로 패딩 하는 것도
 의로 한다.

●IRP_MJ_CREATE

Send:
type = 0        /* 커멘드인 것을 나타낸다 */
IoctlCode = 0x00000001;        /* I/O 컨트롤/펑션·코드 */
sDataBuffer = 12;
/* 데이터 버퍼의 사이즈 · 필수 파라미터만을 사용하는 경우 */
sDataBuffer = 36;
/* 데이터 버퍼의 사이즈 · 모든 파라미터를 사용하는 경우 */
DataBuffer[36];                /* 데이터 버퍼 - 이하의 겉(표) */

DataBuffer[0]          4-byte unsigned integer  클라이언트의 IP주소
DataBuffer[4]    2-byte unsigned short    클라이언트의 TCP 포토 번호
                2-byte zero padding
DataBuffer[8]    4-byte unsigned integer  시리얼 포트의 번호
DataBuffer[12]  4-byte unsigned integer  baud rate
DataBuffer[16]  1-byte unsigned character stop bit
                1-byte unsigned character 패리티
                1-byte unsigned character 데이터 길이
                1-byte zero padding
DataBuffer[20]  4-byte unsigned integer  flow control의 방식
DataBuffer[24]  4-byte unsigned integer  플로우 리플레스
DataBuffer[28]  4-byte integer XON        리밋트
DataBuffer[32]  4-byte integer XOFF      리밋트

DataBuffer 필드에는 3개의 필수 파라미터와 8개의 옵션 파라미터가 있다.
FA-10의 클라이언트의 IP주소, 클라이언트의 포토 번호, 시리얼 포트의 번호(FA-10
(은)는 0에 고정)의 3개의 파라미터가 필수의 파라미터이다.이 리퀘스트를 발행하기 전에,
클라이언트는 지정한 포토 번호로 FA-10으로부터의 리퀘스트를 기다릴(Listen 해 둘) 필요
하지만 있다.클라이언트는 FA-10이 이 포토에 접속한 시점에서 서버로서 기능한다.
데이터 버퍼는 컴파일러간의 호환성을 유지하기 위해서 4바이트 경계에 가지런히 하고 있다.
옵션의 파라미터는 시리얼 포트의 초기설정에 사용한다.아무것도 지정하지 않는 경우는 데
fault의 설정, 9600 Baud, 8비트, 1 stop bit, 패리티 이루어, 플로우 콩트 로
르 없이 설정된다.

FA-10에서는 baud rate로서 이하의 속도를 지정할 수 있다:
300 bps
600 bps
1200 bps
2400 bps
4800 bps
9600 bps
19200 bps
38400 bps
57600 bps
115200 bps
230400 bps
460800 bps

데이터의 형식은 다음과 같이 설정한다.

stop bit: 1 Stop bit - StopBits = 0x00
                1.5 Stop bits - StopBits = 0x01
                2 Stop bits - StopBits = 0x02

패리티:      None - Parity = 0x00
                Odd - Parity = 0x01
                Even - Parity = 0x02

데이터 길이:      7 Bits - WordLength = 0x07
                8 Bits - WordLength = 0x08

플로우 컨트롤은 다음과 같이 설정한다.

        플로우 컨트롤 없음
                ControlHandShake = 0x00000001
                FlowReplace = 0x00000001
        RTS/CTS 플로우 컨트롤(하드웨어 플로우 컨트롤)
                ControlHandShake = 0x00000008
                FlowReplace = 0x00000080
        XON/XOFF 플로우 컨트롤
                ControlHandShake = 0x00000000
                FlowReplace = 0x00000003
        RTS/CTS 및 XON/XOFF 플로우 컨트롤
                ControlHandShake = 0x00000008
                FlowReplace = 0x00000083

XonLimit와 XoffLimit 멤버는 0으로 해 둔다.

Receive:

  type = 1        /* 응답 데이터인 것을 나타낸다 */
  IoctlCode = 0x00000001;        /* I/O control code/function code */
  Status = STATUS_XXX;        /* Status field */
  Information = 0;        /* Information field */
  sDataBuffer = 0;        /* Size of valid data in the data buffer OR */
  sDataBuffer = 4;        /* Size of port user IP Address */
  DataBuffer[64];        /* Data */

불려 갔을 때의 동작:
  FA-10으로 정상적으로 네트워크 접속할 수 있던 다음은, 2도 불러선 안 된다.

I/O스테이터스 블록:
 Information 필드에는 0이 세트 된다.스테이터스 필드에는 시리얼 포
 트가 I/O리퀘스트를 받을 준비를 할 수 있으면 STATUS_SUCCESS가 세트 된다.필요
 자원을 얻을 수 없는 경우는 에러 스테이터스가 세트 된다.요구된 포토가 사용
 안의 경우는 스테이터스 필드는 INSUFFICIENT RESOURCES가 된다.이 경우,
 의 포토를 사용하고 있는 유저의 IP주소가 CREATE 함수가 돌려주는 데이터 버퍼(4-
 byte unsigned integer)에 세트 된다.
 
 STATUS_SUCCESS        0x00000000
 STATUS_UNSUCCESSFUL        0xC0000001
 STATUS_INVALID_PARAMETER        0xC000000D
 STATUS_ACCESS_DENIED        0xC0000022
 STATUS_OBJECT_NAME_COLLISION        0xC0000035
 STATUS_INSUFFICIENT_RESOURCES        0xC000009A

●IRP_MJ_CLOSE
(실장은 보류)

Send:

type = 0
IoctlCode = 0x00000003;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x00000003;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

커멘드 포토의 접속이 끊어졌을 때에 자동적으로 클로우즈 처리를 하기 위해, 이 커멘드
(은)는 필수는 아니다.인터벌을 취하기 위해서 접속 스피드에 맞추어 10 문자분만큼 클로우즈
처리를 늦추어 제어선의 스피드로 데이터를 보내, 디바이스의 세치기를 금지해, 하드웨
아 제어선을 떨어뜨려, 디바이스를 리셋트 한다.

불려 갔을 때의 동작:
시리얼 포트의 자원은 필요없게 된다.

I/O스테이터스 블록:
정보 필드에는 0이 세트 되어 스테이터스 필드에는 STATUS_SUCCESS
하지만 세트 된다.

●IOCTL_SERIAL_GET_PROPERTIES

Send:

type = 0
IoctlCode = 0x00000006;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x00000006;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = sizeof(SERIAL_COMMPROP);
        /* Size of valid data in the data buffer */
DataBuffer[64] = SERIAL_COMMPROP structure;
        /* Data */

DataBuffer[64] = SERIAL_COMMPROP structure;
        /* Data */

DataBuffer[0]  2-byte unsigned short  패킷장
DataBuffer[2]  2-byte unsigned short  패킷의 버젼
DataBuffer[4]  4-byte unsigned integer 서비스 마스크
DataBuffer[8]  4-byte unsigned        reserved
DataBuffer[12]  4-byte unsigned integer 송신 큐의 최대 사이즈(아르바이트)
DataBuffer[16]  4-byte unsigned integer 수신 큐의 최대 사이즈(아르바이트)
DataBuffer[20]  4-byte unsigned integer baud rate의 상한
DataBuffer[24]  4-byte unsigned integer the provider subtype
DataBuffer[28]  4-byte unsigned integer the provider capabilities
DataBuffer[32]  4-byte unsigned integer 설정 가능한 파라미터
DataBuffer[36]  4-byte unsigned integer 설정 가능한 baud rate
DataBuffer[40]  2-byte unsigned short  설정 가능한 데이터 비트
DataBuffer[42]  2-byte unsigned short  설정 가능한 stop bit, 패리티
DataBuffer[44]  4-byte unsigned integer 현재의 송신 큐의 사이즈(아르바이트)
DataBuffer[48]  4-byte unsigned integer 현재의 수신 큐의 사이즈(아르바이트)
DataBuffer[52]  4-byte unsigned integer provider specification 1
DataBuffer[56]  4-byte unsigned integer provider specification 2
DataBuffer[60]  2-byte unsigned integer provider extension

오퍼레이션:

이 커멘드는 baud rate나 신호선, 플로우 컨트롤등으로 설정할 수 있는 값을 돌려준다.이것은
이러한 파라미터를 설정하기 전에 사용한다.이 함수에는 2개의 센츄리·시스템즈고
유의 파라미터가 있다.그것은 SERIAL_COMMPROP 구조체안의 ProvSpec1 및
ProvSpec2이다.ProvSpec1 파라미터에는 프로토콜의 버젼 번호가 포함된다.이
파라미터는 4바이트의 정수로, 상위 2바이트는 메이저 버젼 번호(Version가 1.01의
경우는 1)을, 하위 2바이트는 마이너 버젼 번호(Version가 1.10의 경우는 10)를 나타낸다.
ProvSpec2 파라미터는 이용 가능한 포토수를 가진다.FA-10의 경우는 1이다.이 커멘드
(은)는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용된다.

I/O스테이터스 블록:

스테이터스 필드에 STATUS_SUCCESS가 세트 되고 있을 때는, 정보 필드
에는 SERIAL_COMMPROP의 사이즈가 세트 된다.그 외의 경우, 정보 필드에는 0
하지만 세트 되어 스테이터스 필드에 STATUS_BUFFER_TOO_SMALL가 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_COMMPROP 구조체:

typedef struct _SERIAL_COMMPROP {
        USHORT PacketLength;
        USHORT PacketVersion;
        ULONG ServiceMask;
        ULONG Reserved1;
        ULONG MaxTxQueue;
        ULONG MaxRxQueue;
        ULONG MaxBaud;
        ULONG ProvSubType;
        ULONG ProvCapabilities;
        ULONG SettableParams;
        ULONG SettableBaud;
        USHORT SettableData;
        USHORT SettableStopParity;
        ULONG CurrentTxQueue;
        ULONG CurrentRxQueue;
        ULONG ProvSpec1;
        ULONG ProvSpec2;
        WCHAR ProvChar[1];
} SERIAL_COMMPROP, *PSERIAL_COMMPROP;

●IOCTL_SERIAL_GET_BAUD_RATE

Send:

type = 0
IoctlCode = 0x0000000c;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x0000000c;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = sizeof(SERIAL_BAUD_RATE);
        /* Size of valid data in the data buffer */
DataBuffer[64] = SERIAL_BAUD_RATE structure;
        /* Data */

DataBuffer[0]  4-byte integer  현재의 baud rate의 값

오퍼레이션:

현재의 baud rate 설정치를 돌려준다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

스테이터스 필드에 STATUS_SUCCESS가 세트 되고 있을 때는, 정보 필드
에는 SERIAL_BAUD_RATE의 사이즈가 세트 된다.그 외의 경우, 정보 필드에는 0
하지만 세트 되어 스테이터스 필드에 STATUS_BUFFER_TOO_SMALL가 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_BAUD_RATE 구조체:
typedef struct _SERIAL_BAUD_RATE {
        ULONG BaudRate;
} SERIAL_BAUD_RATE, *PSERIAL_BAUD_RATE;

●IOCTL_SERIAL_SET_BAUD_RATE

Send:

type = 0
IoctlCode = 0x0000000d;        /* I/O control code/function code */
sDataBuffer = sizeof(SERIAL_BAUD_RATE);
        /* Size of valid data in the data buffer */
DataBuffer[36] = SERIAL_BAUD_RATE structure;
        /* Data */

DataBuffer[0]  4-byte integer  설정하는 baud rate의 값

Receive:

type = 1
IoctlCode = 0x0000000d;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:

baud rate를 세트 한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

정보 필드에는 0이 세트 된다.스테이터스 필드에는 STATUS_SUCCESS 또
(은)는 STATUS_INVALID_PARAMETER, STATUS_BUFFER_TOO_SMALL가 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_BAUD_RATE 구조체:
typedef struct _SERIAL_BAUD_RATE {
        ULONG BaudRate;
} SERIAL_BAUD_RATE, *PSERIAL_BAUD_RATE;

baud rate를 세트 하는 경우, SERIAL_BAUD_RATE 구조체의 BaudRate 멤버에는 그
(이)라고 해 사용 가능한 값을 할당한다.그리고 IOCTL_SERIAL_SET_BAUD_RATE 커멘드의 1
부로서 그 구조체를 송신한다.

baud rate로서 설정 가능한 값은 다음대로.
300 bps
600 bps
1200 bps
2400 bps
4800 bps
9600 bps
19200 bps
38400 bps
57600 bps
115200 bps
230400 bps
460800 bps

●IOCTL_SERIAL_GET_HANDFLOW

send:

type = 0
IoctlCode = 0x0000000f;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x0000000f;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = sizeof(SERIAL_HANDFLOW);
        /* Size of valid data in the data buffer */
DataBuffer[64] = SERIAL_HANDFLOW structure;
        /* Data */

DataBuffer[0]  4-byte unsigned integer  flow control 방식(Control Handshake)
DataBuffer[4]  4-byte unsigned integer  플로우 리플레스(Flow Replace)
DataBuffer[8]  4-byte integer          X on limit
DataBuffer[12] 4-byte integer          X off limit

오퍼레이션:

flow control의 설정을 돌려준다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

Status 필드가 STATUS_SUCCESS의 경우, 정보 필드에는
SERIAL_HANDFLOW의 사이즈가 세트 된다.그 외의 경우, 정보 필드에는 0이 세
트 되어 스테이터스 필드에 STATUS_BUFFER_TOO_SMALL가 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_HANDFLOW 구조체:
typedef struct _SERIAL_HANDFLOW
{
        ULONG ControlHandShake;
        ULONG FlowReplace;
        LONG XonLimit;
        LONG XoffLimit;
} SERIAL_HANDFLOW, *PSERIAL_HANDFLOW;

이 구조체의 ControlHandShake와 FlowReplace 멤버는 FA-10의 시리얼 포트의 프로
-제어의 설정에 관한 정보를 가진다.flow control의 설정을 확인하려면  이 돌아가 값을 조사할 필요
하지만 있다.
ControlHandshake의 비트 3이 세트 되고 있고, 한편 FlowReplace의 비트 7, 1, 0
하지만 세트 되고 있으면, FA-10의 flow control는 XON/XOFF와 RTS/CTS의 양쪽 모두가 설정되어
있다.ControlHandshake의 비트 3이 세트 되고 있고, 한편 FlowReplace의 비트 7이 세
트 되고 있으면, FA-10의 flow control는 RTS/CTS이다.FlowReplace의 비트 1, 0이
세트 되고 있으면, FA-10의 flow control는 XON/XOFF이다.그 이외의 경우는 플로우제
어 없이 있다.덧붙여 이 경우 XonLimit와 XoffLimit 멤버에는 유효한 정보는 포함되지 않는다.

●IOCTL_SERIAL_SET_HANDFLOW

Send:

type = 0
IoctlCode = 0x00000010;        /* I/O control code/function code */
sDataBuffer = sizeof(SERIAL_HANDFLOW);
        /* Size of valid data in the data buffer */
DataBuffer[36] = SERIAL_HANDFLOW structure;
        /* Data */

DataBuffer[0]  4-byte unsigned integer representing the control handshake
DataBuffer[4]  4-byte unsigned integer representing the flow replace
DataBuffer[8]  4-byte integer representing the X on limit
DataBuffer[12] 4-byte integer representing the X off limit

Receive:

type = 1
IoctlCode = 0x00000010;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:

플로우 컨트롤의 설정을 실시한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

정보 필드에는 0이 세트 된다.스테이터스 필드에 STATUS_SUCCESS인가,
또는 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER가 섹
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_HANDFLOW 구조체:
typedef struct _SERIAL_HANDFLOW
{
        ULONG ControlHandShake;
        ULONG FlowReplace;
        LONG XonLimit;
        LONG XoffLimit;
} SERIAL_HANDFLOW, *PSERIAL_HANDFLOW;

이 구조체의 ControlHandShake와 FlowReplace 멤버는 FA-10의 시리얼 포트의 프로
-제어의 설정에 관한 정보를 가진다.

내용은 다음대로.

flow control 없음:   
        ControlHandShake = 0x00000001
      FlowReplace = 0x00000001
RTS/CTS flow control: 
        ControlHandShake = 0x00000008
      FlowReplace = 0x00000080
XON/XOFF flow control:
        ControlHandShake = 0x00000000
      FlowReplace = 0x00000003
XON/XOFF와 RTS/CTS flow control:
        ControlHandShake = 0x00000008
        FlowReplace = 0x00000083

XonLimit와 XoffLimit 멤버는 0을 세트 한다.

●IOCTL_SERIAL_GET_LINE_CONTROL

Send:

type = 0
IoctlCode = 0x00000011;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x00000011;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = sizeof(SERIAL_LINE_CONTROL);
        /* Size of valid data in the data buffer */
DataBuffer[64] = SERIAL_LINE_CONTROL structure;
        /* Data */

DataBuffer[0]  1-byte unsigned character  stop bit
DataBuffer[1]  1-byte unsigned character  패리티
DataBuffer[2]  1-byte unsigned character  데이터 길이

오퍼레이션:

디바이스의 stop bit, 패리티, 데이터 길이의 파라미터의 값을 돌려준다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

Status 필드가 STATUS_SUCCESS의 경우, 정보 필드에는
SERIAL_LINE_CONTROL의 사이즈가 세트 된다.그 외의 경우, 정보 필드에는 0
하지만 세트 되어 스테이터스 필드에 STATUS_BUFFER_TOO_SMALL가 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_LINE_CONTROL 구조체:
typedef struct _SERIAL_LINE_CONTROL
{
        UCHAR StopBits;
        UCHAR Parity;
        UCHAR WordLength;
} SERIAL_LINE_CONTROL, *PSERIAL_LINE_CONTROL;

이 구조체의 StopBits, Parity, WordLength의 멤버에는 FA-10 시리얼 포트의 설정에
관한 정보가 포함된다.그 내용은 다음대로.

설정 가능한 stop bit
        1 Stop bit - StopBits = 0x00
        1.5 Stop bits - StopBits = 0x01
        2 Stop bits - StopBits = 0x02
설정 가능한 패리티
        None - Parity = 0x00
        Odd - Parity = 0x01
        Even - Parity = 0x02
설정 가능한 데이터 길이
        7 Bits - WordLength = 0x07
        8 Bits - WordLength = 0x08

●IOCTL_SERIAL_SET_LINE_CONTROL

Send:

type = 0
IoctlCode = 0x00000012;        /* I/O control code/function code */
sDataBuffer = sizeof(SERIAL_LINE_CONTROL);
        /* Size of valid data in the data buffer */
DataBuffer[36] = SERIAL_LINE_CONTROL structure;
        /* Data */

DataBuffer[0]  1-byte unsigned character  stop bit
DataBuffer[1]  1-byte unsigned character  패리티
DataBuffer[2]  1-byte unsigned character  데이터 길이

Receive:

type = 1
IoctlCode = 0x00000012;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:

디바이스의 stop bit, 패리티, 데이터 길이의 파라미터의 값을 설정한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용할 수 있다.

I/O스테이터스 블록:

정보 필드에는 0이 세트 된다.스테이터스 필드에 STATUS_SUCCESS인가,
또는 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER가 섹
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

SERIAL_LINE_CONTROL 구조체:
typedef struct _SERIAL_LINE_CONTROL
{
        UCHAR StopBits;
        UCHAR Parity;
        UCHAR WordLength;
} SERIAL_LINE_CONTROL, *PSERIAL_LINE_CONTROL;

이 구조체의 StopBits, Parity, WordLength의 멤버에는 FA-10 시리얼 포트의 설정
에 관한 정보가 포함된다.설정할 수 있는 값은 다음대로.

설정 가능한 stop bit
        1 Stop bit - StopBits = 0x00
        1.5 Stop bits - StopBits = 0x01
        2 Stop bits - StopBits = 0x02
설정 가능한 패리티
        None - Parity = 0x00
        Odd - Parity = 0x01
        Even - Parity = 0x02
설정 가능한 데이터 길이
        7 Bits - WordLength = 0x07
        8 Bits - WordLength = 0x08


●IOCTL_SERIAL_SET_BREAK_ON

Send:

type = 0
IoctlCode = 0x00000013;        /* I/O control code/function code */
sDataBuffer = 2;
        /* Size of valid data in the data buffer */
DataBuffer[36] = 송신하는 브레이크 문자수;
        /* Data */

DataBuffer[0]  2-byte unsigned short  송신하는 브레이크 문자의 수

Receive:

type = 1
IoctlCode = 0x00000013;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:

이 커멘드를 사용해 FA-10의 시리얼 포트로 지정한 문자 몇분의 브레이크 신호를 보내는 와
(이)가 할 수 있다.이 커멘드는 FA-10의 시리얼 포트가 오픈되고 있을 때 마셔 사용으로
온다.

I/O스테이터스 블록:

정보 필드에는 0이 세트 된다.스테이터스 필드에 STATUS_SUCCESS인가,
또는 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER가 섹
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

●IOCTL_SERIAL_SET_DTR

Send:

type = 0
IoctlCode = 0x00000019;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:

type = 1
IoctlCode = 0x00000019;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:

DTR(data terminal ready)를 세트 한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되기 전에 실행해도 의미가 없다.이것
(은)는, 포토가 오픈되었을 때에, 신호선 상태는 반드시 결정할 수 있던 상태에 세트 되기 때문에
있다.

I/O스테이터스 블록:

정보 필드에는 0이 세트 된다.스테이터스 필드에는 STATUS_SUCCESS인가,
또는 핸드쉐이크의 설정이 요구와 다른 경우는, STATUS_INVALID_PARAMETER가 세
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023



●IOCTL_SERIAL_CLR_DTR

Send:
type = 0
IoctlCode = 0x0000001a;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:
type = 1
IoctlCode = 0x0000001a;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:
DTR(data terminal ready)를 클리어 한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되기 전에 실행해도 의미가 없다.이것
(은)는, 포토가 오픈되었을 때에, 신호선 상태는 반드시 결정할 수 있던 상태에 세트 되기 때문에
있다.

I/O스테이터스 블록:
정보 필드에는 0이 세트 된다.스테이터스 필드에는 STATUS_SUCCESS인가,
또는 핸드쉐이크의 설정이 요구와 다른 경우는, TATUS_INVALID_PARAMETER가 섹
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023



●IOCTL_SERIAL_SET_RTS

Send:
type = 0
IoctlCode = 0x0000001b;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:
type = 1
IoctlCode = 0x0000001b;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:
RTS(request to send)를 세트 한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되기 전에 실행해도 의미가 없다.이것
(은)는, 포토가 오픈되었을 때에, 신호선 상태는 반드시 결정할 수 있던 상태에 세트 되기 때문에
있다.

I/O스테이터스 블록:
정보 필드에는 0이 세트 된다.스테이터스 필드에는 STATUS_SUCCESS인가,
또는 핸드쉐이크의 설정이 요구와 다른 경우는 STATUS_INVALID_PARAMETER가 섹
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023



●IOCTL_SERIAL_CLR_RTS

Send:
type = 0
IoctlCode = 0x0000001c;        /* I/O control code/function code */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[36];        /* Data */

Receive:
type = 1
IoctlCode = 0x0000001c;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:
RTS(request to send)를 클리어 한다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되기 전에 실행해도 의미가 없다.이것
(은)는, 포토가 오픈되었을 때에, 신호선 상태는 반드시 결정할 수 있던 상태에 세트 되기 때문에
있다.

I/O스테이터스 블록:
정보 필드에는 0이 세트 된다.스테이터스 필드에는 STATUS_SUCCESS인가,
또는 핸드쉐이크의 설정이 요구와 다른 경우는, STATUS_INVALID_PARAMETER가 세
트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023


●IOCTL_SERIAL_GET_DTRRTS

Send:
type = 0
IoctlCode = 0x0000001d;        /* I/O control code/function code */
sDataBuffer = sizeof(ULONG);
        /* Size of valid data in the data buffer */
DataBuffer[36] = DTRRTS structure;
        /* Data */

Receive:
type = 1
IoctlCode = 0x0000001d;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 0;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

오퍼레이션:
이 리퀘스트가 처리된 시점으로의 DTR와 RTS 신호 상태를 돌려준다.
이 커멘드는 FA-10의 시리얼 포트가 오픈되기 전에 실행해도 의미가 없다.이것
(은)는, 포토가 오픈되었을 때에, 신호선 상태는 반드시 결정할 수 있던 상태에 세트 되기 때문에
있다.

I/O스테이터스 블록:
스테이터스 필드에 STATUS_SUCCESS가 세트 되고 있을 때는, 정보 필드
에는 ULONG의 사이즈가 세트 된다.스테이터스 필드에 STATUS_BUFFER_
TOO_SMALL가 세트 되고 있을 때는, 정보 필드에는 0이 세트 된다.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023



●GET_USER_STATUS_COMMAND

이것은 WindowsNT의 표준의 시리얼 커멘드는 아니다.개발자가 FA-10의 시리얼 포
트유자를 식별하기 위해서 제공되고 있다.

Send:
type = 0
IoctlCode = 0x00000028;        /* I/O control code/function code */

Receive:
type = 1
IoctlCode = 0x00000028;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 8;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

DataBuffer[0]  4-byte unsigned integer  사용중의 유저의 IP주소
DataBuffer[4]  4-byte unsigned integer  시리얼 포트가 사용중인지 어떤지를
                                        나타내 보이는 플래그

DataBuffer 필드에는 2개의 파라미터가 있다.현재 FA-10의 시리얼 포트를 사용
하고 있는 유저의 IP주소(이것은 아무도 사용하지 않을 때는 0이 된다)와 유저 플래그
(사용중은 1, 미사용시는 0)이다.

Status가 취할 수 있는 값은 다음대로.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023



●EVENT_COMMAND

이것은 WindowsNT 표준의 시리얼 커멘드는 아니다.개발자가 WAIT 함수나 그 외의 여러가지
스테이터스/에러 함수등을 실장하기 위해서 제공한다.응답을 얻기 위해서 보내야 할 코만
드는 없다.이 커멘드는 단순하게 CTS, DSR, CD, Framing Error, Overrun Error, Overflow
error, Parity Error, Noise Error의 변화를 돌려준다.커멘드 포토가 작성된 후 이러한 변
화(이벤트)가 발생하면, 이 커멘드가 FA-10으로부터 호스트 컴퓨터의 커멘드 포
트에 보내진다.

Send:
아무것도 보내지 않는다.

Receive:
type = 1
IoctlCode = 0x00000029;        /* I/O control code/function code */
Status = STATUS_XXX;        /* Status field */
Information = 0;        /* Information field */
sDataBuffer = 32;        /* Size of valid data in the data buffer */
DataBuffer[64];        /* Data */

DataBuffer[0]  4-byte unsigned integer  CTS 상태
DataBuffer[4]  4-byte unsigned integer  DSR 상태
DataBuffer[8]  4-byte unsigned integer  CD 상태
DataBuffer[12] 4-byte unsigned integer  flaming error의 수
DataBuffer[16] 4-byte unsigned integer  오버런에러의 수
DataBuffer[20] 4-byte unsigned integer  오버플로우 에러의 수
DataBuffer[24] 4-byte unsigned integer  패리티 에러의 수
DataBuffer[28] 4-byte unsigned integer  노이즈 에러의 수
DataBuffer[32] 4-byte unsigned integer  브레이크 신호를 받은 것을 나타내 보인다

DataBuffer 필드에는 다음의 9개의 파라미터가 있다.
CTS 상태, DSR 상태, CD상태, flaming error의 수, 오버런에러의 수, 오
버프 로 에러의 수, 패리티 에러의 수, 노이즈 에러의 수, 브레이크 신호를 수신 혀혐의
인가.

CTS 상태가 1의 경우는 CTS가 ON, 0의 경우는 CTS가 OFF.
DSR 상태가 1의 경우는 DSR가 ON, 0의 경우는 DSR가 OFF.
CD상태가 1의 경우는 CD가 ON, 0의 경우는 CD가 OFF.
break signal indicator가 1의 경우는 브레이크 신호를 수신했다.0의 경우는 수신하고 있지 않다.

Status가 취할 수 있는 값은 다음대로.

STATUS_SUCCESS        0x00000000
STATUS_UNSUCCESSFUL        0xC0000001
STATUS_INVALID_PARAMETER        0xC000000D
STATUS_BUFFER_TOO_SMALL        0xC0000023

●UNKNOWN CONTROL CODE

FA-10은 불명한 커멘드를 받으면 정상적인 응답 IRP를 돌려 보낸다.그 때, IRP에는
unknown code를 나타내는 IoctlCode와 스테이터스 필드에 STATUS_INVALID_
PARAMETER(0 xC000000D)를 세트 할 필요가 있다.


싱글 채널·풀 컨트롤 모드


■ 개요

이 프로토콜 사양의 설계 목표는 다음대로.

· 유저가 가능한 한 간단하게 사용할 수 있도록(듯이) 한다.
· 프로토콜을 알기 쉽게 한다.
· 위의 목표를 달성하기 위해서, 가능한 한 FA-10의 시리얼 포트를 넷트워크인타후
  스를 개입시키고 투과적으로 취급할 수 있도록(듯이) 한다.
· FA-10의 시리얼 포트가 PC의 시리얼 포트와 같이 동작하기 위한 커멘드를
  제공한다.(이벤트의 서포트, 신호선의 설정, 스테이터스의 취득 등)
· FA-10의 시리얼 포트와 네트워크 인터페이스의 사이에 고속으로  신뢰성이 있어, 효과
  적인 데이터 전송을 가능하게 한다.
· 에러의 상세나 통계치가 용이하게 얻을 수 있도록(듯이) 한다.
· 유저가 FA-10의 시리얼 포트의 상세를 의식해있어로 해결되도록(듯이) 한다.

■ 임플리멘테이션

이 프로토콜은 상기의 목표를 달성하기 위해서, 1개의 TCP 접속을 사용해 간단하게 개발이로
오도록(듯이) 설계되고 있다.이 모드에서는, 거래되는 모든 패킷의 선두에 헥
다를 붙일 수 있어 커멘드/데이터, 커멘드/리스폰스의 종류가 구별된다.

호스트 컴퓨터와 FA-10과의 전형적인 교환의 모습을 다음에 나타낸다.

|--------------------------------------------------------------------------|
| 어플리케이션측(클라이언트)  |    |FA-10측(서버)              |
|                                    | ←→|  커멘드 포토:33333으로 Listen  |
|                                    |    | (33333은 FA-10의 설정으로 변경 가능)|
|--------------------------------------------------------------------------|
|클라이언트는 1개의 소켓을 작성 서 | → |서버는 클라이언트로부터의 접속 요구|
|바측의 커멘드 포토의 33333에 접속한다.|    |(을)를 받는다(accept).          |   
|--------------------------------------------------------------------------|
|클라이언트는 FA-10의 시리얼 포트를 |    |서버는 그 패킷을 받아,  |
|오픈하기 위한 패킷을 작성해,  | →  |시리얼 포트를 오픈한다.    |
|서버에 송신한다.                  |    |                                |
|---------------------------------------------------------------------------|
|클라이언트는 커멘드나 데이터를 송수신|  ← |서버는 클라이언트의 커멘드로 했다|
|한다.                              |    |하지만은 동작한다.시리얼 포트 상태|
|                                    |    |에 변화가 있으면 그것을 클라이언트에 |
|                                    |    | 통지한다.                      |
|----------------------------------------------------------------------------|
| ···                            | → |  ···                        |
|---------------------------------------------------------------------------|

■ 커멘드와 응답

FA-10에 보내는 커멘드와 그 응답은 WindowNT 시리얼 드라이버 사양에 따른 부분집합
되고 있다.실장한 모든 커멘드는 이 문서에 기재하고 있다.FA-10에 보낸다
커멘드 패킷과 그 리스폰스 패킷에는 4바이트의 헤더가 붙여진다.이 헤더
의 형식은 다음대로.

※ Big endian 형식

제1바이트 = 커멘드 식별자
제2바이트 = 16비트의 값의 상위 8비트
제3바이트 = 16비트의 값의 하위 8비트
제4바이트 = 스테이터스

헤더 이후는 데이터 버퍼로서 다루어진다.

FA-10으로부터 받는 스테이터스의 값은 각각의 커멘드 마다 정의된다.



●IRP_MJ_CREATE

Send:

제1바이트 = 1
제2바이트 = 0
제3바이트 = 16(옵션 파라미터를 지정하는 경우)
            또는 5(옵션 파라미터를 지정하지 않는 경우)
제4바이트 = 0

Send[4]  4-byte unsigned integer    유저의 IP주소
Send[8]  1-byte unsigned character  시리얼 포트의 번호
          1-byte unsigned character  stop bit
          1-byte unsigned character  패리티
          1-byte unsigned character  데이터 길이
Send[12]  4-byte unsigned integer    baud rate
Send[16]  4-byte unsigned integer    flow control 1
Send[20]  4-byte unsigned integer    flow control 2

 이 커멘드에서는 4바이트의 헤더에 이어, 데이터 버퍼로서 2개의 메인 파라미터
(와)과 6개의 옵션 파라미터를 보낸다.파라미터는 클라이언트의 IP주소, FA-10의
시리얼 포트 번호(항상 0), 통신 조건, baud rate, flow control등을 지정한다.
데이터 버퍼는 컴파일러간의 호환성을 유지하기 위해서 4바이트 경계에 가지런히 하고 있다.
옵션 파라미터는 시리얼 포트의 초기설정으로서 사용된다.이것을 지정하지 않는 경우
(은)는, baud rate 9600, 데이터 길이 8비트, 1 stop bit, 패리티 이루어, flow control인
해로 설정된다.파라미터로 설정할 수 있는 값은 이하대로.

설정 가능한 baud rate의 값:
300 bps
600 bps
1200 bps
2400 bps
4800 bps
9600 bps
19200 bps
38400 bps
57600 bps
115200 bps
230400 bps
460800 bps

설정 가능한 통신 조건의 값:

stop bit

        1 Stop bit · StopBits = 0x00
        1.5 Stop bits · StopBits = 0x01
        2 Stop bits · StopBits = 0x02
패리티
        None - Parity = 0x00
        Odd - Parity = 0x01
        Odd - Parity = 0x01
        Even - Parity = 0x02
데이터 길이
        7 Bits - WordLength = 0x07
        8 Bits - WordLength = 0x08

설정 가능한 flow control의 값:

flow control 없음
        flow control 1 = 0x00000001
        flow control 2 = 0x00000001
RTS/CTS flow control
        flow control 1 = 0x00000008
        flow control 2  = 0x00000080
XON/XOFF flow control
        flow control 1 = 0x00000000
        flow control 2  = 0x00000003
XON/XOFF와 RTS/CTS flow control
        flow control 1 = 0x00000008
        flow control 2  = 0x00000083

Receive:
제1바이트 = 1
제2바이트 = 0
제3바이트 = 4(사용중의 클라이언트의 IP주소의 사이즈)
            또는 0(아무도 사용하고 있지 않는 경우)
제4바이트 = 0(커멘드가 성공했을 경우), 또는  0이외(실패했을 경우)

수신한 헤더의 제4바이트는, 커멘드가 성공했을 때는 0을 돌려준다.실패했을 때는  0이외
의 값을 돌려준다.

●WRITE_REQUEST

Ethernet측으로부터 RS-232 C측에 보내는 유저의 데이터는 클라이언트 어플리케이션으로부터
“WRITE_REQUEST“으로서 보낸다.이 패킷의 형식은 다음대로.

Send:

제1바이트 = 2
제2바이트 = 쓰는 데이터의 사이즈의 상위 8비트
제3바이트 = 쓰는 데이터의 사이즈의 하위 8비트
제4바이트 = 0

헤더 이후는 FA-10의 시리얼 포트에 쓰는 유저의 데이터.

Receive:
없음


●IOCTL_SERIAL_GET_PROPERTIES

Send:
제1바이트 = 3
제2바이트 = 0
제3바이트 = 0
제4바이트 = 0

Receive:
제1바이트 = 3
제2바이트

Downloads

  • FutureNet_RS포토_컨트롤_프로토콜.txt

  • 유광희 2004-07-20 (화) 15:27
      짤림......파일을 다운로드 받을것
    댓글주소