powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение из сериального порта.
19 сообщений из 19, страница 1 из 1
Чтение из сериального порта.
    #39672494
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаю бинарную дату
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 private void ReadComPort()
        {
            char chr;
            string str = "";

            while (serial_port.BytesToRead > 0)
            {
                chr = (char)serial_port.ReadChar();
                str += chr;
            }

            richTextBoxLog.AppendText(str );
        }


Но так как дата бинарная вижу в текст боксе краказябы. А как мне увидеть реальные данные?
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672497
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char это юникод. Читай в массив byte[], в конце конвертируй в строку Encoding.ASCII.GetString()
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672529
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tchar это юникод. Читай в массив byte[], в конце конвертируй в строку Encoding.ASCII.GetString()
спасибо. так работает
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int rx_byte;
while (serial_port.BytesToRead > 0)
{
     rx_byte = serial_port.ReadByte();

      str += (byte)rx_byte;

}
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672623
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот еще такая проблема
условие while (serial_port.BytesToRead > 0) не всегда адекватное. уж не знаю какой там механизм но байт в приемном буфере может приходить с задержкой.
чтоб вычитать все данные приходиться применять такой механизм
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
while (serial_port.BytesToRead > 0)
{
    rx_byte = serial_port.ReadByte();

    str += (byte)rx_byte;

    if (serial_port.BytesToRead == 0)
    {
         ticks = 0;
         while (serial_port.BytesToRead == 0)
          {
                Thread.Sleep(1);
                 ticks++;
                 if (ticks > timeout)
                    break;
          }
   }
}


а что то красивее можно придумать?
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672831
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

можно подписаться на события получения данных, тогда циклов не нужно будет - что пришло, то сразу и получил
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672884
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallarisjenya7,

можно подписаться на события получения данных, тогда циклов не нужно будет - что пришло, то сразу и получил
делал и так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
serial_port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

 private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            string serial_data = "";

            if (richTextBoxLog.InvokeRequired)
            {
                richTextBoxLog.Invoke(new SerialDataReceivedEventHandler(DataReceivedHandler), sender, e);
            }
            else
            {
                //get data from comport
                SerialPort sp = (SerialPort)sender;

                serial_data = sp.ReadExisting();

                //append text
                richTextBoxLog.AppendText(serial_data);

            }
        }


все равно криво работает
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672982
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

а в чем кривость-то заключается?
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39672988
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, реализацию DataReceivedHandler я бы сделал не так: сначала бы все считал из порта, потом бы проверял inokeRequired и просто бы добавлял к тексту полученные символы.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673035
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisКстати, реализацию DataReceivedHandler я бы сделал не так: сначала бы все считал из порта, потом бы проверял inokeRequired и просто бы добавлял к тексту полученные символы.
так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
     string serial_data = "";

     SerialPort sp = (SerialPort)sender;

     serial_data = sp.ReadExisting();

     if (richTextBoxLog.InvokeRequired)
     {
          richTextBoxLog.AppendText(serial_data);
     }
}
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673131
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на основании чего Вы начинаете читать?
Наверное есть команда Write, Вы просите сначала некое устройство "отдать" вам дату?

Формат ответа какой ASCII или byte[].

Если ASCII, то что у вас является началом и концом передачи.
Если byte[], то какова длина ответа и откуда Вы это знаете?
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673140
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fortibransaА на основании чего Вы начинаете читать?
Наверное есть команда Write, Вы просите сначала некое устройство "отдать" вам дату?

Формат ответа какой ASCII или byte[].

Если ASCII, то что у вас является началом и концом передачи.
Если byte[], то какова длина ответа и откуда Вы это знаете?
я передаю команду - выдай мне столько то байт. но я хочу читать из порта пока идет передача данных. не привязываясь к длине.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673193
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

протокол передачи данных существует или только на уровне, есть поток и из него мы что-то читаем?
нельзя просто взять и читать данные от балды =)
более того, с комп порта можно получить поврежденные данные.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673229
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesjenya7,

протокол передачи данных существует или только на уровне, есть поток и из него мы что-то читаем?
нельзя просто взять и читать данные от балды =)
более того, с комп порта можно получить поврежденные данные.
нельзя? нужно! нужно вычитать сырые бинарные данные от балды. а верхний леер сделает парсинг данных. там есть и заголовок и CRC. но сначала данные нужно загрузить на комп.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673278
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
COM-порт так не работает
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673281
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_OneCOM-порт так не работает
раскажите мне как работает COM-порт. а то я за 10 лет так и не разобрался.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673292
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откройте наконец для себя hyperterminal (в винде 10 нет уже) и посмотрите, как работает
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673304
Splash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо так как дата бинарная вижу в текст боксе краказябы. А как мне увидеть реальные данные?
А что такое реальные данные? Каждый байт можно представить в HEX формате, будет красивее, но, возможно, ни разу не понятнее. Может быть там идут числа с плавающей точкой, числа в big-endian или little-endian, строки в UTF или DOS-кодировке... да мало ли что, даже бессмысленный паддинг может быть. Это как раз ваша задача: зная формат, вывести данные в красивом виде.

PS: Вот тут пример читалки RFID-меток , которая из одного порта читает, переделывает немного данные и в другой порт отправляет.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673474
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7PallarisКстати, реализацию DataReceivedHandler я бы сделал не так: сначала бы все считал из порта, потом бы проверял inokeRequired и просто бы добавлял к тексту полученные символы.
так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
     string serial_data = "";

     SerialPort sp = (SerialPort)sender;

     serial_data = sp.ReadExisting();

     if (richTextBoxLog.InvokeRequired)
     {
          richTextBoxLog.AppendText(serial_data);
     }
}



не, вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
     string serial_data = "";

     SerialPort sp = (SerialPort)sender;

     serial_data = sp.ReadExisting();

     if (richTextBoxLog.InvokeRequired)
     {
           richTextBoxLog.Invoke(/*.... тут инвокаем делегат с кодом richTextBoxLog.AppendText(serial_data)...*/ );
     }
     else
     {
          richTextBoxLog.AppendText(serial_data);
     }
}



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


Если в протоколе обмена нет четкого задекларированного сообщения, что в ответе будет N байт (что не очень хорошо, но бывает), то можно поступить, например, так. Подписавшись на событие и получив в нем данные, перезапускать некий таймер, скажем на 500мс, по истечении которого принимать решение, что все, больше ничего не дождемся в данном сеансе обмена.
...
Рейтинг: 0 / 0
Чтение из сериального порта.
    #39673604
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris
не, вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
     string serial_data = "";

     SerialPort sp = (SerialPort)sender;

     serial_data = sp.ReadExisting();

     if (richTextBoxLog.InvokeRequired)
     {
           richTextBoxLog.Invoke(/*.... тут инвокаем делегат с кодом richTextBoxLog.AppendText(serial_data)...*/ );
     }
     else
     {
          richTextBoxLog.AppendText(serial_data);
     }
}




Если в протоколе обмена нет четкого задекларированного сообщения, что в ответе будет N байт (что не очень хорошо, но бывает), то можно поступить, например, так. Подписавшись на событие и получив в нем данные, перезапускать некий таймер, скажем на 500мс, по истечении которого принимать решение, что все, больше ничего не дождемся в данном сеансе обмена.

спасибо.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение из сериального порта.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]