多点电容触摸屏实验

news2024/9/27 12:16:16

目录

一、简介

二、硬件原理

​编辑1、CT_INT

2、I2C2_SCL和I2C2_SDA

3、RESET复位引脚

三、FT54x6/FT52x6电容触摸芯片

四、代码编写

 1、编写ft5426.h

2、编写ft5426.c

3、main函数


一、简介

电容屏只需要手指轻触即可,而电阻屏是需要手指给予一定的压力才有反应,而且电容触摸芯片输出的触摸点坐标信息为对应的屏幕像素点信息,因此不需要校准,电阻屏需要校准。如今多点电容触摸屏已经得到了广泛的应用,手机、平板、电脑、广告机等等,如果要做人机交互设备的开发,多点电容触摸屏基本是不可能绕过去的
电容触摸屏需要一个IC驱动控制的,一般是I2C接口,多点触摸屏驱动最终就是一个I2C外设驱动

二、硬件原理

找到RGB的原理图

1、CT_INT

触摸中断线

 连接到了GPIO1_IO09,查数据手册

可以复用为GPIO1_IO09

2、I2C2_SCL和I2C2_SDA

 I2C2_SCL:连接到了UART5_TXD;I2C2_SDA:连接到了UART5_RXD,查数据手册

 都可以复用

3、RESET复位引脚

 连接到了SNVS_TAMPER9,查数据手册

 可以看到就复位为GPIO5_IO09

三、FT54x6/FT52x6电容触摸芯片

 使用到的部分寄存器如下

寄存器地址寄存器功能描述
0X00[6:4]模式寄存器设置 FT5426 的工作模式: 000:正常模式。001:系统信息模式100:测试模式。
0X02[3:0]触摸状态寄存器记录有多少个触摸点,有效值为 1~5。
0X03[7:6]第一个触摸点 X 坐标高位数据事件标志: 00:按下。01:抬起10:接触11:保留
[3:0]X 轴坐标值高 4 位。
0X04[7:0]第一个触摸点 X 坐标低位数据X 轴坐标值低 8 位
0X05[7:4]第一个触摸点 Y 坐标高位数据触摸点的 ID。
[3:0]Y 轴坐标高 4 位
0X06[7:0]第一个触摸点 Y 坐标低位数据Y 轴坐标低 8 位
0X09[7:6]第二个触摸点 X 坐标高位数据与寄存器 0X03 含义相同。
[3:0]
0X0A[7:0]第二个触摸点 X 坐标低位数据与寄存器 0X04 含义相同。
0X0B[7:4]第二个触摸点 Y 坐标高位数据与寄存器 0X05 含义相同。
[3:0]
0X0C[7:0]第二个触摸点 Y 坐标低位数据与寄存器 0X06 含义相同
0X0F[7:6]第三个触摸点 X 坐标高位数据与寄存器 0X03 含义相同。
[3:0]
0X10[7:0]第三个触摸点 X 坐标低位数据与寄存器 0X04 含义相同。
0X11[7:4]第三个触摸点 Y 坐标高位数据与寄存器 0X05 含义相同。
[3:0]
0X12[7:0]第三个触摸点 Y 坐标低位数据与寄存器 0X06 含义相同
0X15[7:6]第四个触摸点 X 坐标高位数据与寄存器 0X03 含义相同。
[3:0]
0X16[7:0]第四个触摸点 X 坐标低位数据与寄存器 0X04 含义相同。
0X17[7:4]第四个触摸点 Y 坐标高位数据与寄存器 0X05 含义相同。
[3:0]
0X18[7:0]第四个触摸点 Y 坐标低位数据与寄存器 0X06 含义相同
0X1B[7:6]第五个触摸点 X 坐标高位数据与寄存器 0X03 含义相同。
[3:0]
0X1C[7:0]第五个触摸点 X 坐标低位数据与寄存器 0X04 含义相同。
0X1D[7:4]第五个触摸点 Y 坐标高位数据与寄存器 0X05 含义相同。
[3:0]
0X1E[7:0]第五个触摸点 Y 坐标低位数据与寄存器 0X06 含义相同
0XA1[7:0]版本寄存器版本高字节
0XA2[7:0]版本低字节
0XA4[7:0]中断模式寄存器用于设置中断模式: 0:轮询模式1:触发模式

