serial прием из порта массива байт

Marchcat
Offline
Зарегистрирован: 06.05.2012

с приложения отвравляю в порт массив байт , читаю ардуиной .

но есть проблема , начинает тупить когда в порт попадает 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();   
            }
          }
          //
        }
      } 
    }    
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, скетч, наверное, секретный, потому, ХЗ, конечно, но если имеет sp_dataString тип String (и равно bufferChar == 0х00), то в строке 27 Вы вставляете в строку терминальный символ и впредь он является признаком конца строки.

Marchcat
Offline
Зарегистрирован: 06.05.2012

ЕвгенийП пишет:

Ну, скетч, наверное, секретный, потому, ХЗ, конечно, но если имеет sp_dataString тип String (и равно bufferChar == 0х00), то в строке 27 Вы вставляете в строку терминальный символ и впредь он является признаком конца строки.

А если переделать в HEX строку , а потом в массив 

        if(sp_dataLength > (sp_dataString.length()/2))  
        {
            sp_dataString += String(bufferChar,HEX);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Я по-прежнему не знаю, как описана sp_dataString 

2. Я не знаю, что Вам надо, а потому откуда мне знать подойдёт Вам это или нет.

Marchcat
Offline
Зарегистрирован: 06.05.2012

ЕвгенийП пишет:

1. Я по-прежнему не знаю, как описана sp_dataString 

2. Я не знаю, что Вам надо, а потому откуда мне знать подойдёт Вам это или нет.

sp_dataString - буффер ввиде строки .

Мне нужно передать массив байт в ардуино для последующей обработки 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Marchcat пишет:

sp_dataString - буффер ввиде строки .

Вы знаете, я сейчас или прекращу нашу беседв или начну выражаться матом. Вы можете просто сказать какого типа эта перемнная?

Marchcat пишет:

Мне нужно передать массив байт в ардуино для последующей обработки 

Если Вам надо передать массив байтов, так и принимайте его в массив байтов! Зачем Вы принимаете его в строку? Строка тех же нулей не понимает. Принимайте в массив байтов и обрабатывайте.

 

 

Marchcat
Offline
Зарегистрирован: 06.05.2012

Потому что строку можно обнулить ! а созданный массив нет . А с безмерными массивами ардуино не работает . 

String sp_dataString

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, это строка. Так вот, строка не предназначена для хранения произвольных байтов, т.к. байт 0 имеет для неё особый смысл.

А потому, как Вам уже говорили, если Вам нужно принять произвольный массив байтов, то и принимайте его в массив байтов, а не в строку. Всё ведь просто - что передайте, то и принимайте. Неужели не логично? Почему Вы хотите передавать одно, а принимать другое? Сделайте так и всё будет нормально.

Про то, что Ардуино с чем-то там не работает, расскажите кому-нибудь другому.

Marchcat
Offline
Зарегистрирован: 06.05.2012

ЕвгенийП пишет:

Понятно, это строка. Так вот, строка не предназначена для хранения произвольных байтов, т.к. байт 0 имеет для неё особый смысл.

А потому, как Вам уже говорили, если Вам нужно принять произвольный массив байтов, то и принимайте его в массив байтов, а не в строку. Всё ведь просто - что передайте, то и принимайте. Неужели не логично? Почему Вы хотите передавать одно, а принимать другое? Сделайте так и всё будет нормально.

Про то, что Ардуино с чем-то там не работает, расскажите кому-нибудь другому.

Вот смотрите : Мне нужно передавать каждый раз пакеты разной длины . Я создаю пакет "</" начальный маркер , потом 1 байт - это длина пакета , потом сам пакет и конечный маркер "/>" . 

Дальше ардуино должно обработать пакет и заниматься своими действиями . Ведущее устройство в этой связке компьютер . В ардуине сразу исключается вызов войда с обработкой пакета . В шапке объявить безмерный массив нельзя . 

что вы можете посоветовать ? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не понимаю что такое "безмерный массив", массив заранее неизвестной длины? Не вижу проблемы. Длин у Вас сидит в одном байте, значит максимальная длина пакета не может быть более, чем 255 байтов. Если по смыслу задачи она ещё меньше, тем лучше. Просто объявляете массив на максимальную длину пакета, так чтобы любой пакет заведомо влез и спокойно в этот массив читаете. (это один из 100500 вариантов решения)

 

Marchcat
Offline
Зарегистрирован: 06.05.2012

ЕвгенийП пишет:

Я не понимаю что такое "безмерный массив", массив заранее неизвестной длины? Не вижу проблемы. Длин у Вас сидит в одном байте, значит максимальная длина пакета не может быть более, чем 255 байтов. Если по смыслу задачи она ещё меньше, тем лучше. Просто объявляете массив на максимальную длину пакета, так чтобы любой пакет заведомо влез и спокойно в этот массив читаете. (это один из 100500 вариантов решения)

 

Этот метод я знаю ... Но как-то топорно он выглядит )))0

nik182
Offline
Зарегистрирован: 04.05.2015

Если передается длина, можно просто память выделить и набить данными.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Marchcat пишет:

Этот метод я знаю ... Но как-то топорно он выглядит )))0

Зато просто.

Советовать Вам динамически выделять память по мере получения байта с длиной я не буду (очень не советую!), т.к. судя по Вашим постам, Вы не готовы к таким решениям. Да и незачем. памяти заведомо хватит, вот описывайте массив и пудрите мозги ни себе, ни людям. И кстати, это будет в разы быстрее и экономичнее по памяти, чем Ваше нынешнее решение.

b707
Offline
Зарегистрирован: 26.05.2017

Marchcat пишет:

Этот метод я знаю ... Но как-то топорно он выглядит )))0

куда менее топорно, чем использование для этого String