1.HAL库串口发送接送数据
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力
- 简单的串口连接方式用一个设备的TX(发送数据端)连接另一台设备的RX(接受数据端),由此交叉相连
1.串口接发数据(非中断模式)
-
配置所使用的串口外设,在此我使用的串口外设是USART1其他资源按需求配置
-
配置时钟等(时钟树按照自己需要配置即可)
-
发送数据与接受数据的实现
//发送数据函数 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
- UART_HandleTypeDef *huart:这里需要你传入你要使用的huart外设的地址
- const uint8_t *pData:你要写入数据的地址
- uint16_t Size:写入数据的大小
- uint32_t Timeout:规定运行时间
//发送数据函数 HAL_StatusTypeDef HAL_UART_Transmit(&huart1,"hello_this_is_urast_text\r\n",strlen("hello_this_is_urast_text\r\n"),100) //此时在程序中就完成了一个字符串的发送
//接受数据函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- UART_HandleTypeDef *huart:这里需要你传入你要使用的huart外设的地址
- const uint8_t *pData:你要将读取的数据放入的地址
- uint16_t Size:读取数据的长度
- uint32_t Timeout:规定运行时间
HAL_UART_Receive(&huart1,ch,20,100);
//这样就读取到了一个数据
4.完整功能实现
//开启小灯
void LED_ON()
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
}
//关闭小灯
void LED_Close()
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
}
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
unsigned char ch[20] = {0};
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
//上电后发送一个发送成功的标志以判断串口是否打开成功
HAL_UART_Transmit(&huart1,(const uint8_t *)"blueteeth_open\n",strlen("blueteeth_open\n"),100);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Receive(&huart1,ch,20,100);
HAL_UART_Transmit(&huart1,ch,strlen((const char *)ch),100);
if(!strcmp((const char *)ch,"open"))
{
LED_ON();
HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_OPEN\n",strlen((const char *)"LED_OPEN\n"),100);
}
else if(!strcmp((const char *)ch,"close"))
{
LED_Close();
HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_CLOSE\n",strlen((const char *)"LED_CLOSE\n"),100);
}
else
{
if(ch[0] != '\0')
{
HAL_UART_Transmit(&huart1,(const uint8_t *)"LED_ERR\n",strlen((const char *)"LED_ERR\n"),100);
}
}
//这里必须清空否者会无线循环打印接受到的第一个数据
memset(ch, 0, strlen((const char *)ch));
}
/* USER CODE END 3 */
}
1.串口接发数据(非中断模式)
-
初始配置和非中断模式一样只是多了一个打开中断的步骤,需要在CUBMAX中配置NVIC打开串口中断
-
代码实现
-
中断发送函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1) { HAL_UART_Transmit(&huart1,"IT_SEND\r\n",strlen("IT_SEND\r\n"),100); } }
-
中断接受函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1) { HAL_UART_Transmit(&huart1,"receive\r\n",strlen("receive\r\n"),100); HAL_UART_Receive_IT(&huart1,(uint8_t *)buff,4); } }
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ //发送数据22 HAL_UART_Transmit_IT(&huart1,(const uint8_t *)"usart_it_sent\r\n", strlen("usart_it_sent\r\n")); //接受数据 HAL_UART_Receive_IT(&huart1,(uint8_t *)buff,4); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
这里实现的是我们发送一个数据时就会进入中断,发送一个IT_Send;当接受到数据时,会进入中断并且再次打开中断接受使能,让数据进入到BUFF
-