这里使用设备的IIC地址为0X38

四、代码编写

创建文件

 1、编写ft5426.h

#ifndef __BSP_FT5426_H
#define __BSP_FT5426_H

#include "imx6ul.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_delay.h"
#include "bsp_i2c.h"
#include "stdio.h"

/*寄存器宏*/
#define FT5426_ADDR				0X38	/* FT5426设备地址 		*/

#define FT5426_DEVICE_MODE		0X00 	/* 模式寄存器 			*/
#define FT5426_IDGLIB_VERSION	0XA1 	/* 固件版本寄存器 			*/
#define FT5426_IDG_MODE			0XA4	/* 中断模式				*/
#define FT5426_TD_STATUS		0X02	/* 触摸状态寄存器 			*/
#define FT5426_TOUCH1_XH		0X03	/* 触摸点坐标寄存器,
										 * 一个触摸点用4个寄存器存储坐标数据*/
										 
#define FT5426_XYCOORDREG_NUM	30		/* 触摸点坐标寄存器数量 */
#define FT5426_INIT_FINISHED	1		/* 触摸屏初始化完成 			*/
#define FT5426_INIT_NOTFINISHED	0		/* 触摸屏初始化未完成 			*/

#define FT5426_TOUCH_EVENT_DOWN			0x00	/* 按下 		*/
#define FT5426_TOUCH_EVENT_UP			0x01	/* 释放 		*/
#define FT5426_TOUCH_EVENT_ON			0x02	/* 接触 		*/
#define FT5426_TOUCH_EVENT_RESERVED		0x03	/* 没有事件 */

/* 触摸屏结构体 */
struct ft5426_dev_struc
{	
	unsigned char initfalg;		/* 触摸屏初始化状态 */
	unsigned char intflag;		/* 标记中断有没有发生 */
	unsigned char point_num;	/* 触摸点 		*/
	unsigned short x[5];		/* X轴坐标 	*/
	unsigned short y[5];		/* Y轴坐标 	*/

};

extern struct ft5426_dev_struc ft5426_dev;

void ft5426_init();
void gpio1_io09_irqhandler(unsigned int gicciar,
                            void *param);
unsigned char ft5426_writeonebyte(unsigned char addr,
                                    unsigned char reg, 
                                    unsigned char data);
unsigned char ft5426_readonebyte(unsigned char addr,
                                    unsigned char reg);
void ft5426_read_len(unsigned char addr,
                                unsigned char reg,
                                unsigned char len,
                                unsigned char *buf); 
void ft5426_read_tpcoord();                                                                   
#endif

2、编写ft5426.c

#include "bsp_ft5426.h"

