Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Проблеммы при работе со строками Keil 5

Пн янв 28, 2019 22:53:35

Первая проблема, такой код:

Код:
volatile char RX_BUF[80] = {'\0'};

void USARTSend(const unsigned char *pucBuffer)
{
/////////////////////////////////////////////////////////////////////////////////////////   
while (*pucBuffer)
  {
  USART_SendData(USART1, *pucBuffer++);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
  }
////////////////////////////////////////////////////////////////////////////////////////   
}

...
  USARTSend("\r\nI has received a line:\r\n");
  USARTSend(RX_BUF);
...



оба вызова функции приводит к такой ошибке:
user/main.cpp(162): error: no matching function for call to 'USARTSend'
USARTSend(RX_BUF);
^~~~~~~~~

Как сделать правильно?

Вторая проблема, где находится стандартная функция преобразование регистра строки "strupr" (в string.h её нет)?


Keil 5 С++

Re: Проблеммы при работе со строками Keil 5

Вт янв 29, 2019 05:32:45

Как сделать правильно?
Передавать в функцию аргументы того типа, который она ожидает. В твоём случае принимать в функцию аргументы того типа которые могут быть в неё переданы.
Код:
void USARTSend(const char *pucBuffer);


Вторая проблема, где находится стандартная функция преобразование регистра строки "strupr" (в string.h её нет)?
Эта функция не является стандартной.

Re: Проблеммы при работе со строками Keil 5

Вт янв 29, 2019 11:26:38

Спасибо.

Новый вопрос - RX_BUF это не константа, можно ли как то хранить константу "\r\nI has received a line:\r\n" во флэше, но не писать
две одинаковые функции для разных типов переменных?


Т.е. функция "strupr" не входит в стандартную поставку Keil 5.26, надо качать откуда нибудь, или искать самому?

Re: Проблеммы при работе со строками Keil 5

Вт янв 29, 2019 11:36:25

можно ли как то хранить константу "\r\nI has received a line:\r\n" во флэше, но не писать
две одинаковые функции для разных типов переменных?

Твоя строка и так во флеш должна попадать и как видишь функции все равно, главное типы привести. Хотя не для всех архитектур так, в том же AVR такое не будет работать.

Т.е. функция "strupr" не входит в стандартную поставку Keil 5.26, надо качать откуда нибудь, или искать самому?

Написать самому, стандартных функций преобразования регистра строк нет даже в С++, есть только для символов.

Re: Проблеммы при работе со строками Keil 5

Вт янв 29, 2019 14:20:21

Твоя строка и так во флеш должна попадать и как видишь функции все равно, главное типы привести. Хотя не для всех архитектур так, в том же AVR такое не будет работать.
Есть компилятор, который позволяет такое сделать на AVR. Это, конечно, злобный хак, но...
СпойлерИзображение
generic.png
(66.32 KiB) Скачиваний: 68


Т.е. функция "strupr" не входит в стандартную поставку Keil 5.26, надо качать откуда нибудь, или искать самому?
Написать самому, использую функцию преобразования для одного символа.

Re: Проблеммы при работе со строками Keil 5

Вт янв 29, 2019 15:07:16

Спасибо за ответы.

Re: Проблеммы при работе со строками Keil 5

Пт фев 01, 2019 14:00:58

VladislavS писал(а):Есть компилятор, который позволяет такое сделать на AVR. Это, конечно, злобный хак, но...
ну, положим, avr-gcc это тоже может и весьма успешно... курить __memx
Код:
void put_str(const __memx char *str){
   while(*str) UDR = *str++; // я знаю, что надо ждать готовности USART, это просто пример использования __memx
}

char str1[] = "From RAM";
const __flash char str2[] = "From FLASH";

int main(void){
   put_str(str1);
   put_str(str2);
}
Ответить