2011-01-20 5 views
0

내가 마이크로 컨트롤러는 내가이 형식으로 데이터를 전송하고 `제대로 WINDOWS.H에

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 

int main (void) 
{ 

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

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

    dcbSerialParams.DCBlength=sizeof(DCB); 

    hSerial = CreateFile("COM4", 
        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!"); 
     return; 
     } 

     puts ("invalid handle value!");  
     return;        
    } 

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

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

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

    timeouts.ReadIntervalTimeout = 30; 
    timeouts.ReadTotalTimeoutMultiplier = 100; 
    timeouts.ReadTotalTimeoutConstant = 100; 

    if (!SetCommTimeouts(hSerial, &timeouts)) 
    { 
     puts ("timeouts setting fail!"); 
    } 

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

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


    getch();  
    return 0; 

} 
` 

아래의 코드를 사용하여 읽고있다 내 USB 포트에 연결 한을 시리얼 창을 사용하여 데이터 문자열을 읽을 수 없습니다 ABC $ 다음에 개행 문자가옵니다. 그래서 7 (또는 개행을 포함한 8) 바이트가 맞습니까? 나는 모든 데이터 문자열을 성공적으로 읽을 수 있도록 readfile의 3 번째 인수를 20으로 설정했습니다. 7 바이트보다 큽니다. 그러나 때로는 몇자를 놓치는 경우가 있습니다. $ A.B.C $를 읽는 대신 한 줄에 $ A.B.C를 그리고 그 줄 뒤에 $ (숨겨진 '\ n')을 읽습니다. 내가 어떻게 고칠 수 있니?

답변

1

이것은 정상입니다. 수신 버퍼에 적어도 하나의 바이트가 포함되어 있으면 버퍼에있는 모든 것을 다시 가져옵니다. 어느 것이 일반적이지만 당신이 기대하는 것의 일부분이지만 시리얼 포트는 아주 느립니다. 당신은 완전한 응답을 얻을 때까지 독서를 계속해야 할 것입니다.

+0

내 전체 문자열을 읽는 방법을 알려줄 수있는 의견이 있으십니까? 그리고 죄송합니다. "수신 버퍼에 적어도 하나의 바이트가 들어 있으면 버퍼에있는 모든 것을 다시 가져올 것입니다." . 한 번에 7 바이트 인 전체 문자열을 때때로 얻습니다. – user582485

+0

예, 가끔. 버퍼에있는 것이 무엇이든, 읽는 것이 더 느리면 더 많은 것이 있습니다. 특히 당신이 디버깅 할 때. 루프를 사용하고 줄 바꿈이 나타날 때까지 계속 읽고 읽고 추가하십시오. –

+0

의사 코드를 입력해도 괜찮습니까? 그것은 내게 매우 도움이 될 것입니다 – user582485

0

답변에 추가하기 만하면 어떤 유형의 시간 제한을 사용하십시오. 그렇지 않으면 절대 오지 않는 문자 대기를 차단할 것입니다.

한 옵션이 바이트 당 바이트를 읽은 다음 마지막 '$'또는 '\ n'이 전체 문자열을 받았음을 알기를 기다리는 것일 수 있습니다.