serial прием из порта массива байт
- Войдите на сайт для отправки комментариев
Ср, 30/08/2017 - 19:54
с приложения отвравляю в порт массив байт , читаю ардуиной .
но есть проблема , начинает тупить когда в порт попадает 0x00 . Как с этим бороться ?
void sp_Read() { while(Serial.available() && !sp_packetAvailable) int bufferChar = Serial.read(); if(sp_startMarkerStatus < sp_startMarker.length()) { if(sp_startMarker[sp_startMarkerStatus] == bufferChar) { sp_startMarkerStatus++; else { sp_ResetAll(); } } else { if(sp_dataLength <= 0) { sp_dataLength = bufferChar; sp_dataLength1 = sp_dataLength; } else { if(sp_dataLength > sp_dataString.length()) { sp_dataString += (char)bufferChar; } else { if(sp_stopMarkerStatus < sp_stopMarker.length()) { if(sp_stopMarker[sp_stopMarkerStatus] == bufferChar) { sp_stopMarkerStatus++; if(sp_stopMarkerStatus == sp_stopMarker.length()) { sp_Reset(); sp_packetAvailable = true; } } else { sp_ResetAll(); } } // } } } } }
Ну, скетч, наверное, секретный, потому, ХЗ, конечно, но если имеет sp_dataString тип String (и равно bufferChar == 0х00), то в строке 27 Вы вставляете в строку терминальный символ и впредь он является признаком конца строки.
Ну, скетч, наверное, секретный, потому, ХЗ, конечно, но если имеет sp_dataString тип String (и равно bufferChar == 0х00), то в строке 27 Вы вставляете в строку терминальный символ и впредь он является признаком конца строки.
А если переделать в HEX строку , а потом в массив
1. Я по-прежнему не знаю, как описана sp_dataString
2. Я не знаю, что Вам надо, а потому откуда мне знать подойдёт Вам это или нет.
1. Я по-прежнему не знаю, как описана sp_dataString
2. Я не знаю, что Вам надо, а потому откуда мне знать подойдёт Вам это или нет.
sp_dataString - буффер ввиде строки .
Мне нужно передать массив байт в ардуино для последующей обработки
sp_dataString - буффер ввиде строки .
Вы знаете, я сейчас или прекращу нашу беседв или начну выражаться матом. Вы можете просто сказать какого типа эта перемнная?
Мне нужно передать массив байт в ардуино для последующей обработки
Если Вам надо передать массив байтов, так и принимайте его в массив байтов! Зачем Вы принимаете его в строку? Строка тех же нулей не понимает. Принимайте в массив байтов и обрабатывайте.
Потому что строку можно обнулить ! а созданный массив нет . А с безмерными массивами ардуино не работает .
String sp_dataString
Понятно, это строка. Так вот, строка не предназначена для хранения произвольных байтов, т.к. байт 0 имеет для неё особый смысл.
А потому, как Вам уже говорили, если Вам нужно принять произвольный массив байтов, то и принимайте его в массив байтов, а не в строку. Всё ведь просто - что передайте, то и принимайте. Неужели не логично? Почему Вы хотите передавать одно, а принимать другое? Сделайте так и всё будет нормально.
Про то, что Ардуино с чем-то там не работает, расскажите кому-нибудь другому.
Понятно, это строка. Так вот, строка не предназначена для хранения произвольных байтов, т.к. байт 0 имеет для неё особый смысл.
А потому, как Вам уже говорили, если Вам нужно принять произвольный массив байтов, то и принимайте его в массив байтов, а не в строку. Всё ведь просто - что передайте, то и принимайте. Неужели не логично? Почему Вы хотите передавать одно, а принимать другое? Сделайте так и всё будет нормально.
Про то, что Ардуино с чем-то там не работает, расскажите кому-нибудь другому.
Вот смотрите : Мне нужно передавать каждый раз пакеты разной длины . Я создаю пакет "</" начальный маркер , потом 1 байт - это длина пакета , потом сам пакет и конечный маркер "/>" .
Дальше ардуино должно обработать пакет и заниматься своими действиями . Ведущее устройство в этой связке компьютер . В ардуине сразу исключается вызов войда с обработкой пакета . В шапке объявить безмерный массив нельзя .
что вы можете посоветовать ?
Я не понимаю что такое "безмерный массив", массив заранее неизвестной длины? Не вижу проблемы. Длин у Вас сидит в одном байте, значит максимальная длина пакета не может быть более, чем 255 байтов. Если по смыслу задачи она ещё меньше, тем лучше. Просто объявляете массив на максимальную длину пакета, так чтобы любой пакет заведомо влез и спокойно в этот массив читаете. (это один из 100500 вариантов решения)
Я не понимаю что такое "безмерный массив", массив заранее неизвестной длины? Не вижу проблемы. Длин у Вас сидит в одном байте, значит максимальная длина пакета не может быть более, чем 255 байтов. Если по смыслу задачи она ещё меньше, тем лучше. Просто объявляете массив на максимальную длину пакета, так чтобы любой пакет заведомо влез и спокойно в этот массив читаете. (это один из 100500 вариантов решения)
Этот метод я знаю ... Но как-то топорно он выглядит )))0
Если передается длина, можно просто память выделить и набить данными.
Этот метод я знаю ... Но как-то топорно он выглядит )))0
Зато просто.
Советовать Вам динамически выделять память по мере получения байта с длиной я не буду (очень не советую!), т.к. судя по Вашим постам, Вы не готовы к таким решениям. Да и незачем. памяти заведомо хватит, вот описывайте массив и пудрите мозги ни себе, ни людям. И кстати, это будет в разы быстрее и экономичнее по памяти, чем Ваше нынешнее решение.
Этот метод я знаю ... Но как-то топорно он выглядит )))0
куда менее топорно, чем использование для этого String