Вверх ↑
Этот топик читают: Гость
Ответов: 146
Рейтинг: 1
#1: 2015-12-25 16:13:24 ЛС | профиль | цитата
Доброго всем времени суток.
Хочу сделать проект считывать данные с АЦП Arduino DUE
Ардуино запрограммировал так чтобы она в COM порт на скорости 9600 отправляла данные в диапазоне от 0 до 4095, а на для начала я хочу получить эти данные а потом обработать с использованием графики.

На форуме нашел пример немного оптимизировал его под себя и он не пошел у меня к сожалению, помогите разобраться пожалуйста?

code_36688.txt
карма: 0

0
файлы: 1code_36688.txt [1KB] [463]
Ответов: 8959
Рейтинг: 824
#2: 2015-12-25 17:15:04 ЛС | профиль | цитата
legandox, в каком формате ваш Arduino отправляет данные, те самые от "0" до "4095" (12-ти битным словом, двумя байтами (знаковое целое, беззнаковое целое), четырьмя байтами (каждый байт-символ цифры))
карма: 19

0
Ответов: 146
Рейтинг: 1
#3: 2015-12-26 02:54:08 ЛС | профиль | цитата

Леонид, а как определить двумя байтами (знаковое целое, беззнаковое целое), четырьмя байтами (каждый байт-символ цифры)?

Я сторонней программой прочитал COM порт (скриншот ниже), и как я понял он принимает вот такие значения 38 36 30 0D 0A 38 31 36 0D 0A 37 37 34 0D 0A 37

[img] http://s019.radikal.ru/i620/1512/15/8f20aa6afce2.png [/img]

карма: 0

0
Ответов: 8959
Рейтинг: 824
#4: 2015-12-26 11:14:00 ЛС | профиль | цитата
legandox, это не он принимает, а ваша "сторонняя программа" переводит в шестнадцатиричный вид принятые байты
Уберите конвертор из вашей схемы и получите на выходе байты (коды символов) которые выдаёт ваш Ардуино, и любой интерфейсный компонент покажет:
38=56=8
36=54=6
30=48=0 (Строка: 860)
0D=13
0A=10 (Перевод строки)
38=56=8
31=49=1
36=54=6 (Строка: 816)
0D=13
0A=10 (Перевод строки)
37=55=7
37=55=7 (Строка: 77)
------------ Дoбавленo в 10.38:
Add(Timer,11901500,546,280)
{
Interval=10
Enable=1
link(onTimer,16112240:doData,[])
}
Add(DoData,16112240,595,280)
{
Data=Integer(2)
link(onEventData,10903250:doRead,[])
}
Add(Hub,15962356,483,252)
{
OutCount=3
link(onEvent1,10903250:doOpen,[])
link(onEvent2,11901500:doTimer,[(521,265)(521,286)])
}
Add(Button,6627573,434,252)
{
Left=10
Top=52
Caption="Start"
link(onClick,15962356:doEvent1,[])
}
Add(Button,1445190,434,322)
{
Left=10
Top=75
Caption="Stop"
link(onClick,13915471:doEvent1,[])
}
Add(Hub,13915471,483,322)
{
OutCount=3
link(onEvent1,10903250:doClose,[(641,328)(641,265)])
link(onEvent2,11901500:doStop,[(520,335)(520,293)])
}
Add(MainForm,3499755,434,203)
{
}
Add(Edit,10797025,630,203)
{
Left=15
Top=10
Text="3"
DataType=2
}
Add(Memo,13054824,700,259)
{
Left=160
Top=10
Width=170
Height=250
ScrollBars=3
}
Add(COM,10903250,651,252)
{
Port=2
link(onRead,13054824:doAdd,[])
link(Port,10797025:Text,[(657,243)(636,243)])
link(BaudRate,12135757:Text,[(664,243)(678,243)])
}
Add(Edit,12135757,672,203)
{
Left=80
Top=10
Text="9600"
DataType=2
}
И уж до кучи: скорость порта в бит/сек, каждый байт это 10 бит (8 значащих плюс старт/стоповые биты), чтобы не пропустить входящие данные число обращений в секунду (таймер) умноженное на количество считываемых байт должно быть чуть больше установленной скорости делённой на 10.
карма: 19

0
Ответов: 146
Рейтинг: 1
#5: 2015-12-26 14:11:10 ЛС | профиль | цитата
Леонид, присланная Вами схема хоть чуть начала работать, но в текстовом поле появляются пустые строки (как будто щелкали много раз enter-ом)

Я на ардуино (внутри микроконтроллера) тип данных присваиваю int и направляю в COM порт.


Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)

Следовательно цифра 2 которая стоит в блоке DoData верна, хотя я и попробовал другие значения (4,8,16,32)
карма: 0

0
Ответов: 8959
Рейтинг: 824
#6: 2015-12-26 18:44:41 ЛС | профиль | цитата
legandox, схема выложена вами, я удалил конвертор
СОМ порт имеет свой буфер, в котором принятые данные накапливаются, выдаётся из буфера столько байт, сколько запросили. Чем чаще идёт обращение к порту, тем больше нагрузка на компьютер, поэтому лучше пореже обращаться, но брать побольше с учётом установленной скорости. Так как вы (компьютер) не знаете, когда и сколько байт придёт, возможно разбиение слова по запросам: один байт в первом обращении, второй в следующем. Поэтому данные на выходе сшиваются и затем распарсиваются по каким-либо признакам, в вашем случае, наверное, по символам "10" и "13". Пустые строки можно отсеять с помощью If-Else.
code_36693.txt А ещё у нас есть порт COMEX, который выдаёт данные сам по мере прступления
карма: 19

0
файлы: 1code_36693.txt [1.8KB] [497]
Ответов: 146
Рейтинг: 1
#7: 2015-12-27 02:51:47 ЛС | профиль | цитата
Леонид, Спасибо большое.

Только в блоке COM надо было на точку onread))) она у меня заработала только на другом компьютере, а на этом Windows 10 стоит программа отказалась работать!)

И еще я провел эксперимент помимо цифр еще и буквы (слова) английские хорошо проходят, наши к сожалению нет.


code_36701.txt
карма: 0

0
файлы: 1code_36701.txt [2KB] [483]
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)