我正在使用连接到我自己的PCB上的STM32F303RE Nucleo板进行RS-232串行通信,我无法弄清楚为什么此代码在某些情况下不起作用。
我正在使用HAL函数(HAL_UART_Transmit和HAL_UART_Receive)进行通信,使用了适用于usart2的Nucleo上的USB连接器以及适用于usart1的自己PCB上的9针RS-232串行端口。两种usart配置均由HAL设置。
当我仅使用USB连接(usart2)进行通信(使用Putty端子)时,代码工作正常。当我将usart1用于Tx和usart2用于Rx时,仍然没有问题。当我将usart2用于Tx并将usart1用于Rx时,它也可以正常工作。
问题是当我尝试同时使用usart1(这是我的RS-232电缆)同时用于Tx和Rx时。我的处理器可以很好地传输初始数据,但是当需要接收数据时,什么也没有使它进入接收的数据寄存器。我有一些代码可以简单地在传输线上回显任何接收到的数据,并且在此配置中没有任何结果。再说一遍-该代码在usart1和usart2的其他所有配置中均可正常工作,以便进行发送和接收,但是当我尝试在usart1(RS-232)上进行所有操作时,则没有Rx
这是我正在使用的代码的相关部分。 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; }
我不明白为什么完全相同的代码会在4种情况中的3种而不是4种情况下工作。我已经检查了串行电缆,当仅用于Tx或仅用于Rx时,其余RS-232硬件功能正常。但是,当试图同时使用RS-232时,Rx似乎受到某种阻碍。
编辑:添加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__);
}
}