Я делаю приложение, которое перемещает эту мышь через модуль джойстика.Я использую C++
, потому что моя доска не поддерживает Mouse.move
из Arduino IDE.
Я столкнулся с проблемой, когда, если я нажму джойстик полностью туда, где X
значение равно 1024
командная консоль, которая выводит значения, прекращает печать вообще, пустые строки просто приостанавливаются.Но если я смотрю на Serial-монитор из Arduino IDE, я вижу, что он непрерывно печатает 1024, 513
, напечатанный как следует.
Я обнаруживаю, что когда я делаю это со значением Y
, он печатает 1024
ви Arduino IDE и C++
Serial Monitors просто отлично.например, 513, 1024
Я довольно новичок в использовании C++
с Arduino, это может быть что-то простое.
JoystickModule.ino (код Arduino)
#define BAUD 9600
const int SW_pin = 2;
const int X_pin = 0;
const int Y_pin = 1;
void setup(){
Serial.begin(BAUD);
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
}
void loop(){
Serial.println((String)analogRead(X_pin) + "," + (String)analogRead(Y_pin));
delay(100);
}
main.cpp
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <Windows.h>
#include "SerialPort.h"
#include <vector>
using namespace std;
//portname must contain these backslashes, and remember to replace the following com port
char *port_name = "\\\\.\\COM4";
//String for incoming data
char incomingData[MAX_DATA_LENGTH];
int main() {
SerialPort arduino(port_name);
if (arduino.isConnected()) cout << "Connection Established" << endl;
else cout << "ERROR, check port name";
while (arduino.isConnected()) {
int read_result = arduino.readSerialPort(incomingData, MAX_DATA_LENGTH);
//store into array for later use by splitting by "," e.g. "513, 508"
//result[0] will store the X val and result[1] will store the Y val
string result[2];
int xVal = 0;
int yVal = 0;
string data = (string)incomingData;
size_t pos = data.find(",");
result[0] = data.substr(0, pos);
result[1] = data.substr(pos + 1, 4);
cout << data << endl;
Sleep(100);
}
return 0;
}
Заголовочные файлы и другие ресурсы из этого руководства
SerialPort.h
#pragma once
#ifndef SERIALPORT_H
#define SERIALPORT_H
#define ARDUINO_WAIT_TIME 2000
#define MAX_DATA_LENGTH 255
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
class SerialPort
{
private:
HANDLE handler;
bool connected;
COMSTAT status;
DWORD errors;
public:
SerialPort(char *portName);
~SerialPort();
int readSerialPort(char *buffer, unsigned int buf_size);
bool writeSerialPort(char *buffer, unsigned int buf_size);
bool isConnected();
};
#endif // SERIALPORT_H
SerialPort.cpp
#include "stdafx.h"
#include "SerialPort.h"
SerialPort::SerialPort(char *portName)
{
this->connected = false;
this->handler = CreateFileA(static_cast<LPCSTR>(portName),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (this->handler == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
printf("ERROR: Handle was not attached. Reason: %s not available\n", portName);
}
else
{
printf("ERROR!!!");
}
}
else {
DCB dcbSerialParameters = { 0 };
if (!GetCommState(this->handler, &dcbSerialParameters)) {
printf("failed to get current serial parameters");
}
else {
dcbSerialParameters.BaudRate = CBR_9600;
dcbSerialParameters.ByteSize = 8;
dcbSerialParameters.StopBits = ONESTOPBIT;
dcbSerialParameters.Parity = NOPARITY;
dcbSerialParameters.fDtrControl = DTR_CONTROL_ENABLE;
if (!SetCommState(handler, &dcbSerialParameters))
{
printf("ALERT: could not set Serial port parameters\n");
}
else {
this->connected = true;
PurgeComm(this->handler, PURGE_RXCLEAR | PURGE_TXCLEAR);
Sleep(ARDUINO_WAIT_TIME);
}
}
}
}
SerialPort::~SerialPort()
{
if (this->connected) {
this->connected = false;
CloseHandle(this->handler);
}
}
int SerialPort::readSerialPort(char *buffer, unsigned int buf_size)
{
DWORD bytesRead;
unsigned int toRead;
ClearCommError(this->handler, &this->errors, &this->status);
if (this->status.cbInQue > 0) {
if (this->status.cbInQue > buf_size) {
toRead = buf_size;
}
else toRead = this->status.cbInQue;
}
if (ReadFile(this->handler, buffer, toRead, &bytesRead, NULL)) return bytesRead;
return 0;
}
bool SerialPort::writeSerialPort(char *buffer, unsigned int buf_size)
{
DWORD bytesSend;
if (!WriteFile(this->handler, (void*)buffer, buf_size, &bytesSend, 0)) {
ClearCommError(this->handler, &this->errors, &this->status);
return false;
}
else return true;
}
bool SerialPort::isConnected()
{
return this->connected;
}
Заранее спасибо.