struct ft5426_dev_struc ft5426_dev;
/*初始化5426*/
void ft5426_init()
{
    unsigned char reg_value[2];
    /* 1、初始化IIC2 IO
     * I2C2_SCL -> UART5_TXD
     * I2C2_SDA -> UART5_RXD
     */
    IOMUXC_SetPinMux(IOMUXC_UART5_TX_DATA_I2C2_SCL,1);/*复用为I2C2_SCL*/
    IOMUXC_SetPinMux(IOMUXC_UART5_RX_DATA_I2C2_SDA,1);/*复用为I2C2_SDA*/
    /* 配置I2C2 IO属性	
	 *bit 16:0 HYS关闭
	 *bit [15:14]: 1 默认47K上拉
	 *bit [13]: 1 pull功能
	 *bit [12]: 1 pull/keeper使能 
	 *bit [11]: 0 关闭开路输出
	 *bit [7:6]: 10 速度100Mhz
	 *bit [5:3]: 110 驱动能力为R0/6
	 *bit [0]: 1 高转换率
	 */
    IOMUXC_SetPinConfig(IOMUXC_UART5_TX_DATA_I2C2_SCL,0x70b0);
    IOMUXC_SetPinConfig(IOMUXC_UART5_RX_DATA_I2C2_SDA,0x70b0);
    /*初始化INT引脚,使能中断*/
    gpio_pin_config_t ctint_config;
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO09_GPIO1_IO09,0);/*复用为GPIO1_IO09*/
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO09_GPIO1_IO09,0xf080);
    /* 中断IO初始化 */
    ctint_config.direction =kGPIO_IntRisingOrFallingEdge;
    gpio_init(GPIO1 , 9 , &ctint_config);

    GIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);
    system_register_irqhandler(GPIO1_Combined_0_15_IRQn,
                                (system_irq_handler_t)gpio1_io09_irqhandler,
                                NULL);
    gpio_enableint(GPIO1 , 9);
    /*复位引脚rst初始化*/
    gpio_pin_config_t ctrst_config;
    IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0);/*复用为GPIO5_IO09*/
    IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER9_GPIO5_IO09,0x10b0);
    gpio_init(GPIO5 , 9 , &ctrst_config);
    gpio_pinwrite(GPIO5 , 9 , 0);/*复位*/
    delayms(50);
    gpio_pinwrite(GPIO5 , 9 , 1);/*停止复位*/
    delayms(50);
    /*I2C2初始化*/
    i2c_init(I2C2);

    /*ft5426初始化*/
    ft5426_read_len(FT5426_ADDR,
                    FT5426_IDGLIB_VERSION,
                    2,
                    reg_value);
    printf("touch frimware version:%#x\r\n",
            ((unsigned short)reg_value[0] << 8) | reg_value[1]);
    /*设置工作在正常模式*/
    ft5426_writeonebyte(FT5426_ADDR,FT5426_DEVICE_MODE,0);
    /*设置中断模式*/
    ft5426_writeonebyte(FT5426_ADDR,FT5426_IDG_MODE,1);

    ft5426_dev.initfalg = FT5426_INIT_FINISHED;

            
}
/*中断处理函数*/
void gpio1_io09_irqhandler(unsigned int gicciar , void *param)
{
    if(ft5426_dev.initfalg == FT5426_INIT_FINISHED)
    {
        ft5426_read_tpcoord();
    }
    /*清除中断标志位*/
    gpio_clearintflags(GPIO1,9);
}
/*向FT5426写入数据*/
unsigned char ft5426_writeonebyte(unsigned char addr,
                                    unsigned char reg, 
                                    unsigned char data)
{
    unsigned char status=0;
    unsigned char writedata=data;
    struct i2c_transfer masterXfer;
	
    /* 配置I2C xfer结构体 */
   	masterXfer.slaveAddress = addr; 			/* 设备地址 				*/
    masterXfer.direction = kI2C_Write;			/* 写入数据 				*/
    masterXfer.subaddress = reg;				/* 要写入的寄存器地址 			*/
    masterXfer.subaddressSize = 1;				/* 地址长度一个字节 			*/
    masterXfer.data = &writedata;				/* 要写入的数据 				*/
    masterXfer.dataSize = 1;  					/* 写入数据长度1个字节			*/

    if(i2c_master_transfer(I2C2, &masterXfer))
        status=1;
        
    return status;
}
/*从FT5426读数据*/
unsigned char ft5426_readonebyte(unsigned char addr,
                                    unsigned char reg)
{
	unsigned char val=0;
	
	struct i2c_transfer masterXfer;	
	masterXfer.slaveAddress = addr;				/* 设备地址 				*/
    masterXfer.direction = kI2C_Read;			/* 读取数据 				*/
    masterXfer.subaddress = reg;				/* 要读取的寄存器地址 			*/
    masterXfer.subaddressSize = 1;				/* 地址长度一个字节 			*/
    masterXfer.data = &val;						/* 接收数据缓冲区 				*/
    masterXfer.dataSize = 1;					/* 读取数据长度1个字节			*/
	i2c_master_transfer(I2C2, &masterXfer);

	return val;
}
/*从FT5426读多个寄存器数据*/
void ft5426_read_len(unsigned char addr,
                                unsigned char reg,
                                unsigned char len,
                                unsigned char *buf)
{
	struct i2c_transfer masterXfer;	
	masterXfer.slaveAddress = addr;				/* 设备地址 				*/
    masterXfer.direction = kI2C_Read;			/* 读取数据 				*/
    masterXfer.subaddress = reg;				/* 要读取的寄存器地址 			*/
    masterXfer.subaddressSize = 1;				/* 地址长度一个字节 			*/
    masterXfer.data = buf;						/* 接收数据缓冲区 				*/
    masterXfer.dataSize = len;					/* 读取数据长度1个字节			*/
	i2c_master_transfer(I2C2, &masterXfer);
}
/*读取触摸坐标信息*/
void ft5426_read_tpcoord()
{
    unsigned char pointbuf[FT5426_XYCOORDREG_NUM],i=0,type=0;
    ft5426_dev.point_num = ft5426_readonebyte(FT5426_ADDR,FT5426_TD_STATUS);
    printf("touch num = %d\r\n",ft5426_dev.point_num);
    /*触摸点信息寄存器*/
    ft5426_read_len(FT5426_ADDR,
                    FT5426_TOUCH1_XH,
                    FT5426_XYCOORDREG_NUM,
                    pointbuf);
    for(i=0;i<ft5426_dev.point_num;i++){
        unsigned char *buf = &pointbuf[i*6];
        ft5426_dev.y[i] = ((buf[0] << 8) | buf[1]) & 0xfff;
        ft5426_dev.x[i] = ((buf[2] << 8) | buf[3]) & 0xfff;
        type = buf[0] >> 6;
        if(type == FT5426_TOUCH_EVENT_DOWN){

        }else if(type == FT5426_TOUCH_EVENT_UP){

        }else if(type == FT5426_TOUCH_EVENT_ON){

        }else{

        }
    }

}

