Насколько я могу судить, большинство аналогичных вопросов, задаваемых в Интернете, решаются либо путем изменения приложения с приложения winforms (или другого) на приложение console - мое приложение является console, либо с использованием другого метода вывода информации.например, Trace :: WriteLine - который я протестировал безрезультатно.
Важным моментом является то, что во время цикла while я записываю содержимое последовательного порта на консоль, используя Console :: WriteLine, а затем повторновывод этой информации для проверки «для каждого метода разделения строк на массив».(как показано в нижней части блока кода) При просмотре вывода в консоли отладки для меня очевидно, что ничего не принимается в качестве вывода на консоли, до середины первой итерации «для каждой строки ^ разбиение массива»Метод ".
Я включил 95% кода (весь соответствующий код) вплоть до" для каждого метода разделения строк и массивов ", после чего любой метод записи в консоль работает должным образом.Весь код, который я считаю проблематичным, заключен в косые черты.например, ////////////////////////////////////////////////////////////////////////////////////
code referenced above
////////////////////////////////////////////////////////////////////////////////
Код вопроса:
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <TCHAR.h>
#include <stdlib.h>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <vector>
using namespace System;
using namespace System::IO::Ports;
using namespace System::Globalization;
using namespace System::Diagnostics;
using namespace std;
//Global variable declarations and assignments
const int IPKeyslength = 10;
const int bufferSize = 18;
unsigned char commBuffer[(bufferSize)+1] = { 0 };
vector<double> position(3);
HWND application;
HANDLE myPort;
DWORD dwRead;
BOOL fWaitingOnRead = FALSE;
NumberStyles styles = NumberStyles::Float;
////////////////////////////////////////////////////////////////////////////
//Functions / Methods / Classes
static void DisplayStopwatchProperties()
{
if (Stopwatch::IsHighResolution)
Console::WriteLine("Stopwatch using system's performance counter capable
of nanosecond precision");
else
Console::WriteLine("Stopwatch using DateTime class precision");
Int64 frequency = Stopwatch::Frequency;
Console::WriteLine("Clock frequency in ticks per second = {0}", frequency);
Int64 nanoPerTick = (1000L * 1000L * 1000L) / frequency;
Console::WriteLine("Clock is accurate within {0} nanoseconds", nanoPerTick);
Int64 milliPerTick = nanoPerTick / 1000000;
Console::WriteLine("Therefore clock read in milliseconds is {0}",
milliPerTick);
}
////////////////////////////////////////////////////////////////////////////
//MAIN THREAD
int main(cli::array<System::String ^> ^args)
{
//ALL SETUP CODE (to be run once) NEEDS TO BE BEFORE "while()"
STATEMENT
//Declarations that are local to main thread
double accelX = 0;
double accelY = 0;
double accelZ = 0;
double gyroX = 0;
double gyroY = 0;
double gyroZ = 0;
double magX = 0;
double magY = 0;
double magZ = 0;
Stopwatch clock;
DisplayStopwatchProperties();
//Important - information from DisplayStopwatchProperties call is not being
displayed on debug console
clock.Start();
vector<double>::size_type sz = position.size();
String^ delimStr = ", ";
cli::array<wchar_t>^ delimiterChars = delimStr->ToCharArray();
String^ port7Buffer;
//.NET method of serial IO
SerialPort port7("COM7", 115200);
port7.Open();
//This structure is used to create the keyboard input events
INPUT IPkeys[IPKeyslength];
INPUT IPesc;
//Get handle of app and move it to the front
LockSetForegroundWindow(LSFW_UNLOCK);
AllowSetForegroundWindow(ASFW_ANY);
application = FindWindow(_T(...), _T(...));
//long pause buffer
Sleep(100);
if (SetForegroundWindow(application) == FALSE)
{
cout << "Window was not found" << endl;
return 0;
}
cout << "Window was found" << endl;
//To unpause game: setup generic keyboard event and press "ESC"
IPesc.type = INPUT_KEYBOARD;
IPesc.ki.time = 0;
IPesc.ki.dwExtraInfo = 0;
IPesc.ki.wVk = 0x1B;
IPesc.ki.dwFlags = 0;
SendInput(1, &IPesc, sizeof(INPUT));
//Pause buffer
Sleep(30);
//Release "ESC" key
IPesc.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &IPesc, sizeof(INPUT));
////////////////////////////////////////////////////////////////////////////
//Sensor Loop
//-executes until the game is closed (or game is paused - for testing
purposes)
while (!(GetKeyState(0x1B) & 0x8000) && (application ==
GetForegroundWindow()))
{
//.NET framework replacement for ReadFile()
port7Buffer = port7.ReadLine();
Console::WriteLine();
//Value checking
Console::WriteLine(port7Buffer);
//Method for printing and storing data from .ReadExisting()
int count = 0;
cli::array<String^> ^StringArray = port7Buffer-
>Split(delimiterChars,StringSplitOptions::RemoveEmptyEntries);
for each(String^ temp in StringArray)
{
temp = temp->Trim();
Console::WriteLine(temp);
count++;
if (count == 1) {}
else if (count == 2)
accelX = Convert::ToDouble(temp);
else if (count == 3)
accelY = Convert::ToDouble(temp);
else if (count == 4)
accelZ = Convert::ToDouble(temp);
else if (count == 5)
gyroX = Convert::ToDouble(temp);
else if (count == 6)
gyroY = Convert::ToDouble(temp);
else if (count == 7)
gyroZ = Convert::ToDouble(temp);
else if (count == 8)
magX = Convert::ToDouble(temp);
else if (count == 9)
magY = Convert::ToDouble(temp);
else if (count == 10)
magZ = Convert::ToDouble(temp);
else {}
}
...}
////////////////////////////////////////////////////////////////////////////