Я следовал руководству по интерфейсу Arduino в C ++ через последовательный здесь . Я включил файлы, так как думаю, что мои немного изменились, чтобы заставить его работать ... Проблема показана на рисунке:
, когда я Я ожидаю:
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);
}