Печать Arduino Serial останавливается при выводе определенного значения из модуля джойстика - PullRequest
0 голосов
/ 01 июля 2019

Я делаю приложение, которое перемещает эту мышь через модуль джойстика.Я использую 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;
}

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...