typedef struct __RX_BUFFER_INFO {
ULONG Read; /* @field Current Read index. */
ULONG Write; /* @field Current Write index. */
ULONG Length; /* @field Length of buffer */
BOOL DataAvail; /* @field BOOL reflecting existence of data. */
PUCHAR RxCharBuffer; /* @field Start of buffer */
CRITICAL_SECTION CS; /* @field Critical section */
} RX_BUFFER_INFO, *PRX_BUFFER_INFO;
#define RxResetFifo(pSH) pSH.Write = pSH.Read = 0
#define RxEnterCS(pSH) EnterCriticalSection (&(pSH.CS))
#define RxLeaveCS(pSH) LeaveCriticalSection (&(pSH.CS))
#define RxWrite(pSH) (pSH.Write) // Write 인덱스 번호
#define RxRead(pSH) (pSH.Read) // Read 인덱스 번호
#define RxLength(pSH) (pSH.Length) // 버퍼길이(2048)
//APP이 읽어간 버퍼
#define RxBytesAvail(pSH) (RxWrite(pSH) - RxRead(pSH)) & (RxLength(pSH) - 1))
#define RxBuffWrite(pSH) (pSH.RxCharBuffer+pSH.Write) // FIFO의 쓸때 포인터
#define RxBuffRead(pSH) (pSH.RxCharBuffer+pSH.Read) // FIFO의 읽을떄 포인터
Read : APP이 ReadFile 요청시 FiFo 에서 읽었을 때의 인덱스
Write : Interrupt 스레드에서 FiFo 쓸 때 Write 인덱스를 사용하며 인덱스 업데이트
RxCharBuffer : Interrupt 스레드와 COM_READ 사이에서 버퍼 역할을 해줌.
==========================================================================================
Example
==========================================================================================
BYTE tx[100] = "abcdefg";
WriteToPort(g_hCom,tx,4);
WriteToPort(g_hCom,tx,3);
WriteToPort(g_hCom,tx,2);
WriteToPort(g_hCom,tx,1);
R |
W |
||||||||||
a |
b |
c |
d |
|
|
|
|
|
|
|
|
R |
W |
||||||||||
a |
b |
c |
d |
a |
b |
c |
|
|
|
|
|
R |
W |
||||||||||
a |
b |
c |
d |
a |
b |
c |
a |
b |
c |
|
|
typedef struct __TX_BUFFER_INFO {
DWORD Permissions; /* @field Current permissions */
ULONG Read; /* @field Current Read index. */
ULONG Length; /* @field Length of buffer */
PUCHAR TxCharBuffer; /* @field Start of buffer */
CRITICAL_SECTION CS; /* @field Critical section */
} TX_BUFFER_INFO, *PTX_BUFFER_INFO;
#define TxEnterCS(pSH) EnterCriticalSection (&(pSH->TxBufferInfo.CS))
#define TxLeaveCS(pSH) LeaveCriticalSection (&(pSH->TxBufferInfo.CS))
#define TxRead(pSH) (pSH->TxBufferInfo.Read) // 버퍼에서 읽은 인덱스
#define TxLength(pSH) (pSH->TxBufferInfo.Length) // APP이 보낸 데이터길이
#define TxBytesAvail(pSH) (TxLength(pSH)-TxRead(pSH)) // 버퍼에서 남은 데이터 갯수
// 버퍼에서 읽을 인덱스 주소
#define TxBuffRead(pSH) (pSH->TxBufferInfo.TxCharBuffer+pSH->TxBufferInfo.Read)
==========================================================================================
Example
==========================================================================================
APP |
||||||||||||
a |
b |
c |
d |
a |
b |
c |
a |
b |
c |
|
|
|
MDD는 APP에서의 버퍼 시작 포인터와 DataLength 전달 받음. |
||||||||||||
a |
b |
c |
d |
a |
b |
c |
a |
b |
c |
|
|
|
DoTxData() -> HWTxIntrHandler() |
||||||||||||
R |
||||||||||||
a |
b |
c |
d |
a |
b |
c |
a |
b |
c |
|
|
|
R |
||||||||||||
a |
b |
c |
d |
a |
b |
c |
a |
b |
c |
|
|
|
이함수는 ClearCommError 함수에 의해 채워진다.
typedef struct _COMSTAT {
DWORD fCtsHold : 1; //
DWORD fDsrHold : 1;
DWORD fRlsdHold : 1;
DWORD fXoffHold : 1;
DWORD fXoffSent : 1;
DWORD fEof : 1;
DWORD fTxim : 1;
DWORD fReserved : 25;
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;
* 출처 : MSDN
'Hello CE,Mobile' 카테고리의 다른 글
TouchCalibrate() (0) | 2012.07.25 |
---|---|
CE,Mobile 설치 상대경로 (0) | 2012.07.16 |
TouchPowerHandler (0) | 2011.05.17 |
Prefast tools 의 유용성 (0) | 2010.11.18 |
Windows Mobile 6 Tips and Tricks in Registry (0) | 2010.11.15 |