2016-07-17 19 views
1

ちょっと私は私のWindowsマシンに接続しているxbeesとのインターフェースを試みています。 ATモードのコーディネータを介してエンドデバイスに書き込むことができ、XCTUコンソールにストリーミングされたデータを見ることができます。しかし、私はそのデータを読む方法を理解するのに苦労しています。シリアルポートからバイトを読むC++ Windows

現在使用しているコードは次のとおりです。本質的に重要な部分は最後の5行程度です(具体的には、読み書きのファイル行)が、私はそれを徹底的に投稿するつもりです。 comポート経由でxbeeに送信したデータを読み取るにはどうすればよいですか?送信したデータは単純に0x00-0x0Fでした。

私は読んだファイルの機能を誤解していると思います。私はxbeeに送るビットは、一度に1つずつ読むことができるバッファに格納されていると仮定しています。あれは正しいですか?または、利用可能なデータを読み込むよりもバイト全体を書き込む必要がありますか?私の列車が混乱している場合は申し訳ありませんが、私はシリアル通信にかなり新しいです。どんな助けもありがとうございます。あなたの声明の中で

#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()呼び出しの前に書き、あなたが追加することができます。

関連する問題