PDA

Просмотр полной версии : Преобразовние в int строки C#



UZ5DM
10.08.2017, 13:05
Привет всем !
Есть Ардуино Мега 2560. Через UART выталкиваю данные и принимаю на компе

While (1)
{
Serial.println(Strin g(MyValue)); // код из Ардуино
}

На компе (Win10 стоит Visual Studio 2017)
Пишу обработчик :

void serialPort1_DataRece ived(object sender, SerialDataReceivedEv entArgs e)
{

string readstring = serialPort1.ReadLine ();

this.Invoke(new EventHandler(display _data_event));
}

private void display_data_event(o bject sender,EventArgs e)
{
value = Convert.ToInt32(read string); //
}
При выполнении программы выдает ошибку -
System.FormatExcepti on: "Входная строка имела неверный формат."

Но есть период когда этой ошибки нет - в поле куда выводится readstring отображаются данные например 300
Именно на строке преобразования в int (целое)

Коннект с портом происходит без проблем

Подскажите где искать проблему. Спасибо огромное

UT5QBC
10.08.2017, 13:49
try
{
int value = Int32.Parse(readstri ng);
int value_2 = Int16.Parse(readstri ng_2);
}
catch (FormatException) { }

VFO
10.08.2017, 13:55
Напишите нормальный обработчик с обработкой ошибок как приведено в https://msdn.microsoft.com/ru-ru/library/sf1aw27b(v=vs.110).a spx
Вот как Ваш код должен реагировать на ситуацию, когда входной параметр невозможно отобразить в виде целого int?

UZ5DM
10.08.2017, 14:02
Просматривая отладчиком значения readstring - я увидел что значения бывают такие:
"281\r1\r"
или
"" - т.е. пустая строка
Из за этого неправильно работает функция преобразования
Как победить это ?

VFO
10.08.2017, 14:11
Надо поймать эксепшн в обработчике чтобы программа не падала. А уж откуда такие данные берутся это вам виднее, варианта два, либо такое и посылает девайс, тогда копать там, либо битые данные читаете из СОМ порта. Или чего Вы хотите, какой реакции Вы ожидаете от преобразования такой ахинеи к целому числу?

alex_m
10.08.2017, 14:19
if (!int.TryParse(reads tring, out value))
{
// тут делаешь что тебе надо, если readstring не содержит число, например присваиваешь 0:
value = 0;
}



стоит Visual Studio 2017

та что 80 гигабайт весит? :crazy:

Слушатель эфира
10.08.2017, 14:42
alex_m,
та что 80 гигабайт весит? больше, в районе 100, но это если все что есть загрузить.

alex_m
10.08.2017, 14:49
какой ужас :shock: Судя по темпам роста, VS2019 будет порядка 1 терабайта весить... :ржач:

UZ5DM
10.08.2017, 14:56
С девайса все идет нормально. Просто там в конце строки добавляется символы перевода строки "\r"
Я сейчас думаю как их отловить. Скорость обмена с портом выставил маленькую 9600
По поводу Visual Studio 2017 - я не задумывался сколько он "весит" - мне это все равно. Главное что хорошо работает.

UT5QBC
10.08.2017, 16:11
Я сейчас думаю как их отловить.
string response = serialPort1.ReadTo("\r");

alex_m
10.08.2017, 18:34
проще так:


readstring = readsring
.Replace("\n", "")
.Replace("\r", "")
.Trim();
if (!int.TryParse(reads tring, out value))
{
// тут обрабатываем случай, если readstring не содержит число, например присваиваем 0:
value = 0;
}

UZ5DM
10.08.2017, 19:53
Спасибо alex_m !
Работает !!!!

Genadi Zawidowski
10.08.2017, 21:35
А если ОНО считает 25 отдельно и 5 отдельно из порта (передано было 255 с разделителем)?
Делаете машину состояний по принятым символам - ЖДУ ЧИСЛО и СЧИТЫВАЮ ЧИСЛО. На первом нечисловом символе вызываете то, что должно разобранное число получить.

UZ5DM
10.08.2017, 21:45
Спасибо всем за помощь. Все работает. Особенная благодарность UT5QBC и alex_m ! :пиво:
Модератор может закрыть тему !