Пустые строки при чтении данных из Arduino C ++ - PullRequest
0 голосов
/ 01 апреля 2020

Я следовал руководству по интерфейсу Arduino в C ++ через последовательный здесь . Я включил файлы, так как думаю, что мои немного изменились, чтобы заставить его работать ... Проблема показана на рисунке:

enter image description here

, когда я Я ожидаю:

on
off
on
off
.
.
.

Но вместо этого пропускает строку. Похоже, он не пропускает запись (без пропусков при включении или выключении - также либо запись строки после 1 se c, как и ожидалось) Кажется, просто добавить еще одну строку! Я пытаюсь решить проблему с большим количеством данных (новая строка каждые 5 мс), выходящих из акселерометра и с этим новым межстрочным интервалом, который я понятия не имею, почему это происходит. Интересно, это из-за буфера строки? Любая помощь приветствуется!

SerialPort.h

#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(const 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 "SerialPort.h"

SerialPort::SerialPort(const 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_115200;
            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 = 0;

    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;
}

Main. cpp

#include <iostream>
#include "SerialPort.h"

#define MAX_DATA_LENGTH 255

const char* portName = "\\\\.\\COM3";
SerialPort* arduino;

char receivedString[MAX_DATA_LENGTH];

char output[MAX_DATA_LENGTH];

int main(void){
    arduino = new SerialPort(portName);
    while (arduino->isConnected()) {
        int hasRead = arduino->readSerialPort(receivedString, MAX_DATA_LENGTH);
        if (hasRead) std::cout << receivedString;
        //else std::cerr << "Error occured reading data" << "\n";
        Sleep(1000);
    }
}

Arduino

#define BAUD 115200
void setup() {
  Serial.begin(BAUD);
}
void loop() {
  Serial.println("on");
  delay(1000);
  Serial.println("off");
  delay(1000);
}

1 Ответ

1 голос
/ 01 апреля 2020

Вы должны завершить строку / буфер нулем - как это:

int main(void){
    arduino = new SerialPort(portName);
    while (arduino->isConnected()) {
        int hasRead = arduino->readSerialPort(receivedString, MAX_DATA_LENGTH - 1);

        receivedString[hasRead] = 0;

        if (hasRead) std::cout << receivedString;
        //else std::cerr << "Error occured reading data" << "\n";
        Sleep(1000);
    }
}

Также обратите внимание на MAX_DATA_LENGTH - 1 в качестве параметра.

...