Я работаю над функцией для микроконтроллера STM32, который отправляет строку заданной длины через порт uart. Чтобы обрабатывать связь uart, я создал класс Serial, у которого есть буфер передачи и приема, которые извлекаются и передаются в обработчике прерывания. Функция, над которой я сейчас работаю, на самом деле является перегрузкой функции, которую я написал ранее, которая работает. Ниже представлена рабочая функция:
void Serial::sendString(char* str) {
// Writes a string to txBuffer. If Transmit interrupts are enabled, and
// the Data register is empty, the txBuffer will be popped into the DR to
// prime the interrupts.
__HAL_UART_DISABLE_IT(uart, UART_IT_TXE); // Keeps our spaghetti straightened out...
while (*str != '\0') { // While char is not a null terminator...
txBuffer->push(*str); // Push first char into queue as we know it is valid
str++; // Pointer goes to next char in string
}
uint32_t isrflags = READ_REG(uart->Instance->SR); // Reads the flags and control register
//uint32_t cr1its = READ_REG(uart->Instance->CR1); // Into variables
// If the DR is empty and Transmission interrupts are disabled...
if ((isrflags & USART_SR_TXE) != RESET) {
uart->Instance->DR = txBuffer->pop(); // Reenable interrupts and prime the DR
}
__HAL_UART_ENABLE_IT(uart, UART_IT_TXE); // Alright, time to cook the pasta
}
Перегрузка - это функция, с которой у меня возникли проблемы. По какой-то причине отладчик показывает, что переменная i инициализируется значением 14 и не увеличивается при переходе с помощью отладчика. Фактически, отладчик вообще не позволяет мне войти в цикл for. Вот такая перегрузка:
void Serial::sendString(char* str, unsigned int len) {
// Writes a string to txBuffer. If Transmit interrupts are enabled, and
// the Data register is empty, the txBuffer will be popped into the DR to
// prime the interrupts.
// Rather than being terminated by a null character, this method instead
// sends each char in an array of a specified length. Note that this overload
// MUST be used in any situation that a null terminator might appear in a char
// array!
__HAL_UART_DISABLE_IT(uart, UART_IT_TXE); // Keeps our spaghetti straightened out...
for (unsigned int i = 0; i < len; i++) { // While char is not a null terminator...
txBuffer->push(str[i]); // Push first char into queue as we know it is valid
//str++; // Pointer goes to next char in string
}
uint32_t isrflags = READ_REG(uart->Instance->SR); // Reads the flags and control register
// uint32_t cr1its = READ_REG(uart->Instance->CR1); // Into variables
// If the DR is empty...
if ((isrflags & USART_SR_TXE) != RESET) {
uart->Instance->DR = txBuffer->pop();
}
__HAL_UART_ENABLE_IT(uart, UART_IT_TXE); // Alright, time to cook the pasta
}
Эти функции вызываются внутри терминального цикла while в main. При отладке проблемы возникают немедленно; Я вообще не могу выдержать перегрузку. Кажется, мой код просто зашел в тупик в этом месте.
Раньше мне удавалось успешно запускать перегрузку. Эта ошибка появилась только тогда, когда я пытался исправить другую ошибку в функции, когда первый символ в строке передавался только половину времени. Я установил точку останова и начал отладку, а теперь она вообще не работает ....