시리얼 통신을위한 KERNEL32.DLL API에서 인용

시리얼 통신이 작동 KERNEL32.DLL API에 그릴 수, 관련 소스 코드는 다음과 같습니다
사용하여 시스템을;
하여 System.Runtime.InteropServices를 사용하여;

Telehome.GSM 네임 스페이스
{
/// <요약>
/// ************************************ ****************************
// / 
/// 기능 : 직렬 포트 연결을 분리, 전송, 시리얼 데이터를 수신 한 KERNEL32.DLL하여 일련의 상관 동작
/// 함수 COM 포트가 작동
/// 
/// 저자 : Telehome.Hzyong 
/// 
/ 날짜 시간 // : 2005년 11월 20일
/// 
/// *********************************** *************************************************
/ // </ 요약>
공용 클래스의 CommPort 
{
/// <요약>
/// 포트 이름 (COM1, COM2 ... COM4 ...)
/// </ 요약>
공공 문자열 여기서, portNum;

/// <요약>
/// 전송 9600
/// </ 요약>
보 속도 INT 공개;

/// <요약>
///数据位4-8
/// </ 요약>
공중 바이트 ByteSize;

/// <요약>
/// NO 패리티 = 0-4, ODD, 짝수 마크 공간 
/// </ 요약>
공중 바이트 패리티;

/// <요약>
///停止位
/// </ 요약>
공중 바이트 정지 비트; // 0,1,2 = 1, 1.5, 2

/// <요약>
///超时长
/// </ 요약>
공공 INT ReadTimeout;

/// <요약>
/// COM口句柄
/// </ 요약>
개인 INT hComm = -1;

/// <요약>
/// 시리얼 포트가 이미 개방
</ 요약> ///
공개 BOOL가 = 거짓 개방;

/// <요약>
/// WINAPI 상수, 기입 플래그
/// </ 요약>
GENERIC_READ의 CONST의 UINT 사립 = 0x80000000에;

/// <요약>
/// WINAPI 일정한 판독 플래그
/// </ 요약>
개인 GENERIC_WRITE, CONST UINT = 0x40000000과;

/// <요약>
/// WINAPI 일정한 개방 기존
/// </ 요약>
개인 OPEN_EXISTING = CONST INT의 3.;

/// <요약>
/// WINAPI 상수 잘못된 핸들
/// </ 요약>
개인 INVALID_HANDLE_VALUE의 CONST의 INT = -1;

/// <요약>
유형 /// 디바이스 제어 블록 구조
/// </ 요약>
[StructLayout (LayoutKind.Sequential)]
공중 DCB 구조체
{
/// <요약>
DCB의 길이 ///
/// </ 요약>
공중 INT DCBlength;
/// <요약>
/// 지정된 현재 전송률
/// </ 요약>
공중 보 속도 INT; 
/// <요약>
/// 지정 바이너리 모드 여부
/// </ 요약>
공개 INT fBinary;
/// <요약>
/// 패리티 여부를 지정
/// </ 요약>
공중 INT의 fParity 단계;
/// <요약>
/// 여부를 지정 CTS 전송 제어를 검출하기위한, CTS를가 TRUE 인 경우, 송신이 정지되고, OFF된다.
/// </ 요약>
공중 INT fOutxCtsFlow;
/// <요약>


INT fOutxDsrFlow 공중; 
/// <요약>
, DTR DTR_CONTROL_HANDSHAKE는 "핸드 쉐이크"/// DTR_CONTROL_DISABLE DTR가 ON OFF 설정 값 DTR_CONTROL_ENABLE DTR 값으로 설정되어 있습니다
/// </ 요약>
공중 INT fDtrControl 단계;
/// < 요약>
/// 경우에 TRUE 값이 DSR이 OFF 무시받은 바이트 때
/// </ 요약>
공중 INT fDsrSensitivity;
/// <요약>
/// (가) 수신 버퍼가 가득 할 때, 지정 드라이버가 XoffChar 문자를 전송되었을 때 전송이 중지되어 있는지 여부를 확인합니다.
TRUE /// 경우, 수신 버퍼에 수신 버퍼가 가득하고, 드라이버 XoffLim은 전송 된 바이트있다
/// XoffChar 문자 바이트 중단 수신 한 송신은 계속된다. FALSE 때, 그 수신 버퍼
/// 빈은 XonChar 버퍼의 바이트 수를 나타내는 수신 및 송신 드라이버 복원 XonChar 보낸
/// 후를 전송 계속된다. Tx는 XOFF 계속
/// </ 요약>
; 공공 INT fTXContinueOnXoff 
/// <요약>
시간 후에는 /// TRUE, XoffChar는 수신 XonChar는 XON / XOFF을 재개 송신하고 수신 한 후 정지
흐름 제어 OUT /// 
/// </ 요약>
공중 INT fOutX;
/// <요약>
시간 /// TRUE 후, 버퍼 풀 XoffLim를 수신하는 수신 버퍼의 대표는 XoffChar는 수신 전송
/// 버퍼 빈 버퍼 XonLim 영역 대표 수신 한 XonChar는 상기 XON / XOFF 흐름 제어 전송 
/// </ 요약>
공중 INT fInX;
/// <요약>
/// 값이 TRUE이고 fParity가 TRUE 인 경우, 패리티 에러 대신 부재에 의해 지정된 ErrorChar 문자
/// 문자 오차 교체 가능 수신 
/// </ 요약>
공중 INT fErrorChar;
/// <요약>
/// eTRUE, 널을 제거 (0 값이 수신 될 때 ) 박리 널 바이트 활성화 
/// </ 요약>
공중 INT fNull; 
/// <요약>
/// RTS 흐름 제어 RTS가 OFF RTS_CONTROL_ENABLE 시간으로 설정된 경우 RTS_CONTROL_DISABLE은 RTS가 ON으로 설정되어
RTS_CONTROL_HANDSHAKE /// 시간 때 버퍼가 전체의 절반 RTS는 버퍼를받을 때 ON보다 작받는 것은의 분기 초과
세 가지가 가득 /// 때 RTS는 RTS_CONTROL_TOGGLE, 그렇지 않으면, 여전히 남아있는 RTS가 ON 버퍼 바이트를받을 OFF입니다
/// OFF 기본
/// </ 요약>
, 대중의 INT fRtsControl
/// <요약 >
에러가 발생할 때 /// TRUE, 판독 및 기록 동작이 중단 오류를 중단 한
/// </ 요약>
; 공공 INT fAbortOnError
/// <요약>
/// 미사용
/// </ 요약>
공중 지능 fDummy2;
/// <요약>
/// 플래그
/// </ 요약>
공중 UINT 플래그;
/// <요약>
/// 미사용, 0이어야
/// </ 요약>
공중 USHORT가 wReserved;
/// <요약>
///는 XON 문자이 허용되기 전에 수신 버퍼의 바이트 수를 지정 최소 송신
/// </ 요약>
공중 USHORT XonLim;
/// <요약>
/// XOFF 문자에 허용 될 수있는 수신 버퍼에 이전에 전송 된 바이트 지정된 최소
/// </ 요약>
USHORT XoffLim 공개;
/// <요약>
/// 현재 사용되고있는 특정 데이터 비트 포트
</ 요약> ///
공개 바이트 ByteSize;
<요약> ///
/// 패리티 검사 방법은 현재 사용되는 포트를, 이있을 수 EVENPARITY는 MARKPARITY는 NOPARITY, ODDPARITY 0-4 = NO, ODD는 짝수 마크는 공간 
/// </ 요약>
공중 바이트 패리티;
/// <요약>
스톱 비트 /// 지정된 포트는 현재 사용 번호 일 수있다 :. ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS = 0, 1, 1.5, 2 
/// </ 요약>
공중 바이트 정지 비트;
/// <요약>
/// 송신 및 XON 문자를 수신하기위한 규정 XON 수신 기기 및 송신의 문자 값 
/// </ 요약>
공개 문자 XonChar;
/// <요약>
송신 및 문자 XOFF 값과 수신 XOFF의 문자 송신을 수신하기 위해 지정된 /// 
</ 요약> ///
공개 숯 XoffChar을 ;
/// <요약>
패리티 에러가 수신 발생할 때 ///이 문자 값 대신 사용한
/// </ 요약>
, 공개 문자 ErrorChar 
/// <요약>
에는 이진 모드, 문자를 표시하는 데 사용되지 않을 때 때 ///을 종료 지시 데이터
/// </ 요약>
공중 EofChar CHAR;
/// <요약>
///이 문자가 수신 될 때, 이벤트가 발생
/// </ 요약>
공중 EvtChar CHAR;
/// < 요약>
///하지 않는
/// </ 요약>
공공 USHORT wReserved1; 
}

/// <요약>
///串口超时时间结构体类型
/// </ 요약>
[StructLayout (LayoutKind.Sequential)]
전용 구조체 COMMTIMEOUTS 

공개 INT ReadIntervalTimeout; 
공공 INT ReadTotalTimeoutMultiplier; 
공공 INT ReadTotalTimeoutConstant; 
공공 INT의 WriteTotalTimeoutMultiplier; 
공공 INT의 WriteTotalTimeoutConstant; 
}

/// <요약>
/// 버퍼 구조 타입 흐르는
/// </ 요약>
[StructLayout (LayoutKind.Sequential)]을 
개별 오버랩 구조체 

공공 INT 내부, 
공개 INT InternalHigh가, 
공개 INT 오프셋; 
OffsetHigh INT 공개 ; 
공공 INT hEvent; 
}

