如何让网站上线,三大门户网站是什么,作文网app下载,汕头百度seo电话【 声明#xff1a;版权所有#xff0c;欢迎转载#xff0c;请勿用于商业用途。 联系信箱#xff1a;feixiaoxing 163.com】 前面学习103和407的时候#xff0c;当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次#xff0c;我们看下应该怎么利用中断的形式进…【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】 前面学习103和407的时候当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次我们看下应该怎么利用中断的形式进行数据的收发。不仅如此我们还可以看下怎么把收到的数据放在一起当成一个完整的命令去处理。 1、基本串口信息定义 这边的串口主要还是利用a9、a10来实现数据的收发其中a9负责数据的发送a10负责数据的接收。除此之外数据是采用中断的形式进行处理的。
#define DEBUG_USART USART1
#define DEBUG_USART_CLK_ENABLE() __USART1_CLK_ENABLE();#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_RX_PIN GPIO_PIN_10
#define DEBUG_USART_RX_AF GPIO_AF7_USART1#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_TX_PIN GPIO_PIN_9
#define DEBUG_USART_TX_AF GPIO_AF7_USART1#define DEBUG_USART_IRQHandler USART1_IRQHandler
#define DEBUG_USART_IRQ USART1_IRQn 2、串口的初始化 串口的初始化这边基本上就是八股文基本上按照套路下就可以了。一般就是配置时钟、配置gpio、配置uart、配置中断。对于我们来说最重要的baudrate也就是波特率就是在这里配置的。
void DEBUG_USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;DEBUG_USART_RX_GPIO_CLK_ENABLE();DEBUG_USART_TX_GPIO_CLK_ENABLE();RCC_PeriphClkInit.PeriphClockSelection RCC_PERIPHCLK_USART1;RCC_PeriphClkInit.Usart16ClockSelection RCC_USART16CLKSOURCE_D2PCLK2;HAL_RCCEx_PeriphCLKConfig(RCC_PeriphClkInit);DEBUG_USART_CLK_ENABLE();GPIO_InitStruct.Pin DEBUG_USART_TX_PIN;GPIO_InitStruct.Mode GPIO_MODE_AF_PP;GPIO_InitStruct.Pull GPIO_PULLUP;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate DEBUG_USART_TX_AF;HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, GPIO_InitStruct);GPIO_InitStruct.Pin DEBUG_USART_RX_PIN;GPIO_InitStruct.Alternate DEBUG_USART_RX_AF;HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, GPIO_InitStruct); UartHandle.Instance DEBUG_USART;UartHandle.Init.BaudRate 115200;UartHandle.Init.WordLength UART_WORDLENGTH_8B;UartHandle.Init.StopBits UART_STOPBITS_1;UartHandle.Init.Parity UART_PARITY_NONE;UartHandle.Init.Mode UART_MODE_TX_RX;UartHandle.Init.HwFlowCtl UART_HWCONTROL_NONE;UartHandle.Init.OverSampling UART_OVERSAMPLING_16;UartHandle.Init.OneBitSampling UART_ONEBIT_SAMPLING_DISABLED;UartHandle.AdvancedInit.AdvFeatureInit UART_ADVFEATURE_NO_INIT;HAL_UART_Init(UartHandle);HAL_NVIC_SetPriority(DEBUG_USART_IRQ, 0, 0);HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ);__HAL_UART_ENABLE_IT(UartHandle,UART_IT_RXNE);
} 3、函数重定向 对于喜欢用getchar、printf进行数据收发的同学一般还需要实现一下fputc、fgetc这两个函数。实现了这两个函数后续就可以使用getchar和printf了。
void Usart_SendString(uint8_t *str)
{unsigned int k0;do {HAL_UART_Transmit( UartHandle,(uint8_t *)(str k) ,1,1000);k;} while(*(str k)!\0);}int fputc(int ch, FILE *f)
{HAL_UART_Transmit(UartHandle, (uint8_t *)ch, 1, 1000); return (ch);
}int fgetc(FILE *f)
{ int ch;HAL_UART_Receive(UartHandle, (uint8_t *)ch, 1, 1000); return (ch);
} 4、中断处理 配置好了uart属性部分下面就是中断处理。这里中断是一个数据、一个数据进行接收的实际处理的时候一般是进入中断之后循环接收数据直到没有新的数据收到为止。
extern uint8_t Rxflag;
extern uint8_t ucTemp;void DEBUG_USART_IRQHandler(void)
{if(__HAL_UART_GET_IT( UartHandle, UART_IT_RXNE ) ! RESET){ Rxflag1; HAL_UART_Receive(UartHandle, (uint8_t *)ucTemp, 1, 1000); }HAL_UART_IRQHandler(UartHandle);
} 代码中Rxflag是标志位ucTemp代表实际接收到的数据。 5、接收数据实际处理 单个接收到的数据一般是没有办法直接处理的通常都是收集到一块来处理。处理结束的标志一般就是回车换行符或者是某个特殊的标志也可以的。 while (1){if(Rxflag){if (usRxCount sizeof(ucaRxBuf)){ucaRxBuf[usRxCount] ucTemp;}else{usRxCount 0;}if (ucTemp 0x0A) { HAL_UART_Transmit( UartHandle, (uint8_t *)ucaRxBuf,usRxCount,1000 );usRxCount 0;}Rxflag0;__HAL_UART_ENABLE_IT(UartHandle,UART_IT_RXNE); }} 这边做的比较简单整个while1部分是放在main函数里面的。如果Rxflag为1那么把接收到的数据放到ucaRxBuf里面。接着检查数据是不是0x0a也就是换行如果是就把数据发送回去。最后把Rxflag重新置0打开串口接收中断准备新的数据进来。 大家如果做的复杂一点数据上面可以用queue的形式来处理函数也可以抽象出来实现部分做成parse command的形式这样处理起来就会简单的多。另外数据接收部分要尽快打开中断。 6、测试和验证 测试就比较简单了直接把代码编译、下载后利用ATK-XCOM上位机打开串口输入123、abc这样的内容看看有没有回显就知道代码对不对了。