Mikixx Ответов: 1

Запись в строку одна строка за один раз с таймером в форме из serialport


привет
я хочу использовать таймер для чтения продолжения последовательного порта
и когда serialport ничего не получает не пишите ничего на строку
я попробовал этот код
этот код для чтения строки serialport

private static void DataReceivedHandler(
                       object sender,
                       SerialDataReceivedEventArgs e)
      {
          Ricevo = ModemPort.ReadLine();
          Ricevo = Ricevo.Replace("\r", string.Empty);

            if (Ricevo !="")
          {
              RicevoOk = Ricevo;

          }
            else
          {
              RicevoOk = "";
              Ricevo = "";
          }




      }


и этот код является таймером

if (Ricevo!=null)
{

listbox1.items.add(ricevo);
ricevo="";
}

какой правильный код
спасибо

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

private static void DataReceivedHandler(
                         object sender,
                         SerialDataReceivedEventArgs e)
        {
            Ricevo = ModemPort.ReadLine();
            Ricevo = Ricevo.Replace("\r", string.Empty);
            
              if (Ricevo !="")
            {
                RicevoOk = Ricevo;
               
            }
              else
            {
                RicevoOk = "";
                Ricevo = "";
            }
             
           

            
        }

Таймер
if (Ricevo!=null)
{

listbox1.items.add(ricevo);
ricevo="";
}

[no name]

Либо используйте событие, либо таймер, нет необходимости в том и другом.

OriginalGriff

Ну, это не совсем так. Событие DataReceived всегда происходит в потоке, не относящемся к пользовательскому интерфейсу, поэтому он не может получить доступ к своему списку из него.
У меня сложилось впечатление, что он новичок в сериалах и понятия не имеет, как вызывать вещи. Но этот код довольно беден...Сейчас я на планшете, так что посмотрим, что я смогу сделать позже, когда буду на компьютере.

1 Ответов

Рейтинг:
1

RickZeeland

Вот хороший пример на CodeProject: Базовое приложение для прослушивания последовательного порта[^]
Обратите особое внимание на использование InvokeRequired, вам нужно будет использовать это, если вы хотите обновить свой ListBox из другого потока.


Mikixx

я не хочу использовать invokerequired
я использую последовательный порт в библиотеке DLL

RickZeeland

Я понимаю, что это страшно, но это фундаментальная вещь, которую нужно знать.
Если вы хотите избежать InvokeRequired любой ценой, вы можете использовать цикл, который вызывает serialPort.ReadLine() без каких-либо потоков, но это не совсем правильный способ, я думаю, что он заблокирует вашу программу.

Mikixx

если я использую readbyte?

RickZeeland

Это было бы возможно, поскольку метод Read () не блокируется.
Более подробная информация здесь: https://msdn.microsoft.com/en-us/library/ms143549(v=против 110). aspx

RickZeeland

Но почему бы вам не использовать пример CodeProject, в нем есть все, что вам нужно. Единственное, что вам нужно изменить, - это отправить вывод в ListBox вместо TextBox.