1、串口协议和RS-232标准
串口协议是一种用于在计算机和外部设备之间进行数据传输的通信协议。而RS-232是一种串行通信标准,它规定了串行通信中数据的传输格式、电气特性和连接器的规范。
RS-232标准定义了串口通信中的物理连接和电气特性,包括数据传输的时序、电压电平、数据位和停止位的配置等。它还规定了连接器的类型和引脚定义,以确保设备之间可以正确地进行通信。
串口协议则是在RS-232标准的基础上,定义了数据的格式、传输控制和错误检测等方面的规范。不同的设备可能会采用不同的串口协议来进行通信,例如常见的串口协议包括RS-485、Modbus等。
总的来说,RS-232标准规定了串口通信的物理连接和电气特性,而串口协议则规定了数据的传输格式和通信控制。这两者结合起来,可以确保设备之间能够进行可靠的串口通信。
2、"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
USB/TTL转232模块是一种用于将USB接口转换为TTL或RS232串行通信接口的模块。以CH340芯片模块为例,其工作原理如下:
USB接口:模块通过USB接口与计算机或其他设备连接,用于提供数据传输和供电。
CH340芯片:CH340芯片是一种USB转串口芯片,可以将USB接口转换为TTL或RS232串行通信接口。它负责将USB接口接收到的数据转换为串行数据,并反之亦然。
TTL/RS232接口:CH340芯片将转换后的数据输出到TTL或RS232串行通信接口,用户可以通过这些接口连接到外部设备进行数据传输。
驱动程序:为了让计算机能够识别和使用CH340芯片,用户需要安装相应的驱动程序。这样,计算机就可以通过USB接口与CH340芯片进行通信,并实现与外部设备的数据交换。
总的来说,USB/TTL转232模块的工作原理就是通过CH340芯片将USB接口转换为TTL或RS232串行通信接口,实现计算机与外部设备之间的数据传输。
3、HAL库中断方式进行串口通信
1、代码实现
(1)设置RCC
(2)设置SYS
(3)设置USART
(4)设置NVIC
(5)创建工程并打开工程,对工程中的main.c文件进行修改,具体修改内容如下:
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
char c;//?? 0:?? 1:??
char message[]="hello Windows\n";//????
char tips[]="CommandError\n";//??1
char tips1[]="Start.....\n";//??2
char tips2[]="Stop......\n";//??3
int flag=0;//?? 0:???? 1.????
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
while (1)
{
if(flag==1){
//????
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//??
HAL_Delay(1000);
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//???????0?,???????flag
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
//???????1?,???????flag
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
//?????????,???????flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
//??????
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
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();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
(6)烧录并打开串口工具,完成设置后调试串口。在发送端输入1并发送,即可在接收端得到hello world的回复,并持续接收,直到发送0后停止。