3、main函数


#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_uart.h"
#include "bsp_lcd.h"
#include "bsp_lcdapi.h"
#include "bsp_rtc.h"
#include "bsp_icm20608.h"
#include "bsp_spi.h"
#include "stdio.h"
#include "bsp_ft5426.h"
#include "bsp_gt9147.h"


/*
 * @description	: main函数
 * @param 		: 无
 * @return 		: 无
 */
int main(void)
{
	unsigned char i = 0;
	unsigned char state = OFF;
	
	int_init(); 				/* 初始化中断(一定要最先调用!) */
	imx6u_clkinit();			/* 初始化系统时钟 					*/
	delay_init();				/* 初始化延时 					*/
	clk_enable();				/* 使能所有的时钟 					*/
	led_init();					/* 初始化led 					*/
	beep_init();				/* 初始化beep	 				*/
	uart_init();				/* 初始化串口,波特率115200 */
	lcd_init();					/* 初始化LCD 					*/		
	
	/* 初始化触摸屏					*/ 
	gt9147_init();
	if(gt_init_fail==1) //判断gt系列初始化是否失败
	{
		ft5426_init();
	}

	tftlcd_dev.forecolor = LCD_RED;
 
	lcd_show_string(50, 10, 400, 24, 24, (char*)"ALPHA-IMX6UL TOUCH TEST");    /* 显示字符串 */
	lcd_show_string(50, 40, 200, 16, 16, (char*)"MY@4384");  
	lcd_show_string(50, 60, 200, 16, 16, (char*)"2023/2/22");  

	lcd_show_string(50, 110, 400, 16, 16,	(char*)"TP Num	:");  
	lcd_show_string(50, 130, 200, 16, 16,	(char*)"Point0 X:");  
	lcd_show_string(50, 150, 200, 16, 16,	(char*)"Point0 Y:");  
	lcd_show_string(50, 170, 200, 16, 16,	(char*)"Point1 X:");  
	lcd_show_string(50, 190, 200, 16, 16,	(char*)"Point1 Y:");  
	lcd_show_string(50, 210, 200, 16, 16,	(char*)"Point2 X:");  
	lcd_show_string(50, 230, 200, 16, 16,	(char*)"Point2 Y:");  
	lcd_show_string(50, 250, 200, 16, 16,	(char*)"Point3 X:");  
	lcd_show_string(50, 270, 200, 16, 16,	(char*)"Point3 Y:");  
	lcd_show_string(50, 290, 200, 16, 16,	(char*)"Point4 X:");  
	lcd_show_string(50, 310, 200, 16, 16,	(char*)"Point4 Y:"); 

	while(1)					
	{
			lcd_shownum(50 + 72, 110, ft5426_dev.point_num , 1, 16);
			lcd_shownum(50 + 72, 130, ft5426_dev.x[0], 5, 16);
			lcd_shownum(50 + 72, 150, ft5426_dev.y[0], 5, 16);
			lcd_shownum(50 + 72, 170, ft5426_dev.x[1], 5, 16);
			lcd_shownum(50 + 72, 190, ft5426_dev.y[1], 5, 16);
			lcd_shownum(50 + 72, 210, ft5426_dev.x[2], 5, 16);
			lcd_shownum(50 + 72, 230, ft5426_dev.y[2], 5, 16);
			lcd_shownum(50 + 72, 250, ft5426_dev.x[3], 5, 16);
			lcd_shownum(50 + 72, 270, ft5426_dev.y[3], 5, 16);
			lcd_shownum(50 + 72, 290, ft5426_dev.x[4], 5, 16);
			lcd_shownum(50 + 72, 310, ft5426_dev.y[4], 5, 16);
		
		delayms(10);
		i++;	
		if(i == 50)
		{	
			i = 0;
			state = !state;
			led_switch(LED0,state); 
		}
	}
	return 0;
}

