С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547

Обработка данных с com порта.

28.12.2010, 11:07. Показов 3843. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При подключении к com порту контроллера, неважно какого, мне в консоль приходит от него ответ вот в таком виде:
как еа рисунке.
Это строка string. Вопрос как мне обработать строку таким образом чтобы выдернуть из нее цифры в переменную типа int?
Миниатюры
Обработка данных с com порта.  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2010, 11:07
Ответы с готовыми решениями:

Обработка данных принятых с COM-порта
Добрыйдень опытные коллеги))) Помогите с алгоритмом обработки данных принятых с ком-порта. Есть следующее: Формат пакета от...

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

Обработка данных с COM порта без использования Sleep
делаю проект, который взаимодействует с реальным устройством через COM-PORT я отправляю команду, жду (я сделал через sleep) пока в...

8
 Аватар для Etrimus
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
28.12.2010, 12:10
Если у тебя всё время одинаковые фразы идут, и различия только в цифрах, то можно воспользоваться методом класса String. Метод Remove(). Он просто отсекает все знаки с заданной позиции и до самого конца. А когда отсечёшь, преобразуй получившуюся строку в числовой тип...
Например.
C#
1
2
3
4
            string s = "15end"
            int r;
            s = s.Remove(2);
            r = Convert.ToInt32(s);//Перебрасываем в r занчение из s
Добавлено через 10 минут
Не забудь, что метод Remove выбрасывает исключение, если пытаешься отрезать от строки больше символов, чем в ней вообще есть...
1
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
28.12.2010, 12:27  [ТС]
Сделал так, но столкнулся с проблемой, у меня длина строки меняется, т.е. сначала цифры идут однозначные:0,1,2,3,4,5,6,7,8,9 а потом 2-х - 10,11,12,13,14,15,16 и когда однозначные цифры выдает ошибку, что значение обрезания не попадают в диапазон.
0
 Аватар для Etrimus
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
28.12.2010, 12:43
Тогда нужны регулярные выражения...
Я сам ни разу не работал с ними в C#, помочь конкретикой не смогу...
Остаётся поиск в инете, либо кто-то ещё подскажет...
0
11 / 6 / 0
Регистрация: 24.12.2010
Сообщений: 22
28.12.2010, 12:54
C#
1
2
3
4
5
6
7
8
string Value = "ertrtrtrt5564";
            string numbers = null;
            for(int i = 0; i < Value.Length; i++) {
                if(Char.IsNumber(Value[i])) {
                    numbers += Value[i];
                }
            }
            int result = int.Parse(numbers);
или если например перед цифрами всегда идёт один и тот-же текст
C#
1
2
3
            string Value = "CONST5564";
            string numbers = Value.Replace("CONST", "");
            int result = int.Parse(numbers);
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.12.2010, 12:54
Без RegEx'ов вполне можно обойтись:
C#
1
2
3
4
5
6
7
            string val = null; // Строка которую ты полчаешь в виде val=<число>end
            int res;
            for (int i = 1; i < 100000; i++) {
                val = string.Format("val={0}end", i); // Составляем строку вида val=<число>end, ты же эту строку получаешь из порта
                res = Convert.ToInt32(val.Substring(4, val.Length - 7)); // Получаем значение между val= и end
                Console.WriteLine(res); // Выводим, ну или делай со значением что тебе надо
            }
Пример того как получить число находящееся между val= и end.
1
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
28.12.2010, 13:06  [ТС]
Я в принципе сделал, но криво:

C#
1
2
3
4
5
6
7
8
9
10
11
12
string message = Port.ReadLine();
                        if (message == "start") continue;
                        else if (message.Length == 8)
                        {
                            string message2 = ("\n" + message.Remove(0, 4));
                            Console.WriteLine(message2.Remove(2, 3));
                        }
                        else
                        {
                            string message2 = ("\n" + message.Remove(0, 4));
                            Console.WriteLine(message2.Remove(3, 3));
                        }
С вашими советами красивее получится.
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
28.12.2010, 17:54
Сделайте с помощью RegExp что-то типа: "\d+"
или как вариант по старинке, что-то типа:

C#
1
2
3
4
5
6
7
8
string message = Port.ReadLine();
int iter = 4; // "val=" = 4 вроде
string result = string.empty;
while(message.lenght > iter && message[iter].isDigit()){
  result+=message[iter]; 
  iter++;
}
console.write(result);
Не обещаю, что это работает, но суть думаю уловили. зы: прекрасно понимаю, что вариант далеко не хорош и претендует на говнокод, но в предпраздничный вечер в голову ничего другого не лезет :-)
1
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
28.12.2010, 19:23
C#
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
#region using
 
using System;
using System.Text.RegularExpressions;
 
#endregion
 
namespace ConsoleApplicationTest
{
    public static class Program
    {
        private static void Main()
        {
            const string input = "123end";
            Match match = Regex.Match(input, @"(?<num>\d+)(?<str>[a-zA-z]+)");
            // Номер.
            int num = Convert.ToInt32(match.Groups["num"].Value);
            // Строка после номера.
            string str = match.Groups["str"].Value;
 
            Console.WriteLine(num);
            Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2010, 19:23
Помогаю со студенческими работами здесь

Обработка данных с COM порта
Здравстыуйте помогите решить проблемму, есть устройство COM (CH340) с него снимаются данные его настроек в виде : ( B1 C1 R1 X0 ...

Обработка данных с COM порта
ПОдскажите, как обрабатывать строку полученную с COm порта У меня с COM порта идет строка ...

Обработка данных из порта
Добрый день. Данные с порта считываются каждую секунду. Эти данные надо обработать. Вопрос как это сделать ? А то начинаю орабатывать тут: ...

Обработка данных, полученных из COM-порта
В текстовом файле одна строка с данными полученными из СОМ порта(файл REG.jpg). Ее надо обработать, конкретно получить цифровые значения...

Обработка полученных данных с COM порта
Доброго всем времени суток. Вопрос такого плана - есть некое устройство посылающее данные в COM порт. Нужно на первом этапе ловить эти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru