2011-01-20 3 views
0

아래에 쓰여진 것은 시리얼 포트에 액세스하기 위해 작성한 코드입니다. 그 포트에 부착 된 것은 데이터를 보내고 보드 속도가 57600 인 마이크로 컨트롤러입니다. 코드를 한 번 실행하고 결과를 얻었지만 창을 닫은 후 컴퓨터가 멈 췄습니다. Ctrl + Alt + Del 키를 눌렀는데 프로세스 아래에서 프로그램이 실행 중임을 확인했습니다. 나는 그것을 닫을 수 없다.Windows 32bit 시리얼 통신을 사용할 때 프로그램이 멈 춥니 다

int n = 20; 
char szBuff[20 + 1] = {0}; 

HANDLE hSerial; 
DCB dcbSerialParams = {0}; 
COMMTIMEOUTS timeouts={0}; 
DWORD dwBytesRead = 20; 

dcbSerialParams.DCBlength=sizeof(DCB); 

hSerial = CreateFile("COM5", 
       GENERIC_READ | GENERIC_WRITE, 
       0, 
       0, 
       OPEN_EXISTING, 
       FILE_ATTRIBUTE_NORMAL, 
       0); 


if(hSerial==INVALID_HANDLE_VALUE) 
{ 
    if(GetLastError()==ERROR_FILE_NOT_FOUND) 
    { 
    puts ("cannot open port!"); 
    } 

    puts ("invalid handle value!");         
} 

if (!GetCommState(hSerial, &dcbSerialParams)) 
{ 
    puts ("error getting state"); 
} 

dcbSerialParams.BaudRate=CBR_57600; 
dcbSerialParams.ByteSize=8; 
dcbSerialParams.StopBits=ONESTOPBIT; 
dcbSerialParams.Parity=NOPARITY; 

if(!SetCommState(hSerial, &dcbSerialParams)) 
{ 
    puts ("error setting port state"); 
} 


while (1) 
{ 

    if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){ 
    puts ("serial read error fail!"); 
    } 

    else 
    { 
    printf ("%s\n" , szBuff); 
    } 

} 
+1

'while 1'을 (를) 사용하고 있습니다. 어떻게 프로그램을 종료 하시겠습니까? – stijn

+0

계속 포트에서 데이터를 계속 읽고 싶습니다. 잘못하고 있다고 가정합니다. 어떻게하면 더 효율적으로 할 수 있는지 말해 줄 수 있어요? – user582485

+0

그 자체가 잘못된 것은 아니지만 프로그램을 중단 할시기를 알려주는 방법이 필요합니다. 예를 들어'puts ("serial read error fail!") 대신'puts ("serial read error fail!"); break;'직렬 장치가 실패하거나 연결이 끊어졌을 때 이미 루프가 종료되어야합니다. – stijn

답변

1

버그가있는 직렬 포트 드라이버처럼 들립니다. Why do some process stay in Task Manager after they've been killed?을 참조하십시오. 프로그램을 종료하면 보류중인 모든 I/O 작업이 취소 될 때까지 사라지지 않습니다.

+0

아마,하지만 그는 포트가 절름발이가 되어도 여전히 읽으 려하고 있습니다 (오류가 발생하면 while 루프에서 빠져 나올 수 없습니다). –

+0

@Tim : 영원히 반복되는 프로그램은 본질적으로 버그가있는 것이 아니라'tail -f '와 같이 강제 종료 될 때 종료되도록 설계 될 수 있습니다. 이 프로그램은 I/O를 차단하고 있기 때문에 100 % CPU를 사용하지 않고 회전합니다. –

+0

동의합니다. 버그가있는 드라이버 일 가능성이 있습니다. 마침내 +1을 추가하여 내 의견과 함께 갈 수있게되었습니다. –

0

while (1) 루프가 발생하면 앱에 일정 유형의 정지를 정의해야합니다.

옵션 1 : 마이크로 컨트롤러는 while 명령을 중단하기 위해 사용하는 종료 명령 또는 문자를 전송해야합니다.

옵션 2 : (1) 대신 몇 가지 유형의 시간 초과.

옵션 3 : 신호를 잡아 당겨 while()을 중단하십시오.

그리고 다른 많은 옵션이 있습니다.

관련 문제