Я пытаюсь связаться с GSM-модулем через связь UART. Я мог получить сообщение от модуля, как я ожидал. Однако, когда дело доходит до того, что l oop (оно пустое), сеанс отладки заканчивается ошибкой «не удается получить доступ к цели». Шаг за шагом я собираюсь поделиться своим кодом:
Функция 1 - AT_Send. (Примечание: некоторые из переменных объявлены глобально.)
int AT_Send(UART_HandleTypeDef *huart, ATHandleTypedef *hat, unsigned char *sendBuffer, uint8_t ssize, unsigned char *responseBuffer, uint8_t rsize) {
if (HAL_UART_Transmit_IT(huart,sendBuffer,ssize) != HAL_OK) {
return -1;
}
while ((HAL_UART_GetState(huart) & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) {
continue;
}
//;HAL_Delay(1000);
if (strstr((char*)receiveBuffer,(char*)responseBuffer) != NULL) {
rxIndex = 0;
memset(command, 0, sizeof(command));
return 0;
}
rxIndex = 0;
memset(command, 0, sizeof(command));
return 1;
}
Вторая функция - функция AT_Init. Он отправляет AT, чтобы получить ответ OK. На этом этапе, если я не ошибаюсь, я открываю прерывание приема и пытаюсь получить 1 байт.
int AT_Init(UART_HandleTypeDef *huart, ATHandleTypedef *hat)
{
HAL_UART_Receive_IT(huart,&rData,1);
tx = AT_Send(huart,hat,"AT\r",sizeof("AT\r\n"),"OK\r\n",sizeof("OK\r\n"));
return tx;
}
После этих двух функций я вызываю функцию получения ИТ в обратном вызове, пока на шине есть данные.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1){
command[rxIndex] = rData;
rxIndex++;
if((rxIndex == 2) && (strstr((char*)command,"\r\n") != NULL)) {
rxIndex = 0;
} else if (strstr((char*)command,"\r\n") != NULL) {
memcpy(receiveBuffer, command, sizeof(command));
rxIndex = 0;
memset(command,0,sizeof(command));
}
HAL_UART_Receive_IT(&huart1,&rData,1);
}
}
Более того, я собираюсь отправить несколько HTTP-команд одновременно, если смогу избавиться от этой проблемы. Кто-нибудь может поделиться своими знаниями?
Редактировать: Основная функция показана ниже
tx = AT_Init(&huart1,&hat);
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
HAL_Delay(500);
}
Редактировать 2: Я заменил канал uart на USART2, и отладчик работал. Я полагаю, что это связано с оборудованием. Тем не менее мне любопытно узнать о возможных причинах этой проблемы.