正式环境里需要串联电阻,或设计过滤电路。核心板是STM32F103C8T6
这里使用了UART3的接口,具体使用MX创建项目就不放了,百度下都有
/*
USART3 GPIO Configuration
PB10 ------> USART3_TX
PB11 ------> USART3_RX
*/
因为是串口通讯所以双机接线需要交叉
接口的关键代码配置如下:
void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART3)
{
/* USART3 clock enable */
__HAL_RCC_USART3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**USART3 GPIO Configuration
PB10 ------> USART3_TX
PB11 ------> USART3_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USART3 interrupt Init */
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
}
}
因为是中断方式收数据,所以需要自己实现个中断函数,系统会自己重载你实现的函数(名字要对)
//全局变量
char aRxChr;
char aRxBuffer[100];
uint32_t nRxLen;
//中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3){
if (nRxLen == 0){
memset(aRxBuffer,0,100);
}
//判断结束标志位字符
if (aRxChr != '#'){
aRxBuffer[nRxLen] =aRxChr;
nRxLen++;
}else{
aRxBuffer[nRxLen] = 0;
nRxLen = 0;
}
//打开中断
HAL_UART_Receive_IT(&huart3,(uint8_t*)&aRxChr,1);
}
}
需要接收不固定长度的数据,所以必须1个字节1个字节的收,然后组合成完整的。
最后给出Main主线程里的测试代码
//上面其他的初始化就不放了,放关键的
MX_USART3_UART_Init();
nRxLen = 0;
uint8_t aTxBuffer[]="1234567890#";
//打开收中断
HAL_UART_Receive_IT(&huart3,(uint8_t*)&aRxChr,1);
while (1) {
//发送数据
HAL_UART_Transmit(&huart3,(uint8_t*)&aTxBuffer,strlen(aTxBuffer),100);
//这里可以处理aRxBuffer的内容,如果要搞的好点就再自己搞个锁来判断是否收到完整数据
HAL_Delay(1000);
}