簡體   English   中英

從 Arduino C++ 讀取數據時出現空行

[英]Blank lines when reading data from Arduino C++

我按照指南在這里通過串行接口在 C++ 中連接 arduino。 我包含了這些文件,因為我認為我的文件做了一些更改以使其工作......問題顯示在圖片中:

在此處輸入圖片說明

當我期待:

on
off
on
off
.
.
.

而是跳過一行。 它似乎沒有跳過寫入(沒有丟失或關閉 - 也按預期在 1 秒后寫入任何一行)。 似乎只是添加了另一行! 我正在嘗試解決從加速度計中輸出大量數據(每 5 毫秒換行一次)並具有這個新行間距的問題,我不知道為什么會這樣。 我想知道這是不是由於行緩沖區? 歡迎任何幫助!

串口.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

串口.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;
}

主程序

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

阿杜諾

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

你應該空終止你的字符串/緩沖區 - 像這樣:

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作為參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM