[英]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.