Visual c++ Visual C++串口输出到ARDUINO

Visual c++ Visual C++串口输出到ARDUINO,visual-c++,serial-port,arduino,Visual C++,Serial Port,Arduino,我想出了一些代码来读取游戏中的角色统计信息。这些值存储在数据类型为int的变量中 现在我需要做的就是从COM串行端口获取这些值,这样Arduino就可以读取它们 我在网上找到了一些串行示例,但似乎每当我发送值时,都会发送多个字节 我在Arduino上运行了一些代码,它从串行端口读取值,并根据该值打开或关闭LED 当我发送带有示例串行代码的值时,LED将切换两次,而不是切换到一种或另一种状态。当我用putty发送值时,Led会正确响应。也就是说。值大于5时打开,值小于等于5时关闭。这就是为什么我认

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

现在我需要做的就是从COM串行端口获取这些值,这样Arduino就可以读取它们

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

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

当我发送带有示例串行代码的值时,LED将切换两次,而不是切换到一种或另一种状态。当我用putty发送值时,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; 
}

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

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


我想知道你是否在写你想写的东西,因为当你似乎想写一个int时,CString是一种奇怪的类型选择。你是想发送二进制6还是字符“6”?

我想你的错误是每次你想写一个字节时就打开/关闭端口:

每次重新打开串行端口时,都会重新启动Arduino,因此LED熄灭,然后写入新字节,Arduino唤醒,读取缓冲区,LED点亮


一旦串行连接打开,将对对象文件的引用保留在_tmain函数中,并将其作为参数返回WriteCompoort,以从中写入/读取内容。并在退出_tmain函数时很好地关闭串行端口。

这应该是一条注释,而不是答案。您是否调试了输出。你的代码有什么变化?你也应该发布arduino代码。我对arduino平台不是很熟悉。是什么让你说每次PC软件打开串口时Arduino都会重新启动?那是因为它是这样构建的!虽然并非所有arduinos都是如此,但我认为基于atmega32u4的arduinos不受此限制。这样,当您打开串行连接时,arduino将通过引导加载程序,并使arduino闪光器avr dude能够上载新固件。arduino能否真正检测到PC端软件何时打开端口?如果这是真的RS-232,我想需要在COM端口上加载一个自定义驱动程序。即使是板上或非板上的USB-to-RS232芯片,我也不知道有哪个现成的芯片,其供应商提供的驱动程序能够实现这一点。如果这是真的,我会很好奇他们是怎么做到的。这都是开源的,对吗?这是一个硬件技巧:cf:ATmega168通过将其复位引脚脉冲至GND进行复位。Arduino IDE本身无法产生这样的脉冲,但通过将DTR线设置为低电平,并在pcb上添加一个标有红色的电容器R3,复位引脚被吸至低电平,直到电容器通过内部上拉电阻器和R1充电-这将重置芯片。有趣的是,我肯定不会这么做。最重要的是?FTDI芯片的GPIO似乎是控制复位线的更好选择。无论如何,谢谢你提供的信息。
#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; 
}