目录

通信数据传输方式:串行、并行

通信数据通信方式:单工、半双工、全双工

通信数据同步方式:同步、异步

常用串口:RS232标准、USB转串口(TTL标准)、原生的串口转串口(TTL->TTL)

RS232标准

USB转串口(TTL标准)

原生的串口转串口(TTL->TTL)

串口数据包的基本组成

USART功能框图

固件库

串口初始化结构体

串口时钟初始化结构体

串口函数

标准库串口接收和发送实验

HAL库_USART

USART配置

串口函数


通信数据传输方式:串行、并行

串行:数据按位顺序传输。

并行:数据各个位同时传输。

特性 串行通讯 并行通讯
通讯距离 较远 较近
抗干扰能力 较强 较弱
传输速率 较慢 较高
成本 较低 较高
举例 USART、IIC、SPI、CAN SDIO、FSMC

通信数据通信方式:单工、半双工、全双工

单工:一根线,固定方向传输。

半双工:两根线,一根收,一根发。不可同时收发数据。比如USART、SPI和IIC。

全双工:两根线,一根收,一根发。可同时收发数据。比如USART、SPI。

通信数据同步方式:同步、异步

同步:带时钟信号传输。比如IIC、SPI。

异步:不带时钟信号传输。比如USART,1-write。

在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。

比特率:每秒钟传输的二进制位数。单位为比特每秒(bit/s)。

波特率: 每秒钟传输的码元个数。

当码元的离散状态有大于2个时(如M大于2个),此时码元为M进制码元。

举例,当M=4时,我们叫做4进制码元,意味着有4种离散状态,分别为“00”,“01”,“10”,“11”状态。这里面每个码元对应了2个比特。

当M=2时,2进制码元,意味着有2种离散状态,分别为“00”,“01”状态。这里面每个码元对应了1个比特。

常用串口:RS232标准、USB转串口(TTL标准)、原生的串口转串口(TTL->TTL)

RS232标准

RS232标准串口一般是DB9接口,拥有9根针,主要用于工业设备直接通信。

电平转换芯片一般有MAX3232、SP3232。在RS232中一般用于将232电平与TTL电平转换。

USB转串口(TTL标准)

USB转串口主要用于设备跟电脑通信。

电平转换芯片一般有CH340、PL2303、CP2102、FT232。使用的时候电脑端需要安装电平转换芯片的驱动。在USB转串口中一般用于将USB电平与TTL电平转换。

原生的串口转串口(TTL->TTL)

原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就要TTL电平通信。比如GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块。

串口数据包的基本组成

起始位:由1个逻辑0的数据位表示。

结束位:由0.5、1、1.5或2个逻辑1的数据位表示。

有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为5、6、7或8位长。

校验位:可选,目的是数据的抗干扰性。方法为:奇校验、偶校验、0校验、1校验和无校验。

奇校验:有效数据和校验位中“1”的个数为奇数。比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
偶校验:有效数据和校验位中“1”的个数为偶数。比如一个8位长的有效数据为:01101001,此时总共有4个“1”,为达到偶校验效果,校验位为“0”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
0校验:校验位总为0。
1校验:校验位总为1。
无校验:不包含校验位。

USART功能框图

功能引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求发送,n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。
nCTS:允许发送,n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚。如果为低电平,表示可以发送数据。如果为高电平,表示发送完当前数据帧后停止发送。该引脚只适用于硬件流控制。
SCLK:时钟,仅同步通信时使用。

STM32F103VET6 系统控制器有三个 USART 和两个 UART,其中 USART1 时钟来源于 APB2 总线时钟,其最大频率为 72MHz,其他四个的时钟来源于 APB1 总线时钟,其最大频率为 36MHz。UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。

数据寄存器-USART_DR:9位有效,包含一个发送数据寄存器TDR和接收数据寄存器RDR。一个地址对应两个物理内存。

