Я создал простую эхо-программу для получения, изменения и последующего отображения измененных и исходных данных.Когда я запускаю свой код, я не получаю то, что ожидаю.Я создал форму окна для связи с Ardino UNO.Я отправлю строку ("0001","0002","0003","0004"}
.
. Данные будут прочитаны Arduino, затем выполнит их, чтобы удалить все начальные 0, и возвращенные данные должны быть {1","2","3","4"}
для измененных и ("0001","0002","0003","0004"}
за оригинал.Когда я запускаю свою программу, в первые пару раз, когда я отправляю данные, мне возвращаются странные данные.Иногда он смещен или находится в том порядке, которого я не ожидаю, но после нескольких прогонов он снова отражает то, что я ожидал.
Единственное, он не полностью завершил метод удаления.Вместо этого возвращаются {"1","0002","0003","0004"}
и "0001","0002","0003","0004"}
.Ожидается вторая часть эха, но, похоже, она удаляет только первые нули для первого экземпляра и ни один из других случаев.Поскольку я не использую переменную общего индекса в цикле while и всегда заставляю ее проверять первый элемент, я не думаю, что с моим циклом while что-то не так.Я знаю, что вы можете иметь несколько циклов while в программе, поэтому я знаю, что это не может быть проблемой.
Я не понимаю, почему функция удаления запускается только в первом цикле и ни в одном другом.Я слишком опережаю себя, потому что требуется приблизительно два прогона для отображения ожидаемых возвращаемых данных?Когда я не использую цикл и просто тренируюсь использовать метод удаления строки, он работает нормально.Даже если данные не возвращаются должным образом, они все равно должны быть изменены?Я должен ожидать получить два разных набора строк независимо от того, будет ли сообщение неправильно передано.
Код Arduino, который считывает данные, сохраняет их в массив, копирует содержимое массива в строку, чтобы удалить начальные 0, а затем возвращает данные обратно.
// Visual Micro is in vMicro>General>Tutorial Mode
//
// Define Functions below here or use other .ino or cpp files
//
String *rarray = new String[4];
String *carray = new String[4];
int blinks;
// The setup() function runs once each time the micro-controller starts
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
Serial.println("Arduino is Ready");
}
// Add the main program code into the continuous loop() function
void loop()
{
getstring();
StringtoInt0();
StringtoInt1();
StringtoInt2();
StringtoInt3();
blink();
echo();
delay(1000);
}
void getstring()
{
int ndx = 0;
String rs;
while (Serial.available() > 0)
{
rs = Serial.readStringUntil('\0');
rarray[ndx] = rs;
carray[ndx] = rarray[ndx];
ndx++;
if (ndx >= 4)
break;
}
}
void StringtoInt0()
{
String R0B0 = carray[0];//get string from element 0
while (R0B0[0] == '0')//while first char is 0
{
R0B0.remove(0, 1);//remove it
}
Serial.println(R0B0);//return the modified data back to the GUI
int int0 = R0B0.toInt();//convert a string into an integer
delay(10);//allow time for the data to be transmitted.
//--------------------------------
}
void StringtoInt1()
{
String R0B = carray[1];
while (R0B[0] == '0')
{
R0B.remove(0, 1);
}
Serial.println(R0B);
blinks = R0B.toInt();
delay(10);
//--------------------------------
}
void StringtoInt2()
{
String R0B2 = carray[2];
while (R0B2[0] == '0')
{
R0B2.remove(0, 1);
}
Serial.println(R0B2);
int int2 = R0B2.toInt();
delay(10);
//--------------------------------
}
void StringtoInt3()
{
String R0B3 = carray[3];
while (R0B3[0] == '0')
{
R0B3.remove(0, 1);
}
Serial.println(R0B3);
int int3 = R0B3.toInt();
delay(10);
}
//--------------------------------
void blink()
{
for (int b = 1; b <= blinks; b++)
{
digitalWrite(LED_BUILTIN, HIGH);
delay(250);
digitalWrite(LED_BUILTIN, LOW);
delay(250);
}
}
void echo()
{
for (int rs = 0; rs <= 3; rs++)
{
Serial.println(carray[rs]);//return the original sent data
delay(20);
}
}
Форма Windows, котораяпередает данные:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Collections;
namespace Blink_with_String_GUI
{
public partial class Form1 : Form
{
SerialPort port = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string S0; string S1; string S2; string S3;
int S0I; int S1I; int S2I; int S3I;
S0I = Convert.ToInt16(b0.Value);
S1I = Convert.ToInt16(b1.Value);
S2I = Convert.ToInt16(b2.Value);
S3I = Convert.ToInt16(b3.Value);
S0 = S0I.ToString("D4");
S1 = S1I.ToString("D4");
S2 = S2I.ToString("D4");
S3 = S3I.ToString("D4");
label1.Text = S0;
label2.Text = S1;
label3.Text = S2;
label4.Text = S3;
string[] string1 = new string[] { S0, S1, S2, S3 };
//-----
port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
port.Open();
for (int s = 0; s <= 3; s++) //Write string of padded int
{
port.WriteLine(string1[s]);
Thread.Sleep(10);
}
string rs1; string rs2; string rs3; string rs4; string rs5; string rs6; string rs7; string rs8; string rs9;
rs1 = port.ReadLine();
rs2 = port.ReadLine();
rs3 = port.ReadLine();
rs4 = port.ReadLine();
rs5 = port.ReadLine();
rs6 = port.ReadLine();
rs7 = port.ReadLine();
rs8 = port.ReadLine();
rs9 = port.ReadLine();
label8.Text = rs1;
label7.Text = rs2;
label6.Text = rs3;
label5.Text = rs4;
label12.Text = rs5;
label11.Text = rs6;
label10.Text = rs7;
label9.Text = rs8;
port.Close();