C ++ / CLI: ни один метод вывода на консоль не работает до определенного момента в моем коде, после того, как он работает нормально - PullRequest
0 голосов
/ 11 октября 2018

Насколько я могу судить, большинство аналогичных вопросов, задаваемых в Интернете, решаются либо путем изменения приложения с приложения 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 {}
    }
...}
////////////////////////////////////////////////////////////////////////////
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...