2016-07-17 2 views
1

안녕하세요 저는 Windows 컴퓨터에 연결된 xbees와의 인터페이스를 시도하고 있습니다. AT 모드에서 코디네이터를 통해 최종 장치에 쓸 수 있으며 내 XCTU 콘솔로 스트리밍 된 데이터를 볼 수 있습니다. 그러나 들어오는 데이터를 읽는 방법을 이해하는 데 문제가 있습니다.직렬 포트에서 바이트 읽기 C++ Windows

현재 사용중인 코드는 아래에 있습니다. 근본적으로 중요한 부분은 마지막 5 줄 정도 (특히 읽기 및 쓰기 파일 행)이지만, 모든 내용을 철저히 게시하려고합니다. com 포트를 통해 xbee로 보낸 데이터를 어떻게 읽습니까? 보낸 데이터는 단순히 0x00-0x0F입니다.

내가 읽은 파일의 기능을 잘못 이해하고 있다고 생각합니다. 나는 xbee에 보내는 비트가 한 번에 하나씩 읽을 수있는 버퍼에 저장되어 있다고 가정합니다. 그 맞습니까? 또는 데이터를 읽는 것보다 전체 바이트를 쓸 필요가 있습니까? 실망 스럽지만 열차가 혼란 스럽다면 직렬 통신을 처음 접했습니다. 어떤 도움을 주셔서 감사합니다. 명세서에서

#include <cstdlib> 
#include <windows.h> 
#include <iostream> 
using namespace std; 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    int n = 8; // Amount of Bytes to Read 
    HANDLE hSerial; 
    HANDLE hSerial2; 
    hSerial = CreateFile("COM3",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);// dont need to GENERIC _ WRITE 
    hSerial2 = CreateFile("COM4",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);// dont need to GENERIC _ WRITE 
    if(hSerial==INVALID_HANDLE_VALUE || hSerial2==INVALID_HANDLE_VALUE){ 
     if(GetLastError()==ERROR_FILE_NOT_FOUND){ 
//serial port does not exist. Inform user. 
    cout << "Serial port error, does not exist" << endl; 
    } 
//some other error occurred. Inform user. 
    cout << "Serial port probably in use" << endl; 
    } 

    DCB dcbSerialParams = {0}; 
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams); 
    if (!GetCommState(hSerial, &dcbSerialParams)) { 
     cout << "error getting state" << endl; 
    } 
    dcbSerialParams.BaudRate=CBR_9600; 
    dcbSerialParams.ByteSize=8; 
    dcbSerialParams.StopBits=ONESTOPBIT; 
    dcbSerialParams.Parity=NOPARITY; 
    if(!SetCommState(hSerial, &dcbSerialParams)){ 
     cout << "error setting serial port state" << endl; 

    } 

    COMMTIMEOUTS timeouts = {0}; 

    timeouts.ReadIntervalTimeout = 50; 
    timeouts.ReadTotalTimeoutConstant = 50; 
    timeouts.ReadTotalTimeoutMultiplier =10; 
    timeouts.WriteTotalTimeoutConstant = 50; 
    timeouts.WriteTotalTimeoutMultiplier = 10; 

    if (!SetCommTimeouts(hSerial, &timeouts)){ 
     cout << "Error occurred" << endl; 
    } 

    DWORD dwBytesWritten = 0; 
    DWORD dwBytesRead = 0; 
    unsigned char oneChar; 
    for (int i=0; i<16; i++) 
     { 
      oneChar=0x00+i; 
      WriteFile(hSerial, (LPCVOID)&oneChar, 1, &dwBytesWritten, NULL); 
      ReadFile (hSerial2, &oneChar, 1, &dwBytesRead, NULL); // what I tried to do, just outputs white space 
     } 

    CloseHandle(hSerial); 



    return 0; 
} 

답변

0

:

ReadFile (hSerial2, &oneChar, 1, &dwBytesRead, NULL); 

당신은 당신이 실제로 바이트를 읽을 수 있는지 확인하기 위해 dwBytesRead의 값을 확인해야합니다. 연결의 한 쪽에서는 매초마다 바이트를 보내는 간단한 프로그램을 원할 수도 있습니다. 다른 끝에서 사용 가능한 바이트를 확인하고 들어오는대로 덤프하려고합니다.

프로그램에서 발생할 수있는 현상은 짧은 시간 내에 짧은 시간 내에 송신 직렬 버퍼를 채우고 오래 기다리지 않고 모든 데이터를 읽을 수있을만큼 충분하며, 대기열에있는 데이터를 보내기 전에 루프를 종료하고 직렬 포트를 닫아야합니다.

COMSTAT stat; 

if (ClearCommError(hCom, NULL, &stat)) 
{ 
    printf("%u bytes in outbound queue\n", (unsigned int) stat.cbOutQue); 
} 

를 그리고이 전송 완료되기 전에 당신이 핸들을 닫는 있는지 여부 : 예를 들어, CloseHandle() 호출하기 전에 쓰기, 당신은 추가 할 수 있습니다.

관련 문제