- A+
介绍
在进行单板机系统开发时,我们常常需要将烧录文件通过串口传输到目标板。在传输的过程中,有时会遇到兄弟打印机正在接收数据但是烧录bin文件的情况,本文将介绍如何解决这个问题。
问题分析
在烧录bin文件的过程中,如果串口连着兄弟打印机,就会出现兄弟打印机正在接收数据的情况。这是因为,串口发送完一个字节后会等待目标板的回复,如果目标板没有回复,那么串口会不停地发送。而兄弟打印机会将这些发送的内容当作打印内容进行打印。
解决方案
解决这个问题有两种方法:
断开兄弟打印机
断开兄弟打印机是最简单的解决方法,只需要将兄弟打印机的串口拔掉即可。但是这种方法对于需要同时进行打印和烧录操作的情况不适用。
修改串口通信方式
在烧录bin文件之前,我们可以先将串口的通信方式修改一下,如将其从阻塞模式改为非阻塞模式。在非阻塞模式下,串口发送完一个字节后不会等待目标板的回复,而是直接发送下一个字节。
具体实现
以下代码是使用STM32的HAL库,将串口通信方式修改为非阻塞模式的一个例子:
```
UART_HandleTypeDef huart1;
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;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
/* 将串口通信方式修改为非阻塞模式 */
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
Error_Handler();
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
/* 发送完成回调函数 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
/* 接收完成回调函数 */
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
/* 错误回调函数 */
}
void HAL_UART_MspInit(UART_HandleTypeDef* huart) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1) {
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) {
if(huart->Instance==USART1) {
__HAL_RCC_USART1_FORCE_RESET();
__HAL_RCC_USART1_RELEASE_RESET();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
HAL_NVIC_DisableIRQ(USART1_IRQn);
}
}
void USART1_IRQHandler(void) {
HAL_UART_IRQHandler(&huart1);
}
```
在这个例子中,我们首先将串口的通信方式初始化,然后将其修改为非阻塞模式。修改为非阻塞模式的关键在于以下三个函数的调用:
HAL_UARTEx_SetTxFifoThreshold()
HAL_UARTEx_SetRxFifoThreshold()
HAL_UARTEx_DisableFifoMode()
最后,需要在应用程序中实现三个回调函数:HAL_UART_TxCpltCallback()、HAL_UART_RxCpltCallback()和 HAL_UART_ErrorCallback(),这些函数将在非阻塞模式下串口通信过程中被自动调用。
兄弟打印机正在接收数据是我们在烧录bin文件时常遇到的问题之一。通过修改串口通信方式,我们可以将串口的阻塞模式改为非阻塞模式,从而解决兄弟打印机正在接收数据的问题。如果你也遇到了这个问题,可以尝试使用本文提到的方法解决。
- 在线微信客服
- 加13296583115 故障咨询
-
- 远程QQ客服
- 加QQ113868949远程服务
-





