Iterating data on C++ Visual Studio

[Edit]
I have some data from arduino and want to show it at C++ CLR Windows form visual studio 2019. Everything is good but this is the problem. Oh ya btw I'm newbie at C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private: System::Void Button1_Click(System::Object^ sender, System::EventArgs^ e)
	{
		//serialPort1->WriteLine(textBox1->Text);
		//serialPort1->WriteLine("26");
		textBox1->AppendText("TOOLCODE");
		array<int>^ numbers = gcnew array<int> {0, 1, 2, 3};
		for (int i = 0; i < 4; i++)
		{
			textBox2->Text += numbers[i].ToString() + " ";
		}
	}

	private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
	{
		serialPort1->WriteLine(textBox2->Text);
		textBox4->Text += mStr + "";
	}


I need output from array {0,1,2,3} so read on winform. The data was correctly read but the output is iterate and random order.

I wanna ask how can I just print out the data into textBox with the correct order and stop when the data ends, no looping.
Last edited on
Hello mechatronicb,


PLEASE ALWAYS USE CODE TAGS (the <> formatting button), to the right of this box, when posting code.

Along with the proper indenting it makes it easier to read your code and also easier to respond to your post.

http://www.cplusplus.com/articles/jEywvCM9/
http://www.cplusplus.com/articles/z13hAqkS/

Hint: You can edit your post, highlight your code and press the <> formatting button. This will not automatically indent your code. That part is up to you.

You can use the preview button at the bottom to see how it looks.

I found the second link to be the most help.


Based on the syntax of your code I am not sure what language it is or what type of C++ it is.

Before the for loop it looks like you create an array called "numbers", but what does it contain?

I would try putting a break point on the for loop and check to see what "numbers contains before executing the for loop.

Note: It is always a good idea to post enough code that can be compiled and tested. AS is I am not sure what to do with it.

Andy
So, what has your problem to do with the provided code?

Where do you read the data and where do you iterate it?
Based on the syntax of your code I am not sure what language it is or what type of C++ it is.


It's MS C++/cli - which is C++ 'changed' so that it can be used with .net as managed code. Really it's a language in itself and should have been called something like 'cplus.net' - which would IMO been much less confusing.

If you see a ^ following a type in what looks like C++, then it's almost certainly C++/cli! The ^ means 'boxed' and is referring to a 'managed .net type'.
Last edited on
I wanna ask how can I just print out the data into textBox with the correct order and stop when the data ends, no looping.

you cannot print blocks of data in c++ without loops. Some languages hide the loops and allow you to print an array directly with one line (they stlll loop, its just hidden in the library much as how strings are really printed one char at a time but the loop is hidden in the cout library), but c++ is not one of them, you must loop. This way you can format it though -- each item can be on one line, or all on the same line, your choice not whatever the language chooses for you.

this should not print in random order, it should be 0,1,2,3
I can't relate the two blocks but it looks like you are writing an array location on a timer (every whatever amount of time, write something) AND writing it in the loop. This may be why the output looks strange. Get rid of the writeline to textbox 2 if you only want the array in order in the text box? Is it writing junk from a serial port? What is on that, are you using a null modem cable or talking to a device?! Or is it dumping the window text to the port (looks more likely, actually)?

Honestly, you may be better off dropping a new text box onto the canvas and talking to it. There may be something else out there talking to text box #2 (its really better to name these things so you understand what should be in each one). You can try to find it and remove it, or just try a new box that you know is clean.

a 'newbie to c++' is going to struggle with this kind of stuff... its not c++, its another language, using a gui framework that is overly complex and confusing, and doing who knows what (where did you get this code?) with the serial ports, and more. Its not beginner level stuff. You may want to go learn c++ first, then you can pick off the dialect and work with it... or you can try to learn the dialect first but its going to be a mess; the tutorials etc will assume you know normal c++.
Last edited on
Here my full code. I connect with arduino through serialport and trying just taking some few data, that's why i use array (fyi in arduino i get 100 data from eeprom and just taking 4 to show in visual studio). I write the code in Form1.h and not use .cpp at all.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#pragma once