烧写到sd卡插到开发版上后就触摸,就会显示多少个触摸点和相关触摸点的坐标

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch7.8.0版本进阶——动态更新索引

目录一、如何在保留不变性的前提下实现倒排索引的更新二、按段搜索执行流程三、按段搜索的文档查询四、按段搜索的文档删除五、按段搜索的文档更新一、如何在保留不变性的前提下实现倒排索引的更新 用更多的索引。通过增加新的补充索引来反映最近的修改&#xff0c;而不是直接…

【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

[Flink]部署模式(看pdf上的放上面)

运行一个wordcountval dataStream: DataStream[String] environment.socketTextStream("hadoop1", 7777) //流式数据不能进行groupBy,流式数据要来一条处理一次.0表示第一个元素,1表示第二个元素 //keyBy(0)根据第一个元素进行分组 val out: DataStream[(String, In…

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

1. Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 功能结构图 2. 登录认证 对于一些登录之后才能访问的接口&#xff08;例如&…

Graph Embedding基础 图表示学习 什么是Graph Embedding

本文包括 DeepWalk LINE SDNE Node2vec Struc2vec等几个重要的Graph Embedding 方法 先说下不同embedding的区别是什么&#xff1a; DeepWalk&#xff1a;采用随机游走&#xff0c;形成序列&#xff0c;采用skip-gram方式生成节点embedding。node2vec&#xff1a;不同的随机游…

[游戏开发][Unity]Assetbundle打包篇(4)开始打包

上一篇文章讲了如何收集打包资源&#xff0c;得到了一个List<AssetInfo>下面正式进入打包流程&#xff0c;调用PostAssetBuild方法即可开始正式打包流程public void PostAssetBuild() {Debug.Log("------------------------------OnPostAssetBuild-----------------…

ASE140N04-ASEMI低压MOS管ASE140N04

编辑-Z ASE140N04在TO-220F封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为4mΩ&#xff0c;是一款N沟道低压MOS管。ASE140N04的最大脉冲正向电流ISM为400A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~175摄氏度。ASE140N04…

深入浅出——this的理解与使用

文章目录 this的语法理解一、this的绑定方式二、两个细节 1.严格模式引入库2.如何更改this指向总结this的语法理解 this在英文中是一个指示代词&#xff0c;表示 这&#xff1b;这个 顾名思义&#xff0c;在编程于语言里&#xff0c;this就是一个指代作用。 我在人民广场吃…

