stm32g431cbt6使用两个串口,一个能正常收发,一个只能发送接受不到数据(不进中断)
我配置了两个工程:工程1串口1能正常收发,串口2能发送接受不到数据(不进中断)工程2串口2能正常收发,串口1能发送接受不到数据(不进中断)。找不到原因,头秃
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart2, &bRxBuffer, 1);
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
while (1)
{
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1 )
{
temp = aRxBuffer;
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
}
else if(huart->Instance == USART2 )
{
temp = bRxBuffer;
HAL_UART_Receive_IT(&huart2, &bRxBuffer, 1);
}
}
参考GPT和自己的思路,原因可能是在调用 HAL_UART_Receive_IT() 之前,中断没有被正确使能。在使用 HAL 库时,需要在 MX_USART1_UART_Init() 和 MX_USART2_UART_Init() 函数中设置好中断优先级和使能相关的中断。同时,如果两个串口的中断优先级相同,会存在一个优先级抢占的问题,导致有时只有其中一个串口能正常工作。因此,需要在 MX_NVIC_Init() 函数中设置好中断优先级和优先级分组。以下是修改后的代码,可以尝试使用:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
HAL_UART_Receive_IT(&huart2, &bRxBuffer, 1);
while (1)
{
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1 )
{
temp = aRxBuffer;
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
}
else if(huart->Instance == USART2 )
{
temp = bRxBuffer;
HAL_UART_Receive_IT(&huart2, &bRxBuffer, 1);
}
}
修改的地方是将 HAL_UART_Receive_IT() 的调用顺序改变,以先开启对串口1的接收,再开启对串口2的接收。同时,你也可以检查一下串口硬件的接线是否正确,以及波特率等配置是否正确。
检查串口接线是否正确连接。确认每个串口的TX和RX引脚是否正确连接。
检查串口的中断优先级是否正确设置。如果多个中断同时产生,需要保证优先级高的中断先被处理。可以通过HAL_NVIC_SetPriority函数设置中断优先级。
检查是否正确使能了中断。需要在初始化时使用HAL_UART_Receive_IT函数使能串口接收中断。
检查代码是否正确实现了中断处理函数。中断处理函数需要调用HAL_UART_IRQHandler函数清除中断标志,并根据需要处理接收到的数据。
如果以上步骤都没有解决问题,可以尝试使用调试工具对串口进行调试,查看数据是否正确发送和接收。也可以尝试使用不同的串口引脚或者更换硬件设备进行测试,以确定问题的具体原因。
能否把完整的工程发上来
串口引脚连接是否正确。STM32G431CBT6有多个UART口,可能需要在芯片引脚上确认您正在使用的UART口的引脚连接是否正确。
串口配置是否正确。建议您检查工程1和工程2的串口配置是否相同,例如波特率、数据位数、停止位等是否相同。
串口中断是否开启。您在 main() 函数中调用了 HAL_UART_Receive_IT() 开启了串口接收中断,但如果您在 MX_USARTx_UART_Init() 函数中没有开启中断,中断依然会无法进入。请确认您的初始化函数是否包含以下语句:
/* 使能 USART 中断 */
__HAL_UART_ENABLE_IT(&huartx, UART_IT_RXNE);
处理接收到的数据。在串口接收中断中,您处理了接收到的数据,但是没有进行有效的处理。建议您将接收到的数据打印出来,以检查是否成功接收到数据。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1 )
{
temp = aRxBuffer;
HAL_UART_Transmit(&huart2, (uint8_t *)&temp, 1, HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
}
else if(huart->Instance == USART2 )
{
temp = bRxBuffer;
HAL_UART_Transmit(&huart1, (uint8_t *)&temp, 1, HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart2, &bRxBuffer, 1);
}
}
以上代码会将接收到的数据原封不动地通过另一个串口发送出去,这样您可以检查接收到的数据是否正确。如果正确接收到了数据,再进行进一步的处理。
你的代码中存在一些问题,导致串口2不能正常接收数据。以下是一些可能的原因:
串口2的中断处理函数没有正确设置。
串口2的波特率、数据位、停止位、校验位等参数没有正确设置,导致数据不能正确解析。
串口2的GPIO引脚配置有误,导致数据无法正常收发。
工程1和工程2中的代码存在冲突,导致串口1和串口2的配置发生了错误。
建议你检查一下以上几个方面的代码,看看是否存在问题。同时,也可以参考其他人的代码或者官方的示例代码,来对比一下你的代码是否有误。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
可能存在以下几个问题:
串口中断优先级的设置
检查一下两个串口的中断优先级设置是否一致,如果不一致可能会导致其中一个串口的中断无法正常触发。
串口时钟配置的问题
确认一下两个串口的时钟配置是否正确。如果时钟配置不正确,可能会导致其中一个串口无法正常收发数据。
串口引脚配置的问题
确认一下两个串口的引脚配置是否正确。如果引脚配置不正确,可能会导致其中一个串口无法正常收发数据。
软件实现的问题
检查一下程序中是否存在问题,例如可能存在逻辑错误或者是代码中有误。
可以将两个串口的代码进行对比,找出问题所在,也可以通过串口调试助手等工具进行调试,以确定问题所在。
以下是Python代码的示例,用于将数据写入Excel文件:
import openpyxl
# 打开工作簿
workbook = openpyxl.Workbook()
# 创建工作表
worksheet = workbook.active
# 写入数据
worksheet['A1'] = 'Hello'
worksheet['B1'] = 'World'
# 保存工作簿
workbook.save('example.xlsx')
以下是读取Excel文件的示例代码:
import openpyxl
# 打开工作簿
workbook = openpyxl.load_workbook('example.xlsx')
# 获取工作表
worksheet = workbook.active
# 读取数据
cell_value = worksheet['A1'].value
print(cell_value)
注意,这些示例代码使用Openpyxl库来读取和写入Excel文件。如果您使用的是其他库,代码可能会有所不同。