как обрезать неизвестные первые символы строки в кодовом видении - PullRequest
0 голосов
/ 06 января 2020

Я установил mega16 (16-битный микроконтроллер AVR) для получения данных от последовательного порта

, который подключен к модулю Bluetooth H C -05 для получения приемлемого числа

, отправленного мое приложение android и приложение android отправляют число в виде строкового массива

, максимальная длина которого равна 10 цифрам. Проблема приходит

при получении данных, так что один или два неизвестных символа (?) Существуют в

начале полученной строки. Я должен удалить эти неизвестные символы из

начала строки в случае существования. эта проблема как раз для H C -05. Я имею в виду, что у меня не было проблем при отправке чисел

другим микроконтроллером вместо android приложений.

вот что я отправляю по мобильному телефону:

"430102030405060 \ r"

и что поступает в последовательный порт микроконтроллера:

"?? 430102030405060 \ r" или "? 430102030405060 \ r"

вот код прерывания приемника USART:

//-------------------------------------------------------------------------

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;

if (data==0x0D)
 {
  puts(ss);printf("\r")
  a=0;
  memset(ss, '\0', sizeof(ss));
  }
 else
 {
 ss[a]=data;
 a+=1;
 }     

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index++]=data;
if RX_BUFFER_SIZE == 256
   // special case for receiver buffer size=256
   if (++rx_counter == 0) rx_buffer_overflow=1;
else
   if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      }
endif
   }
}

//-------------------------------------------------------------------------

как удалить лишние символы (?) Из начала полученных данных в Codevision?

1 Ответ

0 голосов
/ 06 января 2020

Вам не нужно их удалять, просто не передавайте их на обработку. Вы можете либо проверить символ data перед тем, как поместить его в буфер строк (ss), либо после получения полной строки найдите первый соответствующий символ и передайте только строку, начинающуюся с этой позиции, в свои функции обработки.

Var 1:

BOOL isGarbage(char c){
  return c<'0' || c > '9';
}

if (data==0x0D)
{
  puts(ss);printf("\r")
  a=0;
  memset(ss, '\0', sizeof(ss));
} else {
 if(!isGarbage(data))
 {
   ss[a]=data;
   a+=1;
 }
} 

Var2:


if (data==0x0D)
{
  const char* actualString = ss;
  while(isGarbage(*actualString )){
   actualString ++;
  }
  puts(actualString );printf("\r")
  a=0;
  memset(ss, '\0', sizeof(ss));
} else {
  ss[a]=data;
  a+=1;
} 

Однако:
возможно, вам следует попытаться решить проблему в отличие от простого устранения симптомов (подавить ' ? 'символов).

Каково точное значение сомнительных символов? Я подозреваю, что '?' используется только для представления непечатаемых данных.

Возможно, ваша конфигурация интерфейса неверна, и отправитель использует программное управление потоком данных на линии, а подозрительные символы XON / XOFF байты

Еще одно примечание:
Вы можете столкнуться с проблемами, если будете использовать более сложные функции или даже периферийные устройства из своей подпрограммы обработки прерываний (ISR).

Я бы настоятельно рекомендовал заполнять там только буферы и делать все остальные вещи в основном л oop. вызвано некоторыми буферами данных изменчивых флагов.

Также я не понимаю, почему вы используете дополнительный буфер (ss) в ISR, поскольку кажется, что RX-буфер уже существует. Реализация выглядит так, что существует хорошая реализация буфера RX-приема, которая должна иметь некоторые функции / возможности для получения содержимого буфера в основной l oop, так что вам не нужно добавлять свой собственный код в ISR.

Дополнительные дополнительные примечания:

строковый массив, максимальная длина которого равна 10 цифрам.

Я считаю больше, надеюсь, ваш ss массив больше этого, и вам также следует учитывать тот факт, что что-то может go быть неправильным при передаче, и вы получите намного больше символов до следующего '\n'. В настоящее время вы перезаписываете все свои оперативные памяти.

...