1

ゲームからキャラクターの統計情報を読み取るコードを考え出しました。これらの値は、データ型の変数に格納されますint

int HPvalue, MPvalue, TPvalue;

あとは、これらの値をCOMシリアル ポートから取得して、Arduino で読み取れるようにするだけです。

オンラインでいくつかのシリアル例を見つけましたが、値を送信するたびに1バイト以上が送信されるようです。

シリアルポートから値を読み取り、その値に応じて LED をオンまたはオフにする Arduino で実行されているコードがいくつかあります。

サンプルのシリアル コードで値を送信すると、LED は 1 つの状態または別の状態に切り替わるのではなく、2 回トグルします。パテで値を送信すると、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

あなたの間違いは、1バイトを書き込むたびにポートを開閉することだと思います:

シリアルポートを再度開くたびにArduinoを再起動すると、LEDがオフになり、新しいバイトを書き込むと、Arduinoがウェイクアップし、バッファが読み取られ、LEDがオンになります。

シリアル接続を一度開き、_tmain()関数内のオブジェクト ファイルへの参照を保持し、それをパラメーターとして に戻して、そこWriteComPort()から書き込み/読み取りを行います。関数を終了するときは、シリアルポートを適切に閉じ_tmain()ます。

于 2013-06-19T09:08:21.187 に答える
-2

WriteFile は呼び出しごとに 1 バイトだけを書き込むことは間違いなく、呼び出し後に書き込まれたバイトを調べることで確認できます。

CString は int を書き込もうとしているときに使用する型の奇妙な選択であるため、書きたいものを書いているのだろうかと思います。送信しようとしているのはバイナリ 6 (どちらですか) ですか、それとも文字 '6' ですか?

于 2013-06-19T03:24:48.267 に答える