#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";
}
}
Run Code Online (Sandbox Code Playgroud)
在通过串行通信发送数据的部分,而不是将数据作为GetPixel(hDC,x,y)发送,它只发送值"-1".我以为这是因为char只用于小整数,而我输出的输出是一个非常长的数字.我试图将它改为long int但我仍然得到相同的结果.它只发送"-1".我认为解决方案可能是在发送数据之前将char转换为long int或long int to char但我不知道如何...有人可以帮助我吗?
为什么在发布后使用hDC?
ReleaseDC(NULL, hDC);
char data = GetPixel(hDC, x, y);
Run Code Online (Sandbox Code Playgroud)
如果出现错误,GetPixel将返回-1(CLR_INVALID)(请参阅MSDN).
顺便说一下,a COLORREF
不是a char
,所以在存储GetPixel
in 的返回值时会丢失信息char data
.您应该存储完整COLORREF
并发送/接收所有字节(因此发送/接收sizeof(COLORREF)
字节).
还要注意字节顺序.如果要在两台计算机之间传输多字节数据,则必须确保两者都同意字节的顺序.例如,如果一台机器是小端和另一台大端,那么它们COLORREF
在内存中以不同的字节顺序存储.一种是将COLORREF 0x00BBGGRR存储在内存中,{ 0, 0xbb, 0xgg, 0xrr }
而另一种是将其存储为{ 0xrr, 0xgg, 0xbb, 0 }
.因此,您需要定义一个发送字节顺序,双方使用它们的主机字节顺序.如果您不想发明新的轮子,可以查看网络字节顺序并重用它.套接字API为您提供了一些功能ntohl
,htonl
它们可以帮助您从主机字节顺序转换为网络字节顺序,反之亦然.
归档时间: |
|
查看次数: |
304 次 |
最近记录: |