/// <요약>
/// 포트를 열어야
/// </ 요약>
/// <PARAM 이름 = "는 lpFileName"> 열 직렬 포트 이름 </ PARAM>
/// <PARAM NAME = "는 dwDesiredAcdess에"> 지정 시리얼 액세스 모드는 일반적으로 판독 - 기록 될 </ PARAM> 설정
/// <PARAM NAME = "만약 dwShareMode"> 시리얼, 시리얼 포트가 0으로 설정되어 공유 될 수있는 공유 모드를 지정 </ PARAM>
/// <를 시리얼 포트의 보안 속성의 설정 매개 변수 이름은 = "만약 lpSecurityAttributes는"> WIN9X에서 지원되지 않습니다 </ PARAM> NULL로 설정해야합니다
/// <PARAM NAME = "dwCreationDisposition"> 시리얼 통신을위한, 유일한 방법 작성에 OPEN_EXISTING </ PARAM >
/// <PARAM NAME = "dwFlagsAndAttributes에"> 지정된 직렬 플래그는 FILE_FLAG_OVERLAPPED (중첩 I / O 동작)에 설정된 속성은, 직렬 통신 비동기 </ PARAM> 지정
/// <PARAM NAME = "hTemplateFile을"> 시리얼 통신을 NULL로 설정해야 위해 </ PARAM>
[같이 DllImport ( "Kernel32.dll에서")]
개인 정적 통근자의 INT를 CreateFile (문자열 lpFileName, UINT dwDesiredAcdess에, INT의 만약 dwShareMode,
만약 lpSecurityAttributes INT, INT dwCreationDisposition, INT dwFlagsAndAttributes에, hTemplateFile INT);

