Comments (78)
Здравствуйте.
MsTimer2::set(SV_CYCLEREC_MS, thrProc);
MsTimer2::start();
заменить на
Timer0.attachInterrupt(thrProc).start(SV_CYCLEREC_MS);
from svisual.
Спасибо, заменил. Теперь скетч загружается успешно. Но модуль в SVMonitor не появляется.
Может быть, ещё что-то нужно изменить при использовании другого таймера?
from svisual.
Да вроде ничего больше не надо.
Попробуйте поотлаживать так: напишите в функцию thrProc где-нидь Serial.print("Hello"), и запустите в Arduino IDE, то есть без подключения к SVMonitor. Тем самым проверите что функция отправки данных вызывается внутри по таймеру.
Потом можно дальше копать.
from svisual.
Не работает.
Хотя я не уверен, что написал правильно.
from svisual.
Правильно все.
Значит надо разбираться с DueTimer.
Попробуйте Timer1 сделать:
Timer1.attachInterrupt(thrProc).start(SV_CYCLEREC_MS);
Вот здесь у него есть примеры, посмотрите:
https://github.com/ivanseidel/DueTimer/tree/master/examples
В интернете еще поищите примеры с DueTimer.
from svisual.
А. Нет. Неправильно.
Функция thrProc - это моя ф-я.
Ее на править в https://github.com/Tyill/SVisual/blob/master/src/SVArduino/sv_client.cpp#L88
from svisual.
from svisual.
Попробовал Timer1 – ни чего не изменилось. А вот дальше:
Может быть, МИЛЛИсекунды в MsTimer2 и МИКРОсекунды в DueTimer?
from svisual.
Да, точно, там микросекунды:
To call a function handler every 1000 microseconds:
Сделайте так тогда:
Timer1.attachInterrupt(thrProc).start(SV_CYCLEREC_MS * 1000);
from svisual.
Сделал: "Timer1.attachInterrupt(thrProc).start(SV_CYCLEREC_MS * 1000);".
В мониторе порта "Hello" печатает, но в SVMonitor модуль не появляется.
Где-то что-то ещё не так.
from svisual.
Проверьте еще раз как сейчас выглядит ф-я thrProc, когда вы работаете с SVMonitor.
Должна выглядеть так:
void thrProc (){
objCln.doSendCycle();
}
То есть без всяких Serial.print(...), которые вы добавляли для проверки.
Можете файлы мне отправить, которые вы поменяли в SVArduino, я их посмотрю еще.
from svisual.
Да, вот папка из c:\Program Files (x86)\Arduino\libraries\
from svisual.
Все правильно вроде. Должно работать все.
Можете попробовать в ArduinoIDE запустить, то есть без подключения к SVMonitor,
в Serial.print(...) ничего не надо писать.
Программа тестовая:
void setup() {
bool ok = svisual::connectOfCOM("test");
}
int cnt = 0;
void loop() {
svisual::addIntValue("dfv", cnt);
++cnt;
if (cnt > 10) cnt = 0;
bool odd_cnt = cnt % 2;
svisual::addBoolValue("bFW", odd_cnt);
svisual::addBoolValue("bBW", !odd_cnt);
delay(200);
}
Посмотрите монитора порта в ArduinoIDE, должен показывать данные.
from svisual.
В мониторе порта ArduinoIDE только "=".
from svisual.
Тоже самое сделайте, только с MsTimer, то есть обратно на MsTimer верните как было.
Посмотрим.
from svisual.
К сожалению MsTimer2 не работает с AVR контроллером.
#error Unsupported CPU type
#error MsTimer2 library only works on AVR architecture
from svisual.
То есть наоборот работает только с AVR, а Due ARM.
from svisual.
Ладно тогда с этим MsTimer.
Я помню что писал в монитор, когда данные передавал.
Сейчас значит ничего не пишет.
Дальше надо значит отладочные сообщения писать в каждую функцию, которая должна вызываться, таким образом:
void thrProc(){
Serial.print("thrProc")
void sv_client::doSendCyc(){
Serial.print("sv_client::doSendCyc")
bool sv_client::sendData(){
Serial.print("sv_client::sendData")
bool sv_client::sendDataOfCom(){
Serial.print("sv_client::sendDataOfCom")
То есть надо понять где затык, потом из-за чего.
И запускать все это дело из под ArduinoIDE, то есть SVMonitor не подключать.
from svisual.
Отладочные сообщения добавил в функции. В результате в мониторе:
thrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCycthrProcsv_client::doSendCyct
from svisual.
вот видите, нет sv_client::sendData().
Уберите все отладоч сообщения, чтобы не мешали.
Дальше ставьте отладочные сообщения в ф-ии sv_client::doSendCyc(), например здесь:
void sv_client::doSendCyc(){
// connection support
if (!isConnect_)
isConnect_ = tcpConnect();
Serial.print("isConnect = ");Serial.print(isConnect); Serial.print("\n");
// check active value in current cycle
int prevCyc = curCycCnt_ - 1; if (prevCyc < 0) prevCyc = SV_PACKETSZ - 1;
int sz = values_.size(); valueRec* vr;
for (int i = 0; i < sz; ++i){
vr = (valueRec*)values_.at(i);
if (!vr->isActive){
vr->vals[curCycCnt_] = vr->vals[prevCyc];
if ((vr->type == valueType::tBool) && vr->isOnlyFront)
vr->vals[curCycCnt_].tBool = false;
}
vr->isActive = false;
}
int next = curCycCnt_ + 1;
Serial.print("next = "); Serial.print(next); Serial.print("\n");
// send data
if (next >= SV_PACKETSZ) {
Serial.print("beforeSendData"); Serial.print("\n");
isConnect_ = (isConnect_) ? sendData() : false;
curCycCnt_ = 0;
}
else
++curCycCnt_;
}
from svisual.
Поскольку "sv_client.cpp:339:44: error: 'isConnect' was not declared in this scope",
Заменил "Serial.print("isConnect = ");Serial.print(isConnect); Serial.print("\n");"
на "Serial.print("isConnect_ = ");Serial.print(isConnect_); Serial.print("\n");".
В результате:
from svisual.
После "Serial.print("next = "); Serial.print(next); Serial.print("\n");"
напишите еще:
Serial.print("SV_PACKETSZ= "); Serial.print(SV_PACKETSZ); Serial.print("\n");
Дальше. Сюда поставьте запись:
bool sv_client::sendData(){
Serial.print("sendData");
bool ok = isCom_ ? sendDataOfCom() : sendDataOfEthernet();
return ok;
}
И сюда:
bool sv_client::sendDataOfCom(){
Serial.print("sv_client::sendDataOfCom");
}
from svisual.
Добавил записи, может быть, посмотрите файл, насколько правильно.
from svisual.
Да все правильно. Дальше то что пишет после "next = 9"?
Вы понимаете что мы делаем?
Мы пытаемся понять, почему не заходит в функцию sendDataOfCom, соответственно не передает данные.
from svisual.
Дальше то что пишет после "next = 9"?
На этом останавливается.
Вы понимаете что мы делаем?
Пытаюсь вникнуть, но без Вашей помощи я с этим не разберусь.
from svisual.
Должно быть так:
isConnect_ = 1
next = 9
SV_PACKETSZ= 10
isConnect_ = 1
next = 10
SV_PACKETSZ= 10
beforeSendData
sendDatasv_client::sendDataOfCom=begin=
Но останавливается на:
isConnect_ = 1
next = 9
SV_PACKETSZ= 10
i
По аналогии с тестом "Hello", когда печатает только первые две буквы "He" и останавливается.
Может с этим таймером нужно как-то по-другому?..
from svisual.
Давайте еще одну вещь проверим, сделайте так:
void sv_client::doSendCyc(){
Serial.print("sv_client::doSendCyc\n");
return ;
// connection support
if (!isConnect_)
.
.
.
}
Подсчитаем сколько раз выведет "sv_client::doSendCyc" прежде чем заткнется.
Если заткнется, значит таймер считает только до 10, хотя не должен так работать.
from svisual.
Не затыкается. Что-то другое.
from svisual.
Замените:
// send data
if (next >= SV_PACKETSZ) {
Serial.print("beforeSendData"); Serial.print("\n");
isConnect_ = (isConnect_) ? sendData() : false;
curCycCnt_ = 0;
}
else
++curCycCnt_;
на
// send data
if (next >= SV_PACKETSZ) {
Serial.print("beforeSendData"); Serial.print("\n");
if (isCom_)
sendDataOfCom();
else
sendDataOfEthernet();
curCycCnt_ = 0;
}
else
++curCycCnt_;
Дальше здесь, закомментируйте "Serial.flush();":
bool sv_client::sendDataOfCom(){
Serial.print("sv_client::sendDataOfCom");
int sz = values_.size();
if (sz == 0) return true;
//Serial.flush();
const char* start = "=begin=";
.
.
.
from svisual.
from svisual.
вы это уберите, иначе не идет дальше:
void sv_client::doSendCyc(){
//Serial.print("sv_client::doSendCyc\n");
//return ;
from svisual.
Убрал.
from svisual.
покажите файл sv_client.cpp
from svisual.
from svisual.
from svisual.
sv_client.zip
пробуйте. что напишет - сюда.
Тяжелый случай какой-то. Мне пока кажется, что в размерности типов проблема, там есть места где я подразумеваю размеры, а надо было sizeof писать. Ну это ладно пока, смотрим дальше.
from svisual.
Вот что получается:
from svisual.
идем дальше. что напишет - сюда.
from svisual.
from svisual.
дальше. что напишет - сюда.
from svisual.
Не пишет, только "=".
К сожалению, не было возможности проверить раньше.
from svisual.
дальше.
from svisual.
from svisual.
дальше.
from svisual.
from svisual.
Замените
bool sv_client::connectOfCOM(const char* moduleName, int speed){
.
.
.
Serial.begin(speed); -> Serial3.begin(speed);
from svisual.
Если не пойдет еще так попробуйте:
bool sv_client::connectOfCOM(const char* moduleName, int speed){
.
.
.
Serial.begin(speed);
SerialUSB.begin(speed);
from svisual.
Первый вариант – ошибка компиляции.
А второй однократно печатает "=".
sv_client.zip
from svisual.
пробуйте так.
from svisual.
То же самое, только "=".
from svisual.
еще раз.
from svisual.
поправил. предыд-й с ошибкой.
from svisual.
Не получается:
\sv_client.cpp:311:35: error: no matching function for call to 'UARTClass::write(svisual::valueType&, int)'
Serial.write(data->type, 4);
\sv_client.cpp:316:47: error: call of overloaded 'write(int&, int)' is ambiguous
Serial.write(data->vals[j].tInt, 4);
\sv_client.cpp:318:49: error: no matching function for call to 'UARTClass::write(float&, int)'
Serial.write(data->vals[j].tFloat, 4);
\sv_client.cpp:325:12: error: 'pAuxSD' was not declared in this scope
delete pAuxSD;
from svisual.
так.
from svisual.
Эти ошибки остались:
\sv_client.cpp:311:35: error: no matching function for call to 'UARTClass::write(svisual::valueType&, int)'
Serial.write(data->type, 4);
\sv_client.cpp:316:47: error: call of overloaded 'write(int&, int)' is ambiguous
Serial.write(data->vals[j].tInt, 4);
\sv_client.cpp:318:49: error: no matching function for call to 'UARTClass::write(float&, int)'
Serial.write(data->vals[j].tFloat, 4);
from svisual.
from svisual.
То же самое: "=".
from svisual.
Только: "=".
from svisual.
Попробуйте увеличить размер внутреннего буфера, подробнее о нем тут
http://mypractic-forum.ru/viewtopic.php?t=11
поставьте 256 байт:
#define SERIAL_TX_BUFFER_SIZE 256
#define SERIAL_RX_BUFFER_SIZE 256
from svisual.
Поставил 256.
HardwareSerial.zip
sv_client.zip
from svisual.
Не могу оценить, насколько это проще, но может быть попробовать подойти с другой стороны, адаптировать DueTimer к SVMonitor?
from svisual.
DueTimer не причем.
Здесь я думаю буфер переполняется (в который Serial.write пишет перед физической отправкой).
Попробуйте, еще пример сократить, только 1 переменную записывать:
#include <SVClient.h>
void setup() {
bool ok = svisual::connectOfCOM("test");
}
int cnt = 0;
void loop() {
svisual::addIntValue("dfv", cnt);
++cnt;
if (cnt > 10) cnt = 0;
bool odd_cnt = cnt % 2;
delay(200);
}
from svisual.
.
from svisual.
С одной переменной заработало.
from svisual.
ну вот и хорошо.
попробуйте буфер увеличить еще до 1024. И 3 переменные как в исходном примере записать.
(чтобы точно убедится что в нем дело)
from svisual.
Буфер увеличил, так как на скриншоте.
С тремя не работает, с двумя тоже.
from svisual.
значит не в буфере дело, да и настройки общие поди для всех мк.
обратно верните настройки по буферу, которые были (выше скрин был с ними).
Такой вопрос, вы когда грузите скетч, он же пишет сколько памяти осталось в мк.
Посмотрите, может впритык. Скрин сделайте.
from svisual.
Настройки буфера вернул, память использует только 6%.
from svisual.
Может быть дело в разной разрядности Mega и Due?
from svisual.
Посмотрите сколько напишет:
void setup() {
}
void loop() {
Serial.print("int sz "); Serial.print(sizeof(int)); Serial.print("\n");
Serial.print("long int sz "); Serial.print(sizeof(long int)); Serial.print("\n");
delay(200);
}
from svisual.
Пишет четыре.
from svisual.
Посмотрел еще раз код.
Ну, не вижу где это (int32) могло повлиять. Везде правильно указываю размеры, когда вызываю Serial.write.
Так. Давайте попробуем отказаться от DuoTimer. Вручную если будете передавать данные, добавил для этого метод 'manualSendData':
void setup() {
svisual::connectOfCOM("test");
}
int cnt = 0;
void loop() {
svisual::addIntValue("dfv", cnt);
++cnt;
if (cnt > 10) cnt = 0;
bool odd_cnt = cnt % 2;
svisual::addBoolValue("bFW", odd_cnt);
svisual::addBoolValue("bBW", !odd_cnt);
svisual::manualSendData();
delay(SV_CYCLEREC_MS);
}
from svisual.
Без таймеров наконец-то заработало, тест во всяком случае.
Попробую Ethernet, и уменьшить SV_CYCLEREC_MS, нужно ли при это изменять SV_PACKETSZ?
from svisual.
Отлично.
Какой можно вывод сделать из всей этой эпопеи - пока думаю, что все таки dueTimer что-то там неправильно работает, или какое-то влияние на Serial оказывает.
SV_CYCLEREC_MS, нужно ли при это изменять SV_PACKETSZ
нет, они между собой не связаны.
from svisual.
БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ.
Если не трудно, расскажите, пожалуйте более подробно о "SV_PACKETSZ" (размер пакета, как я понимаю).
В зависимости от чего нужно изменять и как он коррелируется с количеством переменных.
В моём, конкретном случае, это 12 целочисленных (10bit) и 18 булевых.
"SV_CYCLEREC_MS" при этом желательно - 1MS, 10 – приемлемо, ну а 100 край.
from svisual.
SV_PACKETSZ зачем вообще нужен. Этот параметр задает количество значений переменной, которое за раз передается на сервер (SVMonitor). Это разгружает линию передачи и обработку, иначе бы пришлось передавать каждое значение.
SV_PACKETSZ может принимать значения от 1 до ... какого-то приемлемого значения. Чем больше, тем больший буфер будет в памяти МК для каждой переменной, например, SV_PACKETSZ = 10, значит буфер в МК для переменной 4 * 10 = 40 байт.
SV_CYCLEREC_MS может принимать значения от 10 мс.
То есть 10 мс это принятый мной минимум.
Потому что, если ниже ставить, архив записей на диске начинает занимать гигабайты.
Ну и посчитал что, нет смысла чаще писать, это уже сфера осциллографа.
from svisual.
В вашем случае можно не трогать SV_CYCLEREC_MS, оставить по умолчанию (100мс).
А цикл опроса датчиков, сделать 1мс.
Получится так:
vaoid setup() {
svisual::connectOfCOM("test");
}
int svSendCnt = 0;
int cnt = 0;
void loop() {
++cnt;
if (cnt > 10) cnt = 0;
bool odd_cnt = cnt % 2;
if ((svSendCnt % SV_CYCLEREC_MS) == 0) {
svisual::addIntValue("dfv", cnt);
svisual::addBoolValue("bFW", odd_cnt);
svisual::addBoolValue("bBW", !odd_cnt);
svisual::manualSendData();
}
++svSendCnt;
delay(1);
}
from svisual.
from svisual.
Related Issues (20)
- Просмотр в браузере HOT 1
- Баг при экспорте HOT 2
- Win32 32bits version HOT 2
- Создать Docker образ и выложить на Docker Hub HOT 1
- Raspberri Pi3 Ubuntu Mate HOT 2
- При соединении Arduino по Ethernet не появляется модуль в SVMonitor. HOT 6
- Цвет графика как атрибут сигнала, определяемый пользователем. HOT 1
- SVisual Client in C not C++ HOT 4
- Proposals for improvement of SVMonitor HOT 1
- proposal for features, potential bugs HOT 6
- Перенос сигналов bool в верхнею область окна. HOT 4
- Linux compilation errors HOT 2
- sorting function is not right HOT 12
- How to compile/run in Ubuntu HOT 2
- Unable to copy table data HOT 1
- SVViewer crash HOT 2
- SV Viewer not open new dataset HOT 5
- SV Viewer Settings HOT 2
- Virtual Channels often stuttering HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from svisual.