USART_CR1:M。0:8bit,1::9bit。
USART_CR1:STOP。
USART_CR1:PCE、PS、PEIE。
USART_SR:PE。USART_SR:TXE。
USART_CR1:TXEIE。
USART_SR:TC。
USART_CR1:TCIE。
USART_SR:RXNE。
USART_CR1:RXNEIE。

波特率:每秒钟要发送多少二进制位。

USART_BRR:波特率寄存器。

USART_CR1:OVER8。

USARTDIV:无符号定点数。

FCK:串口的时钟,注意区分APB2和APB1两条总线。

比如:USART1,时钟为72M。波特率为115200。115200=72000000/(16* USARTDIV)。

可得USARTDIV=39.0625。可算得,DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x17,即应该设置USART_BRR的值为0x171。

固件库

串口初始化结构体

typedef struct
{uint32_t USART_BaudRate;               //波特率uint16_t USART_WordLength;             //字长uint16_t USART_StopBits;               //停止位uint16_t USART_Parity;                 //校验uint16_t USART_Mode;                   //模式uint16_t USART_HardwareFlowControl;    //硬件流控制
} USART_InitTypeDef;

串口时钟初始化结构体

typedef struct
{uint16_t USART_Clock;   //时钟uint16_t USART_CPOL;    //极性uint16_t USART_CPHA;    //相位uint16_t USART_LastBit; //最后一位时钟脉冲
} USART_ClockInitTypeDef;

串口函数

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);    //串口初始化函数
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);    //中断配置函数
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);    //串口使能函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);    //数据发送函数
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);    //数据接收函数
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);    //中断状态位获取函数

标准库串口接收和发送实验

//串口1-USART1
#define DEBUG_USARTx                    USART1
#define DEBUG_USART_CLK                 RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd          RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE            115200//USART GPIO 引脚宏定义
#define DEBUG_USART_GPIO_CLK            (RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd     RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT      GPIOA
#define DEBUG_USART_TX_GPIO_PIN         GPIO_Pin_9
#define DEBUG_USART_RX_GPIO_PORT        GPIOA
#define DEBUG_USART_RX_GPIO_PIN         GPIO_Pin_10#define DEBUG_USART_IRQ                  USART1_IRQn
#define DEBUG_USART_IRQHandler          USART1_IRQHandlervoid USART_Config(void);
void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t data);
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/*嵌套向量中断控制器组选择*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;        //中断源NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;           //子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //使能中断NVIC_Init(&NVIC_InitStructure);
}void USART_Config(void)
{/*定义初始化GPIO、USRAT结构体*/GPIO_InitTypeDef     GPIO_InitStructure;USART_InitTypeDef    USART_InitStructure;/*打开串口GPIO、外设时钟*/DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE);/*将USART Tx的GPIO配置为推挽复用模式*/GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure);/*将USART Rx的GPIO配置为浮空输入模式*/GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure);USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;        //配置波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;       //配置帧数据字长USART_InitStructure.USART_StopBits = USART_StopBits_1;            //配置停止位USART_InitStructure.USART_Parity = USART_Parity_No;               //配置校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    配置硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   配置工作模式,收发一起USART_Init(DEBUG_USARTx,&USART_InitStructure);/*串口中断优先级配置*/NVIC_Configuration();/*使能串口接收中断*/USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);/*使能串口*/USART_Cmd(DEBUG_USARTx,ENABLE);
}/*发送一个字节*/
void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t data)
{USART_SendData(pUSARTx,data);while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);
}/*发送两个字节*/
void Usart_SendHalfWord(USART_TypeDef* pUSARTx,uint16_t data)
{uint8_t temp_h,temp_l;temp_h = (data & 0xff00) >> 8;temp_l = data & 0xff;USART_SendData(pUSARTx,temp_h);while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);USART_SendData(pUSARTx,temp_l);while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);
}/*发送8位数据的数组*/
void Usart_SendArray(USART_TypeDef* pUSARTx,uint8_t* array,uint8_t num)
{uint8_t i;for( i=0 ; i<num ; i++){//可以这样写Usart_SendByte(pUSARTx,*array++);Usart_SendByte(pUSARTx,array[i]);}while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);
}/*发送字符串*/
void Usart_SendString(USART_TypeDef* pUSARTx,uint8_t* str)
{uint8_t i=0;do{USART_SendData( pUSARTx,*(str+i) );i++;}while( *(str+i) != '\0' );while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);
}/*重定向c库函数printf到串口,重定向后可使用printf、putchar等函数*/
int fputc(int ch,FILE *f)
{/*发送一个字节数据到串口*/USART_SendData( DEBUG_USARTx , (uint8_t)ch );/*等待发送完毕*/while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE) == RESET);return ch;
}/*重定向c库函数scanf到串口,重定向后可使用scanf、getchar等函数*/
int fgetc(FILE *f)
{/*等待串口输入数据*/while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}
/*串口中断函数*/
void DEBUG_USART_IRQHandler(void)    //数据原路返回,回显
{uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){ucTemp = USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx,ucTemp);}
}
while(1){ch = getchar();printf("ch = %c \n",ch);switch(ch){case '1':LED_R(OFF);    break;case '2':LED_G(OFF);    break;case '3':LED_B(OFF);    break;case 0x01:LED_R(OFF); LED_G(OFF); break;case 0x02:LED_G(OFF); LED_B(OFF); break;default:LED_R(ON);    LED_G(ON);LED_B(ON);break;}}

