시리얼 포트 문제

I

infineonintern

Guest
시리얼 포트 프로그래밍 처리 사람들이 도움을 주시기 바랍니다.PCS는 오전 두려고하자

서로 간의 의사 소통을 생성합니다.내가 직렬 포트 프로그래밍에
새로운 오전과

서면 두 가지 간단한 프로그램을 각 PC에 실행합니다.이 프로그램은 윈도우 환경에서 도스 응용 프로그램입니다

와 C로 작성된 것입니다 .하나의 PC의 "읽기"가 될 다른 PC와 PC가 될 것입니다

"쓰기"의 PC."읽기"PC를 그냥 보낸 읽기하고 얼마나 많은 바이트를 표시

"서면의 시리얼 포트은"PC.문제는 이제 각에있는 두 개의 프로그램을 실행할 때입니다

PC를, "읽기"의 PC는 자신의 시리얼 포트와 "쓰기"PC에서 서면입니다 읽고있다

자체 직렬 포트.그들은 핸드하지 않거나 의사 소통.나는 두 가지를 연결했습니다

널 모뎀 케이블을 통해 시리얼 포트가 있지만 작동하지 않습니다.내가 거기에 아무것도
궁금
내 코드 또는 핸드의 설정에 문제가있다.제발 가이드!이것은 "독서에 대한 코드를"PC의 프로그램을 단지
0 바이트, 방법 printf (출력은

그것은 "서면으로"PC에서
9 바이트를 감지할 수 있니?) :
코드 :# "windows.h"포함

# 포함 <stdio.h>

# 포함 <io.h>

# 포함 <conio.h>

# 포함 <stdlib.h>maxBytes 32 정의 #

MAX는 128 정의 #주요 int ()

(

hSerial 처리;

DCB) = (0 dcbSerialParams;

COMMTIMEOUTS 시간 = (0);

는 DWORD dwBytesRead = 0;

숯불 szBuff [maxBytes] = (0);

int readbytes, 난;/ / 시리얼 포트 개방

hSerial =는 CreateFile ( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);(hSerial == INVALID_HANDLE_VALUE)

(

만약 (GetLastError () == ERROR_FILE_NOT_FOUND)

(

printf ( "시리얼 포트가 존재하지 않습니다 \ n");

)

printf ( "다른 오류 \ n");

)/ / 매개 변수를 설정

dcbSerialParams.DCBlength = sizeof (dcbSerialParams);/ / GetCommState 검색을 특정하기 위해 현재의 제어 설정을합니다통신 기기.

만약 (! GetCommState (hSerial, & dcbSerialParams))

(

printf ( "GetCommState, 검색에 현재 제어할 수없습니다. \ n");

)dcbSerialParams.BaudRate = CBR_9600;

dcbSerialParams.ByteSize = 8;

dcbSerialParams.StopBits = ONESTOPBIT;

dcbSerialParams.Parity = NOPARITY;/ / SetCommState 통신 기기의 사양에 따라 구성

/ / DCB.
이 함수는 모든 하드웨어를 제어 설정 reinitializes지만, 그렇지 않아

/ / 빈 출력 또는 입력 대기열

만약 (! SetCommState (hSerial, & dcbSerialParams))

(

printf ( "SetCommState, 수없습니다 DCB에 따라 직렬 포트를 구성규격 설정 \ n ");

)/ / 시간 설정

timeouts.ReadIntervalTimeout = 50;

timeouts.ReadTotalTimeoutConstant = 50;

= 50 timeouts.ReadTotalTimeoutMultiplier;

timeouts.WriteTotalTimeoutConstant = 50;

= 50 timeouts.WriteTotalTimeoutMultiplier;/ / 모든 읽기 및 쓰기 작업에 대한 매개 변수를 밖에서 시간을 설정 SetCommTimeouts

만약 (! SetCommTimeouts (hSerial, & 시간))

(

printf ( "SetCommTimeouts, 시리얼에 대한 시간 초과 매개 변수를 설정할 수없습니다포트 \ n ");

)만약 (! ReadFile (szBuff, maxBytes, & dwBytesRead hSerial,이 NULL)) (

printf ( "오류 \ n");

)

다른 (

동안 (ReadFile (hSerial, szBuff, maxBytes, & dwBytesRead, NULL을))

(

readbytes = sscanf ( "% d 개", szBuff);은 (i = 0; 난 <readbytes; 난 )

(

printf ( "% c"로, szBuff [내가]);

)printf ( "\ n");

printf ( "% d 개의 바이트를 직렬 포트에서 읽기. \ n", readbytes);

)/ / 닫는 내려

CloseHandle (hSerial);

)

)

 
O는 직렬 포트를 기반으로하지만, 이후 프로그래밍 과정을 줄 의도는 전혀없습니다 글쎄,
내가 그걸 어떻게 내가 / 할 것이 분명하지, 난 그저 적절한 접근법 FILE_FLAG_OVERLAPPED 설정 파일을 열 이름을 제공합니다 제대로 초기화 겹쳐 구조와 다른 스레드를 사용하는 장소에서 읽기와 쓰기위한 몇 가지 동기화.

귀하의 예를 이제, 난 당신이 WriteFile 버퍼에 따르면 당신은 나중에 작성에 대한 포인터와 함께 전화를 눈치 채지 않을 수있습니다.뿐 아니라이 안 좋은 일이지만, 비 때문에 작동하지
않습니다 - 중복 모드 WriteFile
때까지 다 ', 버퍼를 의미하므로 후속 대안 쓰레기 maxBytes'쓰기 바이트를 반환하지 않습니다.

파이프의 다른 쪽 끝에서, ReadFile
한번 시도로 보인다에서 오류에 대한 테스트를 부르나요?전까지도 'maxBytes'바이트를 읽습니다 현실에서이 전화를 반환하지 않습니다 또는 EOF받습니다.어떤 경우에는 데이터를 읽고 ()의 호출이 성공하면 가정의 '다른'경로에 그렇게되면 후속 전화를 버려야한다.

요약하면 :
읽기
-에 - 측면을 제거 '하는 경우 / 다른'계속은 '동안';
- 쓰기 - 사이드, '동안'을하기 전에는
버퍼 initlialize; '만약 / 다른'이지만 (WriteFile 계속에서 제거 ','동안, 경우).

이 작품으로 이루어져야하더라도, 당신이 그 일을 비동기로 보면 좋을 것.

아서

 

Welcome to EDABoard.com

Sponsor

Back
Top