Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 10
1

Замена символа в string, которая не нужна

25.02.2014, 21:32. Показов 1927. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В C# не имею достаточного опыта!
Получаю от контроллера через порт строку:
C#
1
string msg = serialArduinoPort.ReadLine();
Пока в строке были только символы проблем не было.
Но нужда заставила в некоторых байтах строки передавать (и соответственно получать) целое без знака до 255.
Контроллер передает то что хочу. А вот в строке значения всех этих байтов заменяются на '?' (вопросительный знак)!
Подскажите как решить проблему?
Не хочется все переписывать на чтение по байтам (serialPort.ReadByte())....
Уже как-то с этим повозился...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2014, 21:32
Ответы с готовыми решениями:

Замена символа String
вобщем столкнулся с такой проблема, нужно записать в БД путь к картинке открываю файл при помощи ...

Замена символа в string
подскажите как можно изменить запятую на точку в переменной а то я конвертировать в int не могу...

Замена одного символа в String
Можно ли в C# воздействовать на отдельные символы строки (string). На следующий код компилятор...

Анализ и замена символа в string
как изменить первый символ в string,если он равен -?

10
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
25.02.2014, 21:39 2
В контроллере когда формируете строку, нужно к каждому цифровому разряду прибавить ASCII значение знака '0'. У вас то всё передаётся, просто не отображается потому что коды не попадают. Разбирать строку придется всё равно, но за то вы будете сразу видеть передаваемые значения.

Сам почитал и еле понял что написал В общем вам нужно на стороне контроллера преобразовывать числовые значения в строковые и тогда только отсылать их со всей строкой.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 10
25.02.2014, 22:18  [ТС] 3
На стороне контроллера (Arduino) у меня есть буфер:
C++ (Qt)
1
byte bufWrite[128];
В него я успешно вставляю символы и отправляю:
C++ (Qt)
1
2
3
4
5
6
unsigned char ValImp;
ValImp='1';
bufWrite[i]=ValImp;
...
Serial.write(bufWrite,33);//print(msg);
Serial.print('\n');
При этом в программе на компе получаю корректную строку (если все 33 символа заполнены)
А когда попробовал в некоторые байты вставить так:
C++ (Qt)
1
2
3
4
5
  unsigned char ValImp;
  ValImp=255;
  if (<условие>)   ValImp=<значение от 0 до 200>;
  else                  ValImp=255;// Флаг что нет значения
  bufWrite[i]=ValImp;
получаю там вопросительный знак...

Добавлено через 2 минуты
Забыл спросить! Что я не так делаю?
0
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
25.02.2014, 22:36 4
255 это точно непечатаемый символ, он и выводится в виде ? .
Как строку получится посылать только печатаемые символы.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 10
25.02.2014, 22:39  [ТС] 5
То есть "обойти" проблему никак нельзя...
0
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
25.02.2014, 22:46 6
Какова у вас задача? Вы хотите передавать получается массив байт а не строку? Кодируйте каждое байтовое значение например в 16-ричное, строка увеличится всего лишь в 2-ва раза но тогда на стороне клиента вы сможете её полностью преобразовать в массив байт и уже с ним работать.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.02.2014, 23:24 7
Ansen2, а чем вас не устраивает знак вопроса? Если это непечатаемый символ, система может отобразить его как захочет...
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 10
26.02.2014, 00:08  [ТС] 8
Мысль интересная, но порт "захлебывается"(теряются посылки вследствие большой частоты передачи) и при длине посылки 33 байта. Так что буду переделывать наверное на побайтовую обработку...
Спасибо.
А вам приходилось работать с СОМ портами? Тяжелая штука в отладке из-за необходимости работы через потоки...

Добавлено через 2 минуты
Для Psilon. Мне нужно то что послано из контролера, не вставленный вместо него ?

Добавлено через 1 минуту
Т.е. 0хС3

Добавлено через 2 минуты
Пардон 0х3F
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.02.2014, 06:45 9
Ansen2, ну так и переведите в число
C#
1
2
3
4
5
6
7
8
9
10
            string s = "Hello world!" + (char) 255;
            foreach (char c in s)
            {
                if (c <= '~') //из ASCII
                    Console.Write(c);
                else
                    Console.Write("0x{0:X}", (int) c);
            }
            Console.WriteLine();
            Console.ReadKey();
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 10
26.02.2014, 11:20  [ТС] 10
Psilon, уважаемый!
Я после выполнения
C#
1
string msg = serialArduinoPort.ReadLine();
в определенном msg[i] всегда получаю 0х3F, а не отправленные с контроллера 255(0хFF) или 254 и т.д.
0
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
26.02.2014, 12:34 11
Лучший ответ Сообщение было отмечено Ansen2 как решение

Решение

Цитата Сообщение от Ansen2 Посмотреть сообщение
в определенном msg[i] всегда получаю 0х3F, а не отправленные с контроллера 255(0хFF) или 254 и т.д.
Правильно, вы же работаете с текстом, а для символов применимо такое понятие, как кодировка.
При считывании сырых байтов с порта и конвертировании их в строку (строки/символы в .NET представлены в кодировке UTF-16), вы преобразуете значение этих байтов в зависимости от используемой для считывания кодировки (свойство Encoding класса SerialPort).
Например, если вы используете кодировку ASCII для считывания с порта, то все символы значением выше 127 будут преобразованы в вопросительные знаки, что вы и наблюдаете.
Если вы будете использовать другую кодировку, где символ 255 представлен официально (например, в кодировке Win-1251 под номером 255 стоит буква "я"), то при конвертировании этого символа в UTF-16 ему будет присвоено значение того же символа, но уже в таблице UTF-16. То есть буква "я" из 255 превратится в 1103.

То есть если вы посылате в порт числа, а не буквы, то и работайте с данными как с числами, а не буквами. Иначе потеря значений неизбежна.
Вместо ReadLine используйте Read и передавайте массив байтов.
3
26.02.2014, 12:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2014, 12:34
Помогаю со студенческими работами здесь

Замена символа в String без переписывания всей строки
Есть слово которое заполняется по 1 символу String G и G == &quot;1110&quot; и надо под конец изменить на...

Замена данного символа на любое сочетание символов.(Тип данных string)
Написать программу которая каждую встречную букву Б будет заменять сочетанием КУ. Понимаю что...

Замена символа в строке на число соответствующему номеру по порядку вхождения этого символа в строку
В заданной строке заменить каждый символ «*» числом, соответствующим номеру по порядку вхождения...

Замена символа на их сочетание - происходит множественная замена
примером есть у меня текст типа &quot;globus&quot; замена у меня происходит так: gg = gg.Replace(&quot;a&quot;,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru