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" のみを送信します。char は小さな整数のみを対象としており、出力は非常に長い数値であると考えていました。long int に変更しようとしましたが、それでも同じ結果が得られます。「-1」のみを送信すること。解決策は、データを送信する前に char を long int に、または long int を char に変換することだと思いましたが、方法がわかりません..誰かが私を助けてくれますか?

4

1 に答える 1

7

なぜhDCリリース後に使用するのですか?

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

GetPixelCLR_INVALIDエラーの場合は-1 ( ) を返します ( MSDNを参照)。

ちなみに、 aCOLORREFは a ではないので、 incharの戻り値を格納すると Information が失われます。完全なデータを格納し、そのすべてのバイトを送受信する必要があります (したがって、バイトを送受信します)。GetPixelchar dataCOLORREFsizeof(COLORREF)

また、バイトオーダーにも注意してください。2 台のマシン間でマルチバイト データを転送する場合は、両方のマシンでバイトの順序が一致していることを確認する必要があります。たとえば、1 台のマシンがリトルエンディアンで、もう 1 台がビッグ エンディアンの場合、それらCOLORREFは異なるバイト順でメモリに格納されます。1 つは COLORREF 0x00BBGGRR をメモリに格納し、もう 1 つは として{ 0, 0xbb, 0xgg, 0xrr }格納してい{ 0xrr, 0xgg, 0xbb, 0 }ます。そのため、ホストのバイト順とは無関係に両側で使用する送信バイト順を定義する必要があります。新しい車輪を発明したくない場合は、ネットワーク バイト オーダーを調べて、それを再利用できます。ソケット API は、ホスト バイト オーダーからネットワーク バイト オーダーへの変換、およびその逆の変換に役立つntohlおよびのような関数を提供します。htonl

于 2013-04-24T15:20:51.267 に答える