2013-04-24 232 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