как написать функцию для новой строки

#c #serial-port #newline #eol #linefeed

#c #последовательный порт #перевод строки #eol

Вопрос:

Я работаю над программой на C с некоторыми AT terminal, и мой код был необходим для определения многих строковых переменных, таких как:

 const char  *AT_norn           = "AT";
const char  *AT                = "ATrn";
const char  *ATI               = "ATIrn";
  

Например, у меня есть 30 или более команд AT, подобных приведенным выше, для последовательной печати.
Итак, у меня вопрос,
Я пытаюсь создать новую строку, которая похожа

    const char  *myeol                = "rn";
  

ДЛЯ того, чтобы выдать «ATrn»

Я пытался написать что-то подобное, но безуспешно:

 UART_write(handle, AT_norn, sizeof(AT_norn));
UART_write(handle, myeol, sizeof(myeol));
  

Как я могу использовать описанный выше метод для экономии некоторого объема оперативной памяти?

Комментарии:

1. Как насчет написания функции-оболочки, UART_write_with_eol() которая автоматически добавляет "rn" к каждой строке? (ваш sizeof по-прежнему неверен)

2.Вы могли бы написать UART_write_str функцию для записи строки, заканчивающейся нулем. Что-то вроде int UART_write_str(UART_Handle handle, const char *s) { return UART_write(handle, s, strlen(s)); } .

Ответ №1:

Определение AT_norn как

 const char  *AT_norn           = "AT";
  

sizeof AT_Norn возвращает размер указателя, который вы хотите

 const char  AT_norn[]           = "AT";
  

для того, чтобы получить размер массива.

Ответ №2:

Как уже упоминалось, sizeof в вашем подходе не работает, потому что он будет вычисляться до размера указателя, а не строкового литерала, на который он указывает.


Если ваша цель — уменьшить использование оперативной памяти, вы могли бы заменить свои переменные макросами.

 #define AT  "AT"
#define ATI "ATI"
  

Это приведет к удалению переменных-указателей в оперативной памяти.
Сами строки, вероятно, находятся в ПЗУ.

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

Определение макросов приводит к включению только тех строк, которые фактически используются. Строки, которые используются несколько раз в файле, должны храниться компилятором в одном и том же месте.

Это также позволяет использовать, sizeof поскольку sizeof вычисляется количество символов, используемых для хранения строкового литерала.

Это также будет работать с массивами, как предложено в ответе Дэвида.


Тогда вы могли бы вообще исключить необходимость сохранения EOL, добавив новую функцию, которая делает это за вас:

 void UART_write_AT(int handle, unsigned char *buf, size_t len) {
  UART_write(handle, buf, len);
  UART_write(handle, "rn", 2);
}
  

Я не проверял правильность типов параметров или возвращаемого значения. Вы можете приспособиться к своим потребностям.


Тогда вы можете вызвать ее следующим образом:

 UAR_write_AT(handle,ATI,sizeof(ATI)-1);
  

Обратите внимание, -1 поскольку sizeof включает в себя завершающий 0 байт для строковых литералов, которые не должны отправляться в UART.

Комментарии:

1. Ну, это зависит. Если вы включили это в счетчик, то оно будет отправлено в UART. Я бы предположил, что yout НА канале не ожидает получить 0 байт. Я бы сказал, что эта страница не является хорошим примером.