《分布式技术原理与算法解析》学习笔记Day20

CAP理论 什么是CAP理论&#xff1f; CAP理论用来指导分布式系统设计&#xff0c;以保证系统的可用性、数据一致性等。 C&#xff0c;Consistency&#xff0c;一致性&#xff0c;指所有节点在同一时刻的数据是相同的&#xff0c;即更新操作执行结束并响应用户完成后&#xff…

GO 中的 defer 有哪些注意事项?上

xdm &#xff0c; 不知道你们是否有使用过 defer &#xff0c;这种语法在是 go 特有的&#xff0c;用起来真是爽的不要不要的 很多时候&#xff0c;我们在使用一些新东西&#xff0c;出现一些莫名其妙的现象或者是结果的时候&#xff0c;我们总会认为&#xff0c;这个东西不友…

打游戏什么蓝牙耳机好用?打游戏比较好的蓝牙耳机

游戏耳机提供身临其境的细致声音&#xff0c;同时也是与朋友在线聊天的绝佳通信设备&#xff0c;尤其对于游戏玩家来说&#xff0c;聆听和被聆听的最佳方式之一就是游戏耳机&#xff0c;那2023年到底有哪些值得购买的游戏耳机呢&#xff1f;现在就让我们一起来看看吧。 第一款…

【uniapp】uniapp项目vue2/vue3引入使用vant组件库

前言 vant是一个优秀的移动端组件库&#xff0c;他支持VUE2、VUE3、微信小程序三个框架&#xff0c;这期就来尝试在uniapp中&#xff0c;vue2和vue3分别引入vant组件库 注意&#xff1a;本教程只适用H5&#xff0c;无法运行到微信小程序 Vue3引入vant 新建一个uniapp项目&am…

如何利用 Python 进行客户分群分析(附源码)

每个电子商务数据分析师必须掌握的一项数据聚类技能 如果你是一名在电子商务公司工作的数据分析师&#xff0c;从客户数据中挖掘潜在价值&#xff0c;来提高客户留存率很可能就是你的工作任务之一。 然而&#xff0c;客户数据是巨大的&#xff0c;每个客户的行为都不一样。20…

python中安装gurobi和pycharm没有语法提示问题解决

安装gurobi第一步 &#xff1a;下载gurobi ( http://www.gurobi.com ) &#xff0c;需要注册账号第二步、申请License注册如果可以通过校园网&#xff0c; 则直接生成。不能的话&#xff0c;通过网站&#xff0c;发邮件申请 http://www.gurobi.cn/NewsView1.Asp?id4第三、邮件…

【虹科】基于Lidar的体积监控实现高效的库存管理

迄今为止&#xff0c;很多物料厂家测量库存的结果数据仍然不准确&#xff0c;会存在很大的误差&#xff0c;导致供应链效率低下——这个问题可以通过Lidar技术轻松解决。近年来&#xff0c;全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河&#xff0c;阻塞海峡…

JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 在线学习管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

从事Python自动化测试,30岁熬到月薪20K+,分享我的多年面试经…

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我是小码哥&#xff0c;一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0…

nodejs/eggjs如何使用第三方pure esm lib

问题Instead change the require of index.js in xxx/app/ws/index.ts to a dynamic import() which is available in all CommonJS modules.上述错误发生在我使用import引入一个第三方包的时候提示的&#xff0c;至于原因&#xff0c;主要是node当前仅支持cjs&#xff0c;而目…

TCP的三握四挥

本文是向大家介绍tcp的三次握手四次挥手的全过程&#xff0c;能够让我们更熟悉面向连接的传输层控制协议的原理&#xff0c;保证了数据传输的稳定性和可靠性。如果我们把网络体系按照OSI模型划分&#xff0c;那么不论是从上往下还是从下往上数&#xff0c;处于最中间的都是传输…

复赛名单公布!2022隐私计算HACKATHON大赛火热进行中!

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号O…