Полный текст
- Войдите на сайт для отправки комментариев
Вс, 10/06/2012 - 14:41
Доброго времени суток!
У меня возникла проблема с обработкой данных посылаемых на Arduino. Посылаю "Test", а получаю каждый символ в ASCII кодировке, т.е. 84, 101, 115, 116. Можно ли как то от этого избавится и получить нормальное слово?
А для чего вам нужно в дуине "нормальное слово" ? И как вы думаете что вы отсылаете в дуину на самом деле?
А для чего вам нужно в дуине "нормальное слово" ?
Для того чтобы точно определить к какому, устройству\дадчику\мотору\сервоприводу обращяюсь
И как вы думаете что вы отсылаете в дуину на самом деле?
100% Посылаю "Test"
84, 101, 115, 116 это кодировка ASCII
T, e, s, t это уже нормальная кодировка
Сейчас пытаюсь запихнуть приходящие значени в массив, после это кажды элемент массива декодировать из ASCII в норм кодировку, но из-за того что знаний работы с Arduino слишком мало застрял на пихании посылаемых значений в массив)) Вроде корректно все обьяснил))
А чем вас не устраивюет коды аски???
И тогда перефразирую - Вы понимаете, что вы отправляете те же коды аски, а не слово?
100% Посылаю "Test"
84, 101, 115, 116 это кодировка ASCII
T, e, s, t это уже нормальная кодировка
А почему вы думаете, что послав "Test", вы получаете 84, 101,115,116, а не T, e, s, t?
Может приведете соответствующий кусок скетча?
Что бы не заниматься хр..н знает чем (угадывать, предпологать, представлять, телепатировать и т.д. и т.п.) напишите что хотите сделать и покажите код. Вот здесь посмотрите как правильно вставлять код.
И вот здесь, здесь и здесь еще почитайте.
В общем сделал программку на Access, которая передает и принимает сигналы от\к Arduino. Когда я передаю Arduino слово TEST то получаю в ответ 84, 101,115,116. И сама плата обрабатывает сигналы именно в этой последовательности.
А код?
Только весь, а не только "важную" часть кода
Все что есть на Arduino
ссылка на архив с MDB файлом через который работаю http://zalil.ru/33422241
Если вы запустите сериал-монитор, то дуина будет возвращать именно то что вы шлете и каждую секунду игрик с двумя точками (255). Что бы избавиться от чтения пустого буфера нужно делать так:
А проблема у вас в принимающей программе, которая вместо символа показывает вам его код.
2 Maksim:
Не совсем так - проблема все же в скетче.
2 Antel:
Попробуйте так:
или так:
2 all:
Не забываем, что для Serial.read():
"Возвращаемое значение
Следующий доступный байт или -1 если его нет (int)"
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Так , что дело не в скейтче
Вот это похоже на правду, возвращяет именно те символы которые я передаю, НО каждый символ в отдельной строке, следовательно либо передача идет посимвольно, либо обработка.
Вот что показывает мониторинг порта http://zalil.ru/33422489
Я не знаю имеет ли это значение но у меня MEGA 2560
НО каждый символ в отдельной строке
Читайте про Serial.print() и Serial.println()
Serila.println замените на Serial.write и будет вам в ответ "test"
Блин может я как то не так обьясняю чего хочу. Мне нужно чтобы в какой нибудь переменной осталось ПОЛНОЕ слово, в мониторинге порта оно формируется по средством цикла.
Я вам давал выше ссылки в каких переменных все это можно хранить
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Byte - да. будет выведен символ.
Но проблема исходного скетча в том, что в Serial.print() подается значение, возвращаемое функцией Serial.read(). А эта функция возвращает значение типа int. Ну а дальше включается механизм перегрузки функций и имеем, что имеем.
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Byte - да. будет выведен символ.
Но проблема исходного скетча в том, что в Serial.print() подается значение, возвращаемое функцией Serial.read(). А эта функция возвращает значение типа int. Ну а дальше включается механизм перегрузки функций и имеем, что имеем.
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Byte - да. будет выведен символ.
Но проблема исходного скетча в том, что в Serial.print() подается значение, возвращаемое функцией Serial.read(). А эта функция возвращает значение типа int. Ну а дальше включается механизм перегрузки функций и имеем, что имеем.
Удобно использовать класс String
Удобно использовать класс String
Сайт мозг парит
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Byte - да. будет выведен символ.
Но проблема исходного скетча в том, что в Serial.print() подается значение, возвращаемое функцией Serial.read(). А эта функция возвращает значение типа int. Ну а дальше включается механизм перегрузки функций и имеем, что имеем.
Там переполнения не может быть. Может Serial.read() и возвращает int, но при этом она не возвратит больше, чем b11111111 что есть -1 для char и 255 для byte или int
Сейчас не на чем проверить, но как я помню не обязательно отправлять имеено тип char, даже если будет тип byte он все равно вернет в сериал монитор символ, т.к. Serial.print() отправляет те же 8 бит (тот же байт) информации, которые приняла Serial.read().
Byte - да. будет выведен символ.
Но проблема исходного скетча в том, что в Serial.print() подается значение, возвращаемое функцией Serial.read(). А эта функция возвращает значение типа int. Ну а дальше включается механизм перегрузки функций и имеем, что имеем.
Там переполнения не может быть. Может Serial.read() и возвращает int, но при этом она не возвратит больше, чем b11111111 что есть -1 для char и 255 для byte или int
Большое спасибо! Все прекрасно работает!
Там переполнения не может быть. Может Serial.read() и возвращает int, но при этом она не возвратит больше, чем b11111111 что есть -1 для char и 255 для byte или int
Я говорил не о переполнении, а о перегрузке функций. В данном конкретном случае она проявляется в том, что существуют две (скорее всего их больше) функции с одним и тем же именем:
Serial.print(int) и
Serial.print(char)
Компилятор берет ту или иную функцию в зависимости от того, аргумент какого типа указать в скобках. Скормили функции тип char (byte) - будет сгенерирован вызов второго варианта функции и принимающая программа получит ASCII-код соответствующего символа (например, 84 для "T"). Ну а если в скобках стоит переменная целого типа (или как у топикстартера - функция, возвращающая целое), то в объектном коде будет сгенерирован вызов первого варианта и принимающая программа получит не один симол 'T' (84), а строку "84" (символьное представление соответствующего ASCII-кода)
В общем совместными усилиями получили вот такой код обработки посылаемого сообщения через COM порт.
А подскажмите пожалуйста как теперь получить из перемиенной Value не String, a int. (если послать SensorID350, то в переменную Value попадает именного - 350)
Вот есть тема
У класса String есть метод toInt. В справках нигде нету, но если почитать в исходниках, то есть :) Возвращает тип Long. Но в строковой переменной ничего больше не должно быть кроме цифр (допускается только знак "-" перед цифрами), функция прекращает работу на первом же "неправильном" символе:
В данном случае человеку прийдется сначала из общей команды (например: SensorID350) вытащить строку только с цифрами, что бы воспользоваться str.toInt();, а это только лишний геморой.
В переменной Value и так только цифры и вытаскивается это без гемороя совсем
Т.е. выдергиваем все символы из переменной slovo после 8 симлова и получаем как раз 350 (если шлем SensorID350)
Все прекрасно работает. Выдает 700 (при посылке SensorID350). Я пытался как то "понасиловать" toInt, НО писал его как ToInt и код компиляцию не проходил)))
Сделайте функцию "вытаскивания цифр для случая, если цифры могут быть в разных позициях:
Большое спасибо, но цифр в случайном месте не будет, я это отслеживать хочу на ПК. т.е. к Arduino уже будут поступать правильно скоректированные данные.