GENERIC_READ,0,NULL,OPEN_EXISTING,...

问题描述 投票:1回答:1
Why do you use
#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";

    }
}

after releasing it?

will return -1 (
winapi
1个回答
7
投票

, so you lose Information when storing the return value of hDC in

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

GetPixel. You should store the complete CLR_INVALID and send 在通过串行通信发送数据的部分,它没有以GetPixel(hDC, x, y)的方式发送数据,而是只发送"-1 "的值。我想这是因为char只适用于小整数,而我给出的输出是一个非常非常长的数字。我试着把它改成long int,但我还是得到同样的结果。它只发送"-1"。我想解决的办法可能是在发送数据之前将char转换为long int或者long int转换为char,但是我不知道怎么做。

COLORREF char#include GetPixel #include char data #include COLORREF 使用命名空间std; HANDLE hPort = CreateFile("COM2", GENERIC_WRITEreceive它的所有字节(所以sendreceive)。sizeof(COLORREF) 字节)。)

同时要注意字节顺序。如果你要在两台机器之间传输多字节数据,那么你必须保证两台机器对字节的顺序达成一致。例如,如果一台机器是小恩迪安,另一台是大恩迪安,那么它们存储的是 COLORREF 在内存中具有不同的字节顺序。一种是在内存中存储COLORREF 0x00BBGGRR,作为 { 0, 0xbb, 0xgg, 0xrr } 而另一个则是将其存储为 { 0xrr, 0xgg, 0xbb, 0 }. 因此,你需要定义一个传输字节顺序,双方使用独立于主机字节顺序。如果你不想发明新的轮子,你可以看看网络字节顺序,然后重用它。Socket API提供了一些函数,比如 ntohlhtonl 帮助您将主机字节顺序转换为网络字节顺序,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.