Я использую плату STM32F303RE Nucleo, подключенную к моей собственной печатной плате, для последовательной связи RS-232, и я не могу понять, почему этот код не работает при определенных обстоятельствах.
Я использую функции HAL (HAL_UART_Transmit и HAL_UART_Receive) для своих сообщений, используя разъем USB на Nucleo для usart2 и 9-контактный последовательный порт RS-232 на моей собственной плате для usart1.Обе конфигурации usart были настроены HAL.
Когда я общаюсь (используя терминал Putty), используя только соединение USB (usart2), код работает отлично.Когда я использую usart1 для Tx и usart2 для Rx, все еще никаких проблем.Когда я использую usart2 для Tx и usart1 для Rx, это также работает нормально.
Проблема в том, что я пытаюсь использовать usart1 (это мой кабель RS-232) для Tx и Rx.Мой процессор отлично передает исходные данные, но когда приходит время получать данные, ничто не попадает в регистр полученных данных.У меня есть некоторый код, который просто возвращает любые полученные данные по линии передачи, и в этой конфигурации ничего не получается.Еще раз - код прекрасно работает в любой другой конфигурации usart1 и usart2 для отправки и получения, но не Rx, когда я пытаюсь сделать все это на usart1 (RS-232)
Вот соответствующий разделкод, который я использую.COMTYPE имеет значение либо & huart1, либо & huart2 (в случае проблемы - & huart1)
Основной цикл (полученные данные используются для оператора switch в системе меню):
HAL_UART_Transmit(COMTYPE, prompt, sizeof(prompt), TIMEOUT);
cmd_size = UART_getstr(command);
cmd_num = parse_menu_input(command, cmd_size);
converted = (uint8_t)cmd_num + '0';
// error parsing command for menu selection
if(cmd_num == -1){
HAL_UART_Transmit(COMTYPE, parse_error, sizeof(parse_error), TIMEOUT);
}
else{
menu_switch(cmd_num);
}
}
Функция, содержащаяФункция Rx и функция эхо-возврата (Tx):
int UART_getstr(uint8_t* command){
int x = 0; // tracker for buffer pointer
int chars = 0;
uint8_t buffer; // single char storage for UART receive
while(1){
// get single char from UART_Receive
HAL_UART_Receive(COMTYPE, &buffer, 1, HAL_MAX_DELAY);
// echo back function
HAL_UART_Transmit(COMTYPE, &buffer, sizeof(char), TIMEOUT);
// write value of received char to "command" array
command[x] = buffer;
// increment the number of valid chars
chars++;
// stop adding chars to command after [Enter] pressed
if(command[x] == '\r'){
chars--;
break;
}
// correct for storing DELETE as char in buffer
if(command[x] == 0x7F){
command -= 1;
chars -= 2;
}
else{
x++;
}
}
command[x] = '\0';
// return length of command buffer
return chars; }
Я не понимаю, почему один и тот же код будет работать в 3 из 4 случаев, но не в 4-м.Я проверил последовательный кабель, и остальная часть аппаратного обеспечения RS-232 прекрасно работает, когда используется ТОЛЬКО для Tx или ТОЛЬКО для Rx.Но Rx кажется заблокированным чем-то при попытке использовать RS-232 для обоих.
РЕДАКТИРОВАТЬ: Добавление кода инициализации UART (генерируется HAL):
/* USART1 init function */
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
/* USART2 init function */
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}