Запись данных с Serial d EEPROM
- Войдите на сайт для отправки комментариев
Втр, 02/07/2013 - 06:57
Кусок кода
void loop() { if (Serial.available() > 0) { serial = Serial.read(); if (serial==42) { Serial.print (ip1); Serial.print ("."); Serial.print (ip2); Serial.print ("."); Serial.print (ip3); Serial.print ("."); Serial.print (ip4); Serial.println (); Serial.println ("Enter the new IP: 1_2_3.4_5_6.7_8_9.10_11_12"); Serial.println ("1: "); do { ips1 = Serial.read();} while (ips1 >0); Serial.println ("2: "); do { ips2 = Serial.read();} while (ips2 >0); Serial.println ("3: "); do { ips3 = Serial.read();} while (ips3 >0); Serial.println ("4: "); do { ips4 = Serial.read();} while (ips4 >0); Serial.println ("5: "); do { ips5 = Serial.read();} while (ips5 >0); Serial.println ("6: "); do { ips6 = Serial.read();} while (ips6 >0); Serial.println ("7: "); do { ips7 = Serial.read();} while (ips7 >0); Serial.println ("8: "); do { ips8 = Serial.read();} while (ips8 >0); Serial.println ("9: "); do { ips9 = Serial.read();} while (ips9 >0); Serial.println ("10: "); do { ips10 = Serial.read();} while (ips10 >0); Serial.println ("11: "); do { ips11 = Serial.read();} while (ips11 >0); Serial.println ("12: "); do { ips12 = Serial.read();} while (ips1 >0); ipc1= (ips1-48)*100+(ips2-48)*10+ips3-48; EEPROM.write (ipc1, 0); ipc2= (ips4-48)*100+(ips5-48)*10+ips6-48; EEPROM.write (ipc2, 1); ipc3= (ips7-48)*100+(ips8-48)*10+ips9-48; EEPROM.write (ipc3, 2); ipc4= (ips10-48)*100+(ips11-48)*10+ips12-48; EEPROM.write (ipc4, 3); Serial.println ("New IP: "); Serial.print (ipc1); Serial.print ("."); Serial.print (ipc2); Serial.print ("."); Serial.print (ipc3); Serial.print ("."); Serial.print (ipc4); } }
Дело собственно в функции ввода. Необходимо ожидание дуиной ввода какого либо числа. Но ардуинка не ждет. ткните плз носом где ошибка?
1. Посмотрите на строки 61-63. Возможно и в других местах есть такие очепятки.
2. Может быть стоит попробовать обнулить все ваши ips1...ips12, а потом в каждом из дюжины цикликов заменить условия выхода с while(ipsXX>0); на while(ipsXX==0);?
3. По каким соображениям вы отказались от использования массивов? 48 строк (16...63) вполне можно было бы сократить до четырех-пяти.
1. Посмотрите на строки 61-63. Возможно и в других местах есть такие очепятки.
2. Может быть стоит попробовать обнулить все ваши ips1...ips12, а потом в каждом из дюжины цикликов заменить условия выхода с while(ipsXX>0); на while(ipsXX==0);?
3. По каким соображениям вы отказались от использования массивов? 48 строк (16...63) вполне можно было бы сократить до четырех-пяти.
1. исправил, спасибо.
2. обнуление есть в водной части программы
Исправил на while(ipsXX==0); толку нет.
3. думал, но что то пока не получилось....
Не ждет потому, что в буфере порта уже есть данные. Нужно очищать буфер, например так
Затем читать например так
(не совсем оптимальный код, но работает) выдает byte, длинной numl, ждет ввода время wait
Есть аналогичная встроенная функция, но у меня с ней постоянно глюки...
>обнуление есть в водной части программы
Во первых - нужно было это давать сразу. Это тоже важно. Может вы с типом ошиблись (кстати зачем тут int, почему не byte?). Во вторых - если вы дали "обрезанный кусок" - значит у себя никто не сможет проверить-запустить (то есть - вы снизили шансы на ответ).
Так же, "в водной части" - это значит один раз выполнится. При запуске. Значит скетч ваш, сможет один раз только считать все верно (что не есть здорово).
Но,IMHO, тут подход совсем не верный. Код сильно дублирован/раздут. А значит где-то очепятатся/ошибился - легче, а найти - труднее.
Что, похоже вы и сделали в строке 63. Там не ips12 предполагалось?
Как только возникает желание объявить кучу переменных типа ips1,ips2,ips3..... это явный кандидат на использование массив (array)
Вот что-то такое можно сделать
тогда
можно писать что-то типа:
В третьих... а зачем вообще столько ips? если IP-шник это по определению четыре байта? А есть еще Arduino - ParseInt
То есть, что-то типа
Ну, что-бы это работало, без "секундных пауз" нужно что-бы в терминал мониторе Line Ending был выставлен передавать конец строки (что-бы по нажатию Enter отдавало символ "перевод строки").
P.S. И перечитайте еще раз внимательней EEPROM.write() | Аппаратная платформа Arduino . При записи, адресс куда будет сохранено значение - это первый параметр, а не второй.
Выше вам дали направление, вот рабочий пример на всякий:
Всем спасибо!
Буду грызть.