HAL库_USART

USART配置

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();}/*使能串口接收断 */__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);
}
#include <stdio.h>
/*****************  发送字符串 **********************/
void Usart_SendString(uint8_t *str)
{unsigned int k=0;do {HAL_UART_Transmit(&UartHandle,(uint8_t *)(str + k) ,1,1000);k++;} while(*(str + k)!='\0');}
//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口DEBUG_USART */HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000);       return (ch);
}//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{       int ch;HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000);  return (ch);
}
void  DEBUG_USART_IRQHandler(void)
{uint8_t ch=0;   if(__HAL_UART_GET_FLAG( &huart1, UART_FLAG_RXNE ) != RESET){     ch=( uint16_t)READ_REG(huart1.Instance->DR);WRITE_REG(huart1.Instance->DR,ch); }
}

串口初始化结构体

typedef struct
{USART_TypeDef                 *Instance;       UART_InitTypeDef              Init;             uint8_t                       *pTxBuffPtr;      uint16_t                      TxXferSize;      __IO uint16_t                 TxXferCount;      uint8_t                       *pRxBuffPtr;      uint16_t                      RxXferSize;      __IO uint16_t                 RxXferCount;      DMA_HandleTypeDef             *hdmatx;          DMA_HandleTypeDef             *hdmarx;          HAL_LockTypeDef               Lock;             __IO HAL_UART_StateTypeDef    gState;           __IO HAL_UART_StateTypeDef    RxState;          __IO uint32_t                 ErrorCode;
}UART_HandleTypeDef;

串口函数

__HAL_UART_RESET_HANDLE_STATE(__HANDLE__);
__HAL_UART_FLUSH_DRREGISTER(__HANDLE__);
__HAL_UART_GET_FLAG(__HANDLE__, __FLAG__);
__HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__);
__HAL_UART_CLEAR_PEFLAG(__HANDLE__);
__HAL_UART_CLEAR_FEFLAG(__HANDLE__);
__HAL_UART_CLEAR_NEFLAG(__HANDLE__);
__HAL_UART_CLEAR_OREFLAG(__HANDLE__);
__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__);
__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__);
__HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__);
__HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__);
__HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__);
__HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__);
__HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__);
__HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__);
__HAL_UART_ENABLE(__HANDLE__);
__HAL_UART_DISABLE(__HANDLE__);
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength);
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod);
HAL_StatusTypeDef HAL_UART_DeInit (UART_HandleTypeDef *huart);
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);
/* Transfer Abort functions */
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart);void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortCpltCallback (UART_HandleTypeDef *huart);
void HAL_UART_AbortTransmitCpltCallback (UART_HandleTypeDef *huart);
void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart);HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart);HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart);
uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart);