/// <요약>
/// 포트 상태가 얻어
/// </ 요약>
/// <PARAM NAME = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "lpDCB"> 장치 제어 차단하려면 DCB </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 용 BOOL GetCommState (INT HFILE 상기 DCB lpDCB REF);

/// <요약>
/// 직렬 디바이스 제어 블록을 설정
/// </ 요약>
/// <PARAM NAME = "lpDef"> 장비 제어 스트링 </ PARAM>
/// <PARAM NAME = "lpDCB" > 기기 제어 블록 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 BOOL BuildCommDCB (문자열 lpDef 상기 DCB lpDCB REF);

/// <요약>
/// 설정된 포트 상태
/// </ 요약>
/// <PARAM NAME = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "lpDCB"> 장치 제어 블록 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 용 BOOL의 SetCommState (HFILE 상기 DCB lpDCB REF를 INT);

/// <요약>
/// 직렬 판독 초과
/// </ 요약>
/// <PARAM 이름 = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "lpCommTimeouts"> 초과 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 용 BOOL의 GetCommTimeouts (INT HFILE, COMMTIMEOUTS lpCommTimeouts REF);

/// <요약>
/// 설정 직렬 초과
/// </ 요약>
/// <PARAM 이름 = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "lpCommTimeouts을"> 초과 시간 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")] 
개인 정적 통근 BOOL SetCommTimeouts (INT HFILE, COMMTIMEOUTS lpCommTimeouts REF);

/// <요약>
/// 시리얼 데이터를 읽을
/// </ 요약>
/// <PARAM 이름 = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "는 lpBuffer"> 데이터 </ PARAM> 버퍼
/// <PARAM NAME = "nNumberOfBytesToRead"> 바이트 수 판독 기다려 </ PARAM>
/// <PARAM NAME = "lpNumberOfBytesRead"> 바이트 읽기 방법 </ PARAM>
/// <PARAM NAME = "lpOverlapped 매개"> 버퍼 오버플 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 BOOL에서 ReadFile (HFILE를 INT, 바이트 []를 lpBuffer가 nNumberOfBytesToRead를 INT,
REF INT lpNumberOfBytesRead 상기 겹쳐진 lpOverlapped 매개 REF) ;

/// <요약>
/// 직렬 기록 데이터
/// </ 요약>
/// <PARAM 이름 = "HFILE가"> 통신 장치가 처리 </ PARAM>
/// <PARAM NAME = "는 lpBuffer"> 데이터 버퍼 지역 </ PARAM>
/// <PARAM NAME = "nNumberOfBytesToWrite"> 기다릴 기록 된 바이트의 수 </ PARAM>
/// <PARAM NAME = "를 lpNumberOfBytesWritten"> 작성되었습니다 얼마나 많은 바이트 </ PARAM>
/// <PARAM NAME = "lpOverlapped 매개"> 버퍼 오버플 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")] 
개인 정적 통근 BOOL의 WriteFile (HFILE를 INT, 바이트 []를 lpBuffer가 nNumberOfBytesToWrite, int로
lpNumberOfBytesWritten INT REF를 상기 겹쳐진 lpOverlapped 매개 REF) ;