namespace CppCLRWinformsProjekt
{

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Collections::Generic;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	
	int counter = 0;
	/// <summary>
	/// Zusammenfassung für Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{

	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
				serialPort1->Close();
				timer1->Stop();
			}
		}

	protected:

	private: System::Windows::Forms::TextBox^ textBox1;
	private: System::ComponentModel::IContainer^ components;
	private: System::Windows::Forms::Button^ button1;
	private: System::IO::Ports::SerialPort^ serialPort1;
	private: System::Windows::Forms::Timer^ timer1;
	private: System::Windows::Forms::TextBox^ textBox2;
	private: System::Windows::Forms::TextBox^ textBox3;
	private: System::Windows::Forms::TextBox^ textBox4;
	private: System::Windows::Forms::Button^ button2;


	public:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		String^ mStr;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
			this->components = (gcnew System::ComponentModel::Container());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));
			this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
			this->textBox2 = (gcnew System::Windows::Forms::TextBox());
			this->textBox3 = (gcnew System::Windows::Forms::TextBox());
			this->textBox4 = (gcnew System::Windows::Forms::TextBox());
			this->button2 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(115, 29);
			this->textBox1->Multiline = true;
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(217, 25);
			this->textBox1->TabIndex = 0;
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(12, 29);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(97, 56);
			this->button1->TabIndex = 1;
			this->button1->Text = L"START";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::Button1_Click);
			// 
			// serialPort1
			// 
			this->serialPort1->PortName = L"COM9";
			this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived);
			// 
			// timer1
			// 
			this->timer1->Interval = 500;
			this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
			// 
			// textBox2
			// 
			this->textBox2->Location = System::Drawing::Point(338, 29);
			this->textBox2->Multiline = true;
			this->textBox2->Name = L"textBox2";
			this->textBox2->ReadOnly = true;
			this->textBox2->Size = System::Drawing::Size(104, 25);
			this->textBox2->TabIndex = 3;
			// 
			// textBox3
			// 
			this->textBox3->Location = System::Drawing::Point(338, 60);
			this->textBox3->Multiline = true;
			this->textBox3->Name = L"textBox3";
			this->textBox3->ReadOnly = true;
			this->textBox3->Size = System::Drawing::Size(104, 25);
			this->textBox3->TabIndex = 4;
			// 
			// textBox4
			// 
			this->textBox4->Location = System::Drawing::Point(115, 60);
			this->textBox4->Multiline = true;
			this->textBox4->Name = L"textBox4";
			this->textBox4->ReadOnly = true;
			this->textBox4->Size = System::Drawing::Size(217, 25);
			this->textBox4->TabIndex = 5;
			// 
			// button2
			// 
			this->button2->Location = System::Drawing::Point(448, 29);
			this->button2->Name = L"button2";
			this->button2->Size = System::Drawing::Size(97, 56);
			this->button2->TabIndex = 6;
			this->button2->Text = L"RESET";
			this->button2->UseVisualStyleBackColor = true;
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(553, 292);
			this->Controls->Add(this->button2);
			this->Controls->Add(this->textBox4);
			this->Controls->Add(this->textBox3);
			this->Controls->Add(this->textBox2);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->textBox1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
	private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
	{
		serialPort1->Open();
	}

	private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
	{
		mStr = serialPort1->ReadLine();
	}

	private: System::Void Button1_Click(System::Object^ sender, System::EventArgs^ e)
	{
		
		timer1->Start();
		textBox1->AppendText("TOOLCODE");
		array<Int32>^ numbers = gcnew array<Int32>{0, 1, 2, 3};
		for (int i = 0; i < 4; i++)
		{
			textBox2->Text += numbers[i].ToString() + " ";
		}
	}

	private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
	{
		serialPort1->WriteLine(textBox2->Text);
		textBox4->Text += mStr + " ";
		counter++;
		if (counter == 4)
			timer1->Stop();
	}
	};
}


For example i just want to get data from address 0,1,2,3 and it shows the iterate and not in order but the data was correct (the data is in binary form). I wanna ask how can I just print out the data into textBox with the correct order and stop when the data ends, no looping. Thank you

P.s I have 3 textBox; textBox1 for write TOOLCODE, textBox2 write 0,1,2,3 and textBox3 write the data
Last edited on
What does "shows the iterate' mean?

the data is in binary form
Does that mean it is not a string while on line 171 you read it as such? So what exactly is the content of mStr?

When the Button1_Click(...) event occurs is it certain that serialPort1_DataReceived(...) is done? because you start the timer there.

Why do you need a timer at all? Can't you just fill textBox3 (or line 189 textBox4) when the data arrives?

You are dealing with three independent events which makes things difficult. So why not move the code from timer1_Tick(...) to serialPort1_DataReceived(...)?
Topic archived. No new replies allowed.