STM32个人笔记-通信及串口相关推荐

  1. STM32学习笔记7(串口通信)

    一.简介 1.电平标准 2.串口参数及时序 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口.它由起始位.数据位.校验位以及停止位组成,通讯双方的数据包格式要约定一致才 ...

  2. STM32学习笔记(四 串口通信 3 串口寄存器库函数配置)

    一.常用的串口寄存器 USART_SR状态寄存器 作用: 状态寄存器适用于检测串口此时所处的状态. 主要关注两个位:RXNE和TC(第5.6两位). RXNE(读数据寄存器非空): 当该位被置1的时候 ...

  3. stm32学习笔记-9 USART串口

    9 USART串口 文章目录 9 USART串口 9.1 串口通信协议 9.2 stm32的片上外设-USART 9.3 USART收发相关实验 9.3.1 实验1:串口发送 9.3.2 实验2:移植 ...

  4. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  5. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

  6. 嵌入式学习笔记——STM32的USART通信概述

    文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...

  7. stm32读操作失败_STM32学习笔记—通信容易出错的情况

    I²C:全称为Inter-Integrated Circuit(内部集成电路),是一种串行通讯总线,常用于嵌入式电子产品中. 这是第4篇分享,<STM32学习笔记>之I2C通信容易出错的情 ...

  8. STM32开发,串口和PC机通信(串口中断、FIFO机制),安富莱+正点原子程序合并

    STM32开发,串口和PC机通信(串口中断.FIFO机制),安富莱+正点原子程序合并 1 概述 1.1 资源概述 1.2 实现功能 2 软件实现 2.1实现步骤 2.2 main()函数代码 2.3 ...

  9. STM32串口通信、串口调试助手

    STM32系列博客:  STM32学习之旅① 开发环境搭建 STM32学习之旅② 固件库的使用及工程模板的建立 STM32学习之旅③ 从点灯到代码移植 STM32学习之旅④ USART串口和上位机通信 ...

最新文章

  1. 边缘的人工智能可以满足许多需求
  2. 讲解知识图谱成体系文章 (魔图互联知识图谱写的质量比较高的)
  3. python walk 遍历文件夹 文件大小
  4. python高维向量的可视化_Tensorboard教程:高维向量可视化
  5. 简述css布局技术的特点,div+css布局技术漫谈
  6. HPU-- 1190 確率
  7. Hibernate模拟试题
  8. android一键分享功能不使用任何第三方sdk
  9. 产品经理和程序员的黑话
  10. java for(o t :object) 获取顺序号_JAVA泛型通配符T,E,K,V区别 瞬间豁然开朗
  11. (7)css常用属性2
  12. Python绘制柱状图显示中国式过马路方式
  13. 微信UnionId 部分开放
  14. 抽奖活动软件 html,APP怎么制作抽奖活动,制作APP抽奖活动有何亮点
  15. PPT插入Excel图标,如果水平翻转做出漂亮逻辑图表?
  16. 如果你想学好Py thon,我这里有几本电子书想送你
  17. 机器人布里茨哪个皮肤好看_LOL全英雄皮肤盘点推荐D32:蒸汽机器人布里茨 苹果机器人...
  18. 福利 | 区块链寒冬的“另类”火锅吃法
  19. HTML期末大作业~仿小米商城网页设计模板(HTML+CSS+JavaScript)
  20. 震撼人心的战争类背景音乐

热门文章

  1. html点击图片产生事件,javascript里怎么实现点击图片弹出对话框?
  2. 安徽计算机水平模拟考试系统准考证号,2019安徽计算机等考准考证打印入口
  3. 佳能Canon LBP3910 打印机驱动
  4. 微信 snsapi_userinfo 失败
  5. vim编辑器重要快捷键及vim设置
  6. 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
  7. QT textEdit的读取和设置
  8. ARcore坐标系与地理坐标系转换
  9. 科研方法技巧文章总结
  10. onlyoffice的Linux下的安装、中文字体、字号