[같이 DllImport ( "kernel32.dll에서"SetLastError = TRUE)]
개인 정적 통근자의 부울 FlushFileBuffers는 (HFILE를 INT);

[같이 DllImport ( "kernel32.dll에서"SetLastError = TRUE)]
개인 정적 통근자의 부울 PurgeComm (HFILE, UINT dwFlags를 INT);

/// <요약>
/// 오프 직렬
/// </ 요약>
/// <PARAM NAME = "hObject"> 통신 디바이스 핸들 </ PARAM>
[같이 DllImport ( "의 Kernel32.dll")]
개인 정적 통근 BOOL 하여 CloseHandle (hObject INT);

/// <요약>
/// 마지막 오류 직렬 리턴 얻을
/// </ 요약>
[같이 DllImport ( "의 Kernel32.dll")]
)합니다 (GetLastError UINT 개인 정적 통근하는 단계;

/// <요약>
/// 직렬로 접속 확립
/// </ 요약>
공개 무효 열기를 ()
{

DCB = dcbCommPort 새로운 DCB ();
COMMTIMEOUTS ctoCommPort = 새로운 COMMTIMEOUTS ();

//打开串口 
hComm = CreateFile이 (여기서, portNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

(hComm == INVALID_HANDLE_VALUE가 있으면) 
{
리턴;
}

통신 타임 아웃 설정 //
; GetCommTimeouts (hComm, ctoCommPort REF)
ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutConstant = 0; 
SetCommTimeouts (hComm, ctoCommPort를 REF);

//设置串口
GetCommState (hComm, 심판 dcbCommPort);
dcbCommPort.fOutxCtsFlow = 524,800;
dcbCommPort.BaudRate = 전송 속도;
dcbCommPort.flags = 0;
dcbCommPort.flags | = 1;
(패리티> 0)의 경우
{
dcbCommPort.flags | = 2;
}
dcbCommPort.Parity는 패리티 =;
dcbCommPort.ByteSize = ByteSize;
dcbCommPort.StopBits = 정지 비트;
dcbCommPort.fOutxCtsFlow = 524,800; 
경우 (SetCommState (hComm, 심판 dcbCommPort)!)
{
반환;
}
개설 = TRUE;
}

/// <요약>
/// 직렬 폐쇄 측 통신
/// </ 요약>
공개 무효 닫기 () 
{
IF (= hComm INVALID_HANDLE_VALUE!) 
{
하여 CloseHandle (hComm);
}
}

/// <요약>
///读取串口返回的数据
/// </ 요약>
/// <PARAM NAME = "하는 numBytes">数据长度</ PARAM>
공개 바이트 [(하는 numBytes INT) 읽기 
{
바이트 [] BufBytes;
[] OutBytes 바이트;
BufBytes = 새로운 바이트 [하는 numBytes];
경우 (hComm = INVALID_HANDLE_VALUE!) 
{
OVERLAPPED ovlCommPort = 새로운 OVERLAPPED ();
INT BytesRead = 0;
ReadFile을 (hComm, BufBytes,하는 numBytes, REF BytesRead, ovlCommPort REF);
OutBytes = 새로운 바이트 [BytesRead];
Array.Copy (BufBytes, OutBytes, BytesRead);
OutBytes를 반환;

다른
{
새로운 바이트 [0] 리턴;
}
}

/// <요약>
///清空COM口缓冲区数据
/// </ 요약>
/// <리턴> </ 반품>
공공 부울 ClearPortData ()
{
BOOL 결과 = 거짓;
만약 (! = hComm INVALID_HANDLE_VALUE)
{
결과 = PurgeComm (hComm, 0);
}
반환 결과;
}

/// <요약>
///向串口写数据
/// </ 요약>
/// <PARAM NAME = "WriteBytes">数据数组</ PARAM>
공중 BOOL 쓰기 (바이트 [] WriteBytes) 
{
BOOL 결과;
경우 (hComm = INVALID_HANDLE_VALUE!) 
{
OVERLAPPED ovlCommPort = 새로운 OVERLAPPED ();
INT BytesWritten = 0;
의 WriteFile (hComm, WriteBytes, WriteBytes.Length, REF BytesWritten, ovlCommPort REF);
결과 = TRUE;
}
다른
{
결과 = 거짓;
}
반환 결과;
}
}
}

에서 전송

https://www.xuebuyuan.com/841503.html

추천

출처www.cnblogs.com/leo-navy/p/11445923.html