#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 байт. Я бы сказал, что эта страница не является хорошим примером.