【正点原子STM32连载】第十三章 串口通信实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第十三章 串口通信实验

本章将介绍使用串口进行数据的收发操作,具体实现APM32E103与上位机软件的数据通信,APM32E103将接受自上位机软件的数据原原本本地发送回给上位机软件。通过本章的学习,读者将学习到USART和GPIO引脚复用的使用。
本章分为如下几个小节:
13.1 硬件设计
13.2 程序设计
13.3 下载验证

13.1 硬件设计
13.1.1 例程功能

  1. 回显串口接收到的数据
  2. 每间隔一定时间,串口发送一段提示信息
  3. LED0闪烁,提示程序正在运行
    13.1.2 硬件资源
  4. USART1(PA9、PA10连接至板载USB转串口芯片上)
  5. LED
    LED0 - PB5
    13.1.3 原理图
    本章实验使用的USART1通过跳线帽与板载的USB转串口芯片连接,其原理图如下图所示:

在这里插入图片描述

图13.1.3.1 USART1与USB转串口芯片跳线帽连接

因此在进行本章实验之前,需确保上图位置中正确安装了跳线帽
在这里插入图片描述

图13.1.3.2 串口通信跳线帽位置
板载的USB转串口芯片的USB接口通过板载的USB UART端口引出,其原理图如下图所示:
在这里插入图片描述

图13.1.3.3 USB转串口芯片相关原理图
从以上原理图可以看出,PA9引脚和PA10引脚分别作为发送和接收引脚分别与USB转串口芯片的接收和发送引脚进行连接,USB转串口芯片再通过一对USB差分信号连接至USB UART的接口,这样一来,APM32E103就可以通过USB与PC上位机软件进行串口通信了。
13.2 程序设计
13.2.1 Geehy标准库的GPIO驱动
针对本章的实验要求,需要将串口发送引脚配置成复用推挽输出模式,而串口接收引脚配置成上拉输入模式。
13.2.2 Geehy标准库的USART驱动
Geehy标准库的USART驱动提供了操作APM32E103片上USART的各种API函数,其中就包括配置USART、使能USART等函数,本章实验还是能了USART中断用于接收USART数据。配置并使用USART收发数据的步骤。配置USART的具体步骤如下所示:
①:配置USART
②:使能USART
③:使能USART接收缓冲区非空中断
④:使能USART中断,并配置其相关的中断优先级
在Geehy标准库中对应的驱动函数如下:
①:配置USART
该函数用于配置USART的各项参数,其函数的原型如下所示:
void USART_Config(USART_T* usart, USART_Config_T* usartConfig);
该函数的形参描述,如下表所示:
在这里插入图片描述

表13.2.2.1 函数USART_Config()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表13.2.2.2 函数USART_Config()返回值描述
该函数使用USART_Config_T类型的结构体变量传入USART外设的配置参数,该结构体的定义如下所示:

/**
 * @brief   USART Word Length define
 */
typedef enum
{
    USART_WORD_LEN_8B = 0,					/* 8位数据长度 */
    USART_WORD_LEN_9B = BIT12				/* 9位数据长度 */
} USART_WORD_LEN_T;

/**
 * @brief   USART Stop bits define
 */
typedef enum
{
    USART_STOP_BIT_1   = 0,				    /* 1比特停止位 */
    USART_STOP_BIT_0_5 = BIT12,				/* 0.5比特停止位 */
    USART_STOP_BIT_2   = BIT13,				/* 2比特停止位 */
    USART_STOP_BIT_1_5 = BIT12 | BIT13		/* 1.5比特停止位 */
} USART_STOP_BIT_T;

/**
 * @brief   USART Parity define
 */
typedef enum
{
    USART_PARITY_NONE  = 0,					/* 无校验 */
    USART_PARITY_EVEN  = BIT10,				/* 偶校验 */
    USART_PARITY_ODD   = BIT10 | BIT9		/* 奇校验 */
} USART_PARITY_T;

/**
 * @brief   USART mode define
 */
typedef enum
{
    USART_MODE_RX      = BIT2,				/* 接收模式 */
    USART_MODE_TX      = BIT3,				/* 发送模式 */
    USART_MODE_TX_RX   = BIT2 | BIT3		/* 收发模式 */
} USART_MODE_T;

