2013-04-24 233 views
1
#include <iostream> 
#include <Windows.h> 
#include <string> 
using namespace std; 


HANDLE hPort = CreateFile("COM2", 
GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
DCB dcb; 

bool writebyte(char*data) 
{ 
    DWORD byteswritten; 
    if (!GetCommState(hPort,&dcb)) 
    { 
     printf("\nSerial port can't be open\n"); 
     return false; 
    } 

    dcb.BaudRate = CBR_9600; 
    dcb.ByteSize = 8; 
    dcb.Parity = NOPARITY; 
    dcb.StopBits = ONESTOPBIT; 

    if (!SetCommState(hPort,&dcb)) 
     return false; 

    bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL); 

    return retVal; 
} 

int ReadByte() 
{ 

    int Val; 
    BYTE Byte; 
    DWORD dwBytesTransferred; 
    DWORD dwCommModemStatus; 
    if (!GetCommState(hPort,&dcb)) 
    return 0; 

    SetCommMask(hPort,EV_RXCHAR | EV_ERR); 
    WaitCommEvent (hPort,&dwCommModemStatus,0); 
    if (dwCommModemStatus & EV_RXCHAR) 
    ReadFile (hPort,&Byte,1,&dwBytesTransferred,0); 
    Val = Byte; 
    return Val; 
} 

int main() { 

    POINT p; 
    int x; 
    int y; 
    int z; 


    while(0==0){ 
    GetCursorPos(&p); 
    x = p.x; 
    y = p.y; 
    HDC hDC; 

    hDC = GetDC(NULL); 

    cin >> z; 
    cout << GetPixel(hDC, x, y) << endl; 
    Sleep(z); 
    ReleaseDC(NULL, hDC); 

    char data = GetPixel(hDC, x, y); 
     if (writebyte(&data)) 
     cout <<" DATA SENT.. " << (int)data<< "\n"; 

    } 
} 

在通過串行通訊發送數據的部分,而不是將數據作爲GetPixel(hDC,x,y)發送,它只發送值「-1」。我認爲這是因爲字符只適用於小整數,而我給出的輸出是非常長的數字。我試圖將它改爲long int,但我仍然得到相同的結果。它只發送「-1」。我認爲解決方案可能會在發送數據之前將char轉換爲long int或long int char,但我不知道如何......有人可以幫助我嗎?如何將long int轉換爲char

+0

GetPixel返回一個COLORREF,不要假裝它是一個字符。當你嘗試發送一個大整數作爲單個字節時,你期望發生什麼? – john 2013-04-24 15:19:46

+0

由於COLORREF是4個字節,所以您需要調用writebyte 4次才能發送它。 – vipw 2013-04-24 15:22:22

+0

@wipw可能更喜歡重寫writebyte,以便它可以發送多個字節 – john 2013-04-24 15:23:56

回答

7

爲什麼在發佈後使​​用hDC?

ReleaseDC(NULL, hDC); 
char data = GetPixel(hDC, x, y); 

GetPixel在出現錯誤的情況下(見MSDN)返回-1(CLR_INVALID)。

而且,順便說一句,一個COLORREF不是char,所以在char data存儲GetPixel返回值當你失去信息。您應該存儲完整的COLORREF併發送/接收所有的字節(因此發送/接收sizeof(COLORREF)字節)。

也請注意字節順序。如果您要在兩臺機器間傳輸多字節數據,則必須確保兩個字節的順序一致。如果例如一臺機器是小端和另一臺大端,那麼它們在存儲器中以不同的字節順序存儲COLORREF。一種是將COLORREF 0x00BBGGRR作爲{ 0, 0xbb, 0xgg, 0xrr }存儲在內存中,而另一種將其存儲爲{ 0xrr, 0xgg, 0xbb, 0 }。所以你需要定義一個傳輸字節順序,雙方使用它們的主機字節順序無關。如果你不想發明新的輪子,你可以看看網絡字節順序並重新使用它。套接字API提供了一些功能,如ntohlhtonl,它們可幫助您將主機字節順序轉換爲網絡字節順序,反之亦然。

+0

現在,我已經查看了代碼,我想我真的很愚蠢,甚至不會問這個問題..哈哈..不管怎樣,謝謝你們.. – user2201682 2013-04-24 16:11:49

+0

@ user2201682當你沒有看到明顯的(bug)時,我們都不知道這些情況嗎? :-)如果您測試了我的建議並認爲我的帖子回答了您的問題,請接受它。 – 2013-04-24 16:15:03