1

我想出了一些从游戏中读取角色统计数据的代码。这些值存储在数据类型的变量中int

int HPvalue, MPvalue, TPvalue;

现在我需要做的就是将这些值从COM串行端口中取出,以便 Arduino 可以读取它们。

我在网上找到了一些串行示例,但似乎每当我发送我的值时都会发送超过一个字节。

我在 Arduino 上运行了一些代码,它从串行端口读取值并根据该值打开或关闭 LED。

当我使用示例串行代码发送一个值时,LED 会切换两次,而不是切换到一种或另一种状态。当我用腻子发送值时,Led 会正确响应。也就是说。大于 5 的值打开,小于 5 的值关闭。这就是让我认为计算机一次发送多个字节的原因。这是代码。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <atlstr.h>

using namespace std;

bool WriteComPort(CString PortSpecifier, CString data);


int _tmain(int argc, _TCHAR* argv[])
{
    DWORD HPaddress = 0x046B670C;
    DWORD MPaddress = 0x043609B8;
    DWORD TPaddress = 0x043609BC;
    int HPvalue, MPvalue, TPvalue;

    DWORD pid;
    HWND hwnd;


    hwnd = FindWindow(NULL,L"EvelynofHades");
    if(!hwnd)
    {
        cout <<"Window not found!\n";
        cin.get();
    }
    else 
    {   
        cout <<"Found Window!\n";

        GetWindowThreadProcessId(hwnd,&pid);
        cout << pid;

        HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pid);


        if(!phandle)
        {
            cout <<"Could not get Handle!\n";
            cin.get();
        }
        else
        {

            while(1)
            {
                ReadProcessMemory(phandle,(void*)HPaddress,&HPvalue,sizeof(HPvalue),0);
                ReadProcessMemory(phandle,(void*)MPaddress,&MPvalue,sizeof(MPvalue),0);
                ReadProcessMemory(phandle,(void*)TPaddress,&TPvalue,sizeof(TPvalue),0);
                cout << HPvalue << " " << MPvalue << " " << TPvalue << " " << "\n";
                CHAR on = 6;
                WriteComPort("COM3", on);
                Sleep(3000);
                CHAR off = 5;
                WriteComPort("COM3", off);
                Sleep(3000);
            }
            return 0;
        }
    }
}


bool WriteComPort(CString PortSpecifier, CString data) 
{ 
    DCB dcb; 
    DWORD byteswritten; 
    HANDLE hPort = CreateFile(PortSpecifier, 
                              GENERIC_WRITE, 
                              0, 
                              NULL, 
                              OPEN_EXISTING, 
                              0, 
                              NULL 
                   ); 
    if (!GetCommState(hPort,&dcb)) 
        return false; 
    dcb.BaudRate = CBR_9600; //9600 Baud 
    dcb.ByteSize = 8; //8 data bits 
    dcb.Parity = NOPARITY; //no parity 
    dcb.StopBits = ONESTOPBIT; //1 stop 
    if (!SetCommState(hPort,&dcb)) 
        return false; 
    bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL); 
    CloseHandle(hPort); //close the handle 
    return retVal; 
}

我可能为我的应用程序错误地实现了串行。希望有人可以帮助我解决这个问题。

4

2 回答 2

1

我认为您的错误是每次要写入一个字节时都打开/关闭端口:

每次重新打开串行端口时,重新启动 Arduino,因此 LED 熄灭,然后写入新字节,arduino 已唤醒,读取缓冲区并且 LED 亮起。

一旦你的串行连接打开,在你的函数中保留对目标文件的引用,并将其作为参数_tmain()返回给它以从中写入/读取内容。并在您退出该功能WriteComPort()时很好地关闭串行端口。_tmain()

于 2013-06-19T09:08:21.187 回答
-2

WriteFile 肯定会在每次调用时只写入一个字节,您可以通过查看调用后写入的字节数来确认这一点。

我想知道您是否正在编写您打算编写的内容,因为当您似乎打算编写一个 int 时,CString 是一种奇怪的类型选择。您是要发送二进制 6(您是)还是字符 '6' ?

于 2013-06-19T03:24:48.267 回答