/**
 * @brief   USART hardware flow control define
 */
typedef enum
{
    USART_HARDWARE_FLOW_NONE    = 0,		/* 无硬件流控 */
    USART_HARDWARE_FLOW_RTS     = BIT8,	/* RTS硬件流控 */
    USART_HARDWARE_FLOW_CTS     = BIT9,			/* CTS硬件流控 */
    USART_HARDWARE_FLOW_RTS_CTS = BIT8 | BIT9		/* RTS和CTS硬件流控 */
} USART_HARDWARE_FLOW_T;

/**
 * @brief   USART Config struct definition
 */
typedef struct
{
    uint32_t                  baudRate;           /* 通信波特率 */
    USART_WORD_LEN_T          wordLength;         /* 数据宽度 */
    USART_STOP_BIT_T          stopBits;           /* 停止位 */
    USART_PARITY_T            parity;             /* 校验位 */
    USART_MODE_T              mode;               /* 模式 */
    USART_HARDWARE_FLOW_T     hardwareFlow;       /* 硬件流控 */
} USART_Config_T;
该函数的使用示例,如下所示:
#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    USART_Config_T usart_init_struct;
    
    /* 配置USART1 */
    usart_init_struct.baudRate		= 115200;
    usart_init_struct.wordLength	= USART_WORD_LEN_8B;
    usart_init_struct.stopBits		= USART_STOP_BIT_1;
    usart_init_struct.parity		= USART_PARITY_NONE;
    usart_init_struct.mode			= USART_MODE_TX_RX;
    usart_init_struct.hardwareFlow	= USART_HARDWARE_FLOW_NONE;
    USART_Config(USART1, &usart_init_struct);
}

②:使能USART
该函数用于使能USART外设,其函数原型如下所示:
void USART_Enable(USART_T* usart);
该函数的形参描述,如下表所示:
形参 描述
usart 指向USART外设结构体的指针
例如:USART1、UART4等(在apm32e10x.h文件中有定义)
表13.2.2.3 函数USART_Enable()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表13.2.2.4 函数USART_Enable()返回值描述
该函数的使用示例,如下所示:

#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    /* 使能USART1 */
    USART_Enable(USART1);
}

③:使能USART指定的中断
该函数用于使能USART指定的中断,其函数原型如下所示:
void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt);
该函数的形参描述,如下表所示:
形参 描述
usart 指向USART外设结构体的指针
例如:USART1、UART4等(在apm32e10x.h文件中有定义)
interrupt 指定的USART中断源
例如:USART_INT_RXBNE、USART_INT_TXC等(在apm32e10x_usart.h文件中有定义)
表13.2.2.5 函数USART_EnableInterrupt()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表13.2.2.6 函数USART_EnableInterrupt()返回值描述
该函数的使用示例,如下所示:

#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    /* 使能USART1的接收缓冲区非空中断 */
    USART_EnableInterrupt(USART1, USART_INT_RXBNE);
    
    /* 使能USART1的发送完成中断 */
    USART_EnableInterrupt(USART1, USART_INT_TXC);
}

④:配置USART中断
请见第12.2.2小节中配置中断的相关内容。
使用USART发送数据的具体步骤如下所示:
①:等待USART发送缓冲区为空
②:往USART发送缓冲区写入数据
在Geehy标准库中对应的驱动函数如下:
①:获取USART状态标志
该函数用于获取USART的状态标志,其函数原型如下所示:
uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag);
该函数的形参描述,如下表所示:
形参 描述
usart 指向USART外设结构体的指针
例如:USART1、UART4等(在apm32e10x.h文件中有定义)
flag 指定获取的状态标志
例如:USART_FLAG_RXBNE、USART_FLAG_TXC等(在apm32e10x_usart.h文件中有定义)
表13.2.2.7 函数USART_ReadStatusFlag()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
SET 状态标志有效
RESET 状态标志无效
表13.2.2.8 函数USART_ReadStatusFlag()返回值描述
该函数的使用示例,如下所示:

#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    uint8_t status;
    
    /* 读取USART1外设的发送缓冲区为空状态标志 */
    status = USART_ReadStatusFlag(USART1, USART_FLAG_TXBE);
    if (status == SET)
    {
        /* Do something. */
    }
    else
    {
        /* Do something. */
    }
}

②:USART发送单个数据
该函数用于使用USART发送单个数据,其函数原型如下所示:
void USART_TxData(USART_T* usart, uint16_t data);
该函数的形参描述,如下表所示:
形参 描述
usart 指向USART外设结构体的指针
例如:USART1、UART4等(在apm32e10x.h文件中有定义)
data 待发送的数据
表13.2.2.9 函数USART_TxData()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表13.2.2.10 函数USART_TxData()返回值描述
该函数的使用示例,如下所示:

#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    uint8_t data;
    
    /* 准备数据 */
    data = 0xFF;
    /* 通过USART1发送单个数据 */
    USART_TxData(USART1, (uint16_t)data);
}

使用USART接收数据的具体步骤如下所示:
①:判断USART接收缓冲区非空
②:读取USART接收缓冲区中的数据
在Geehy标准库中对应的函数如下:
①:获取USART状态标志
请见第13.2.2小节中获取USART状态标志的相关内容。
②:获取USART接收到的单个数据
该函数用于获取USART获取到的单个数据,其函数原型如下所示:
uint16_t USART_RxData(USART_T* usart);
该函数的形参描述,如下表所示:
形参 描述
usart 指向USART外设结构体的指针
例如:USART1、UART4等(在apm32e10x.h文件中有定义)
表13.2.2.11 函数USART_RxData()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
uint16_t类型数据 获取到的USART接收到的一个数据
表13.2.2.12 函数USART_RxData()返回值描述
该函数的使用示例,如下所示:

#include "apm32e10x.h"
#include "apm32e10x_usart.h"

void example_fun(void)
{
    uint8_t data;
    
    /* 接收USART1接收到的一个数据 */
    data = USART_RxData(USART1);
    
    /* Do something. */
}

13.2.3 串口通讯驱动
本实验的串口通信驱动主要是配置USART1并完成一些相关的初始化操作,并支持将printf函数重定向到USART1进行输出,同时向应用层提供了一个数据接收缓冲区和接收完成标志,通过这些,应用层就能够很方便地使用USART1进行数据传输了,本章实验中,串口通讯驱动的驱动代码包括usart.c和usart.h两个文件。
串口通讯驱动中,对GPIO、USART的相关宏定义,如下所示:
/* 引脚和串口定义 */

#define USART_TX_GPIO_PORT          GPIOA
#define USART_TX_GPIO_PIN           GPIO_PIN_9
#define USART_TX_GPIO_CLK_ENABLE()  do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); }while(0)

#define USART_RX_GPIO_PORT          GPIOA
#define USART_RX_GPIO_PIN           GPIO_PIN_10
#define USART_RX_GPIO_CLK_ENABLE()  do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); }while(0)

#define USART_UX                    USART1
#define USART_UX_IRQn               USART1_IRQn
#define USART_UX_IRQHandler         USART1_IRQHandler
#define USART_UX_CLK_ENABLE()       do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1); }while(0)

串口通讯驱动中,USART1的初始化函数,如下所示:

/**
 * @brief       初始化串口
 * @param       baudrate: 通讯波特率
 * @retval      无
 */
