JimB_ Ответов: 2

C# how substring() a string from (the response of reading from serial port) количество строк, отображаемых в текстовом поле


namespace ProjectOne
{
 public partial class MainForm : Form
 {
   private void StatusBtn_Click(object sender, EventArgs e)
    {
     //command sent to serial port and responds a series of lines
     string StatusInfoToshow = "?D\r";
     string commForMeter = string.Format(StatusInfoToshow);

     try
     {
      if (statusofMeter.serialPortForApp.IsOpen)
         {
           
            bool doesContain = commForMeter.Contains("\r");
                   
                    if (doesContain)
                    {
                        foreach (char s in commForMeter)
                        {
                            currentDataToShow.serialPortForApp.Write(s.ToString());
                        }
                    }
         }
     }
     catch (Exception)
     {
         statusofMeter.ShowDataInScreenTxtb.Text = "TimeOUT Exception";
     }
  }

int LineCounter= 0;

 public void SerialPortInApp_DataReceived(object sender,SerialDataReceivedEventArgs 
    e) 
  {
  
    DataToSetandGet = serialPortForApp.ReadExisting();
     if (this.InvokeRequired)
     {
      Invoke(new MethodInvoker(delegate {
        Textbox1.AppendText(LineCounter.ToString()+ DataToSetandGet
                                                     .Replace("\n", " ")
                                                     .Replace("\r", "\r\n"));
           }));
     }

  }
 }
}


Что я уже пробовал:

int LineCounter= 0;
public void SerialPortInApp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
 try
 {
   DataToSetandGet = serialPortForApp.ReadExisting();
   if (this.InvokeRequired)
   {
    //I  insert the the increment numbering index for each new line displayed in 
  the  textbox but index start at 0 not 1, if I set LineCounter=1 it print 1 instead of 0 and the 1 again for next line

     Invoke(new MethodInvoker(delegate { 
     Textbox_One.AppendText(LineCounter.ToString() + DataToSetandGet
                                                     .Replace("\n", " ")
                                                     .Replace("\r", "\r\n")); 
          }));
                                
 }
  catch (Exception)
 {
  Textbox_One.Text = "TimeOUT error";
}
}


моя кнопка отправляет команду на прослушивание в последовательный порт и отправляет ответ.
ответ в последовательном порту будет показывать записи, считанные с датчика, и каждая строка(показания с датчика в устройстве, подключенном к порту) всегда начинается с нулевого символа строки "0" в начале каждой строки.
Я хотел бы удалить() или подстроку (), которая равна нулю "0", когда она отображает каждый из них .

Я не могу использовать подстроку()

Линейный счетчик.ToString()+ DataToSetandGet.Substring(n позиция в строке)

потому что дайте мне ошибку

- startIndex не может быть больше длины строки.:

эта ошибка вызвана тем, что она читается следующим образом:

//0 запись\Р//0 запись\Р//0 запись\Р//0 запись\Р//0 записей


Invoke(new MethodInvoker(delegate {
Textbox1.AppendText(LineCounter.ToString()+ DataToSetandGet
.Заменить("\п", " ")
.Заменить("\р", "\р\н"));
}));

Возврат каретки "\r" происходит потому, что команда

перед использованием LineCounter он отображает
//0 запись
//0 запись
//0 запись
//0 запись
//0 запись

после использования счетчика он отображает:как позиционировать индекс, чтобы начать с 1 вместо 0
//1 0 запись &ЛТ;==если LineCounter=1 а если LineCounter=0 это набор первой строке в ноль
//1 0 запись и следующая строка как одна
//2 0 запись
//3 0 запись
//4 0 запись

корректное отображение должно быть таким: как реализовать Substring() или удалить()
//1 запись
//2 Запись
//3 запись
//4 запись
//5 запись

2 Ответов

Рейтинг:
2

Member 13921167

Извините, но я не понимаю вашей проблемы.

Неизвестно что здесь происходит:

Цитата:
currentDataToShow.serialPortForApp.Писать( список2 )

Если я проигнорирую неизвестное и выведу list2 вместо этого я получу что-то вроде этого:
Цитата:
1 ?
2 D
3

Но вопрос в том, хотите ли вы написать это в currentDataToShow.serialPortForApp.Write( list2 )?


Рейтинг:
19

Gerry Schmitz

private int _counter = 0;

...

Textbox_One.AppendText( ++_counter.ToString() + DataToSetandGet.Substring(1).Replace("\r", "\r\n")); 


JimB_

Привет, Джерри, это определенно сработает. Однако команда, которую я посылаю ему, запрашивает чтение записей в памяти устройства, именно поэтому ответ всегда начинается с нуля. а еще у меня есть такая ошибка: "startIndex не может быть больше длины строки". Теперь я должен найти способ, как удалить этот ноль, потому что теперь ответ выглядит так:
0 0 запись
1 0 запись
2 0 запись
3 0 запись
4 0 запись
5 0 запись

пожалуйста, я читал, и похоже, что я должен проверить, что находится в DataToSetandGet, а затем IndexOf("\r", i)) != -1) применить DataToSetandGet.Substring(1) и, наконец, вызвать ответ Textbox_One.AppendText( ++_counter.ToString()+ DataToSetandGet.Replace("\r", "\r\n"))

спасибо, если еще какие-то ответы я буду признателен

Gerry Schmitz

Подстрока(1) отправляется поверх "0", но вам нужно в первую очередь убедиться, что в буфере есть данные.