void usart_init(uint32_t baudrate)
{
    GPIO_Config_T gpio_init_struct = {0};
    USART_Config_T usart_init_struct = {0};
    
    /* 使能时钟 */
    USART_UX_CLK_ENABLE();
    USART_TX_GPIO_CLK_ENABLE();
    USART_RX_GPIO_CLK_ENABLE();
    
    /* 初始化串口发送引脚 */
    gpio_init_struct.pin = USART_TX_GPIO_PIN;
    gpio_init_struct.speed = GPIO_SPEED_50MHz;
    gpio_init_struct.mode = GPIO_MODE_AF_PP;
    GPIO_Config(USART_TX_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化串口接收引脚 */
    gpio_init_struct.pin = USART_RX_GPIO_PIN;
    gpio_init_struct.speed = GPIO_SPEED_50MHz;
    gpio_init_struct.mode = GPIO_MODE_IN_PU;
    GPIO_Config(USART_RX_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化串口 */
    usart_init_struct.baudRate = baudrate;                      /* 通讯波特率 */
    usart_init_struct.wordLength = USART_WORD_LEN_8B;           /* 数据位 */
    usart_init_struct.stopBits = USART_STOP_BIT_1;              /* 停止位 */
    usart_init_struct.parity = USART_PARITY_NONE;               /* 校验位 */
    usart_init_struct.mode = USART_MODE_TX_RX;                  /* 收发模式 */
    usart_init_struct.hardwareFlow = USART_HARDWARE_FLOW_NONE;  /* 无硬件流控 */
    USART_Config(USART_UX, &usart_init_struct);
    USART_Enable(USART_UX);
    
#if (USART_EN_RX != 0)
    USART_EnableInterrupt(USART_UX, USART_INT_RXBNE);
    USART_ClearStatusFlag(USART_UX, USART_FLAG_RXBNE);
    NVIC_EnableIRQRequest(USART_UX_IRQn, 0, 0);
#endif  
}

在串口通信的初始化函数中,在使能USART1收发引脚的GPIO端口时钟和USART1外设时钟后,配置了USART1发送引脚(USART_TX_GPIO_PORT)为复用推挽输出模式,并且配置了USART1接收引脚(USART_RX_GPIO_PORT)为上拉输入模式。在最后使能了USART1,同时也配置了USART1的接收缓冲区非空中断,这么一来,USART1的中断回调函数就会在USART1接收到数据的时候被调用。
串口通讯驱动中,USART1的中断回调函数,如下所示:

/**
 * @brief       串口中断服务函数
 * @param       无
 * @retval      无
 */
void USART_UX_IRQHandler(void)
{
    if (USART_ReadIntFlag(USART_UX, USART_INT_RXBNE) == SET)
    {
#if (SYS_SUPPORT_OS != 0)
        OSIntEnter();
#endif
        
        g_rx_buffer[0] = USART_RxData(USART_UX);    /* 接收一字节数据 */
        
        if ((g_usart_rx_sta & 0x8000) == 0)         /* 接收未完成 */
        {
            if (g_usart_rx_sta & 0x4000)            /* 接收到了0x0D */
            {
                if (g_rx_buffer[0] != 0x0A)
                {
                    g_usart_rx_sta = 0;             /* 接收错误,重新开始接收 */
                }
                else
                {
                    g_usart_rx_sta |= 0x8000;       /* 接收完成 */
                }
            }
            else                                    /* 还未接收到0x0D */
            {
                if (g_rx_buffer[0] == 0x0D)
                {
                    g_usart_rx_sta |= 0x4000;
                }
                else
                {
                    g_usart_rx_buf[g_usart_rx_sta & 0x3FFF] = g_rx_buffer[0];
                    g_usart_rx_sta++;
                    if (g_usart_rx_sta > (USART_REC_LEN - 1))
                    {
                        g_usart_rx_sta = 0;         /* 接收错误,重新开始接收 */
                    }
                }
            }
        }
        
#if (SYS_SUPPORT_OS != 0)
        OSIntExit();
#endif
        USART_ClearIntFlag(USART_UX, USART_INT_RXBNE);
    }

}

在USART1的中断回调函数中主要用于读取USART1接收到的数据,并将其逐一存入接收的缓冲区,并在接收到“回车”和“换行”后标志数据接收完成。
13.2.4 实验应用代码
本实验的应用代码,如下所示:

int main(void)
{
    uint8_t len, i;
    uint16_t times = 0;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    led_init();                                       /* 初始化LED */
    
    while (1)
    {
        if (g_usart_rx_sta & 0x8000)                  /* 接收到数据 */
        {
            len = g_usart_rx_sta & 0x3fff;            /* 获取此次接收到数据的长度 */
            printf("\r\n您发送的信息为:\r\n");
            
            for (i = 0;i < len;i++)
            {
                USART_TxData(USART_UX, g_usart_rx_buf[i]);
                while (USART_ReadStatusFlag(USART_UX, USART_FLAG_TXBE)==RESET);
            }
            
            printf("\r\n\r\n");                      /* 插入换行 */
            g_usart_rx_sta = 0;
        }
        else
        {
            times++;
            
            if (times % 1000 == 0)
            {
                printf("\r\n正点原子 APM32E103最小系统板 串口实验\r\n");
                printf("正点原子@ALIENTEK\r\n\r\n\r\n");
            }
            
            if (times % 200 == 0)
            {
                printf("请输入数据,以回车键结束\r\n");
            }
            
            if (times % 30 == 0)
            {
                LED0_TOGGLE();                     /* LED0翻转,提示系统正在运行 */
            }
            
            delay_ms(10);
        }
    }
}

本实验的实验代码很简单,在完成初始化后,就不断地通过串口通信驱动提供的数据接收完成标志判断数据是否接收完毕,若还未完成数据接收,则每间隔一段时间就使用printf函数通过USART1打印一段提示信息,若数据接收完毕,则将数据原原本本地使用printf函数通过USART1打印出去,实现数据的回显功能。
13.3 下载验证
在完成编译和烧录操作后,需要将开发板的USB UART接口与PC的USB接口通过具有数据传输功能的数据线进行连接,并保证13.1.3小节中指示跳线帽已正确安装。接着打开PC上的ATK-XCOM串口调试助手软件,选择好正确的COM端口和相关的配置后,就能看到串口调试助手上每间隔一段时间就打印一次“请输出数据,以回车键结束”,接下来就可以根据提示通过串口调试助手发送一段任意的数据(以回车换行结束),随后立马就能看到串口调试助手上显示发送出去的数据,这就是本实验实现的数据回显功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/246898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…

什么是前端响应式设计(responsive design)?如何实现响应式布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【MySQL】表的操作

表的操作 MySQL表的操作1、创建表2、创建表案例3、查看当前数据库下所有的表4、查看表结构5、查看创建表时的相关细节6、修改表7、删除表 MySQL表的操作 1、创建表 创建表的SQL语法如下&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释…

python|获取接口请求耗时

你想知道我们请求一个url的时候&#xff0c;握手和请求资源分别占用多长时间么&#xff1f;今天我们使用python写个小案例来看看吧。 项目展示 打开项目&#xff0c;修改hosts、port、methods以及url的变量&#xff0c;即可运行python程序便可获得该页面的详细信息的时间&…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8&#xff01; 在分析 GC 日志时&#xff0c;可以同时采用多种工具&#xff08;Arthas、gceasy、JVM 连接 Graphana 监控&#xff09;进行分析&#xff0c;避免某种工具分析不准确 gceasy 每个月只可以免费…

移动滑轨屏的运用是否对传统展览展示效果产生了哪些影响?

移动滑轨屏因其独特的展示外观和形式&#xff0c;也常被人们称为滑轨电视、电动滑轨&#xff0c;主要由滑动轨道、显示屏、感应装置、控制系统等组件结合实现&#xff0c;是一种解决了传统展览内容展示局限的多功能互动装置&#xff0c;能够呈现动态内容并与用户产生互动交流&a…

【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

00. 目录 文章目录 00. 目录01. 按键控制LED接线图02. 按键控制LED程序示例03. 光敏传感器控制Buzzer接线图04. 有源蜂鸣器原理图05. 光敏传感器控制Buzzer示例06. 程序示例下载07. 附录 01. 按键控制LED接线图 02. 按键控制LED程序示例 led.h #ifndef __LED_H__ #define __L…

Leetcode—896.单调数列【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—896.单调数列 实现代码 class Solution { public:bool isMonotonic(vector<int>& nums) {int up 0;int down 0;if(nums.size() 1) {return true;}for(int i 0; i < nums.size() - 1; i) {if(nums[i] …

github 学习番外篇

我们可以按照仓库开始的提示提交仓库 不知道为什么 出现了 我用 git branch 查看了一下&#xff0c;竟然没发现分支 后来发现是只有commit以后才会显示这个分支 后来显示 这是因为本地和远程仓库不同步的原因 这时候我们就需要git pull 一下 发现两个仓库由于不关联不能git…

未命名文章分布式系统理论基础: 时间、时钟和事件顺序

目录 物理时钟 vs 逻辑时钟 Lamport timestamps Vector clock Version vector 小结 转自&#xff1a;https://www.cnblogs.com/bangerlee/p/5448766.html 该系列博文会告诉你什么是分布式系统&#xff0c;这对后端工程师来说是很重要的一门学问&#xff0c;我们会逐步了解分布式…

Axie Infinity 之后,Ronin 的潜力何在?

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Ronin Dashboard 备受欢迎的 Web3 游戏 Pixels 在 2023 年 10 月下旬从 Polygon 迁移到了专为游戏设计的区块链 Ronin。Pixels 此前作为 Polygon 上活跃用户&#xff08;钱包数量&#xff09;最多的 Web3 游戏&…

scrapy post请求——百度翻译(十四)

scrapy处理 post 请求 爬取百度翻译界面 目录 1.创建项目及爬虫文件 2.发送post请求 1.创建项目及爬虫文件 scrapy startproject scrapy_104 scrapy genspider translate fanyi.baidu.com 2.发送请求 post请求需要传递参数&#xff0c;所以就不能用start_urls和parse函数了&…

系统架构设计师教程(六)数据库设计基础知识

数据库设计基础知识 6.1 数据库基本概念6.1.1 数据库技术的发展6.1.2 数据模型6.1.3 数据库管理系统DBMS功能DBMS 的特点 6.1.4 数据库三级模式 6.2 关系数据库6.2.1 关系数据库基本概念关系的基本术语关系数据库模式关系的完整性约束 6.2.2 关系运算6.2.3 关系数据库设计基本理…

Android修改submodule的lib包名

一、正常使用submodule的流程 在指定路径下&#xff1a; git clone gitgit.youraddress.com:android-apps/taobao.git cd taobao/ git checkout develop git submoudle init git submodule update二、改名步骤 需求&#xff1a;将LibStat改为libStat 因为Linux对大小写敏感…

数据结构之---- 排序算法

数据结构之---- 排序算法 什么是排序算法&#xff1f; 排序算法用于对一组数据按照特定顺序进行排列。 排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更有效地查找、分析和处理。 如图所示&#xff0c;排序算法中的数据类型可以是整数、浮点数、字符或字符串等…

张驰咨询:从零到一领略六西格玛管理的魅力

在高速发展的商业竞技场上&#xff0c;卓越的运营不仅要求高质量的产品与服务&#xff0c;还需要组织内外的协同合作和极致的客户满意度。这正是六西格玛方法论所关注的焦点——通过跨部门的团队合作与数据驱动的决策&#xff0c;实现流程的连续改进&#xff0c;持续推动企业向…

【Hive】——DDL(PARTITION)

1 增加分区 1.1 添加一个分区 ALTER TABLE t_user_province ADD PARTITION (provinceBJ) location/user/hive/warehouse/test.db/t_user_province/provinceBJ;必须自己把数据加载到增加的分区中 hive不会帮你添加 1.2 一次添加多个分区 ALTER TABLE table_name ADD PARTITION…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言&#xff1a; 最近在打开之前的项目demo时&#xff0c;出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下&#xff1a; Executio…

随笔:AI PC这概念要“跑得快”,可能还是得看英特尔

来源 | 购机帮你评 作者 | 牛大叔 最近&#xff0c;PC圈儿都在热炒AI PC概念&#xff0c;无论是英特尔、AMD&#xff0c;还是PC厂商&#xff0c;都在大力宣传AI PC&#xff0c;意思大概是“AI PC是个人电脑未来的发展方向”。所以自然而然的&#xff0c;大家就开始热议一个话题…

PPT插件-超好用的插件-统一尺寸、裁剪、分布-大珩助手

超级对齐-统一尺寸、裁剪、分布 操作方法 先选中1个或多个形状&#xff0c;然后最后选择目标形状&#xff0c;若希望形状的位置也改变&#xff0c;则需要在对齐幻灯下选中对齐对象。 等比缩放 将选中的1个或多个形状的外形尺寸设置为目标形状大小&#xff0c;图像的纵横比可…
最新文章