arduino 记录

news2024/11/18 3:49:10

知识整理

Arduion

U8G2简要说明

u8g2显示分为全页显示与分页显示和U8X8的无ram显示

全页显示需要单片机提供1024字节的ram,分页显示分为需要256字节和125字节的ram

U8X8不需要ram,但不可画图,只能显示文字

全页使用 clearbuff senddbuff

分页使用 U8G2.fisrt Page  while(u8g2.next page)

         参考arduino u8g2示列

接口方式分为spi和IIC ,8080,8060控制方式

SPI 可以分为硬件SPI和软件SPI

IIC可以分为硬件IIC 和软件IIC

速度对比:8080 8060 >硬件SPI >l软件SPI>硬件IIC>软件IIC

IO口占用量  8080 8060 >SPI >IIC

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

//U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 12, /* dc=*/ 4, /* reset=*/ 6); // Arduboy (Production, Kickstarter Edition)

//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

//U8G2_SSD1306_128X64_ALT0_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);   //

4W 4WIRE 4线

NONAME 全页显示

HW HARDWARE 硬件 HW_SPI硬件SPI

SW SOFTWARE 软件 SW_SPI 软件SPI

u8g2 firstpage sendbuffer区别

。/ U8G2/PAGEBUFF/DRAW LOGO 

U8g2lib Example Overview:

    Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumption

    Page Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards.

    U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only.

arduino 因只有2K的RAM,如果程序占用RAM可以使用PAGEBUFF模式

U8G2因使用的显存的不同,显示分为分页显示与整页显示

当使用1024时,可以整页显示 sendbuffer clearbuff

使用分页显示时 有128 256字节内存,但一次只能画一部份,从而需要多次画 使用FIRSTPAGE/NEXTPAGE 

U8X8模式下则不使用RAM

u8g2.clearnbuffer();

//do somthing

u8g2.sendBuffer();

当使用256 128时,一页显示不完,多次调用

u8g2.firstPage();

do{

//do somthing

}while(u8g2.next());

1024 256 128 内存

不够的话分页显示 也就是firstpage

速度有点降

够的话用 sendbuff

u8g2

源代码地址: https://github.com/olikraus/u8g2

PNG转字库软件地址 https://github.com/olikraus/u8g2/tree/master/tools/font/png2bdf

字库制作 使用u8g2自带的工具,将图片转为字体文件,可以压缩图片的数据,减少空间占用

使用说明:

test\目录下 do_track.sh

rm track_font.png

../png2bdf -f track -o track.bdf -e 65 *.png

../../bdfconv/bdfconv -f 1 -b 0 -m '65-97' -v track.bdf -n track_font -o track_font.c -d ../../bdf/helvB24.bdf -g 4

convert bdf.tga track_font.png

rm bdf.tga

提供的字体类型  \u8g2-master\doc\u8g2fntlistall.pdf

帮助:https://github.com/olikraus/u8g2/wiki

玩转u8g2 OLED库,一篇就够——基于SMT32、HAL

https://blog.csdn.net/qq_51096702/article/details/130257230

adafruit-gfx 显示器库,提供统一的对多种显示器的统一操作

字体显示 ,绘图

TFT-ESPI 设置显示模式

arduino u8g2 表情字库制作

 U8G2 下载原代码 : GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2

1.制作图片

说明: https://img-blog.csdnimg.cn/c5a35c95891f42c691a230c2c9d7fbac.png

​编辑

使用FLASH 或任何可以画图的软件制作动态图片PNG格式

大小最好先设定好如40x80 ,最好不要太大 128X64,60X60

将制作好的图片放入 下载好的 u8g2-master\u8g2-master\tools\font\png2bdf\tst\目录下

(新建tst文件夹)

2.将图片变成字体

打开下载的U8G2源文件 找到u8g2-master\u8g2-master\tools\font\png2bdf

使用cmd命令 进入u8g2-master\u8g2-master\tools\font\png2bdf 或是 创建bat文件,添加下面语语

png2bdf -o tst\myfont.bdf -f myfont -e 65  tst\*.png  //将tst文件夹下所有Png文件 转换成bdf字体格式 编号(-e) 从65 开始 glyph中使用(示列来自U8G2源代码中的示列文件 )

运行上面代码将生成myfont.bdf文件

(白底 使用 -i 选项 翻转颜色)png2bdf -o tst\myfonti.bdf -f myfont -e 65 -i tst\*.png

3.将bdf文件生成 字体文件

进入u8g2-master\u8g2-master\tools\font\bdpconv下

使用使用cmd命令 进入u8g2-master\u8g2-master\tools\font\bdpconv

                      或在目录下  创建bat文件,添加下面语语,使用bdp生成c

           bdfconv.exe -v -f 1 -m "64-511" myfont.bdf -o myfont.c -n myfont -d myfont.bdf
type myfont.c   //将myfont.bdf转换成 myfont.c  字体名(-n) myfont  描述信息(-d) myfont.bdf

编码号 从 64-511 glyph中使用

myfont.c中添加声明 “u8g2.h",复制到 Arduino\libraries\U8g2\src\clib 下

打开arduino 示列 u8g2 ->weather或是其它 

添加

extern uint8_t myfont1[]; //表情字体

void emo_tst(void)

{

//emo 字体

    u8g2.setFont(myfont1);

    u8g2.setColorIndex(draw_color);

 int k = 0;

  for(int i = 0;i<66;i++)

  {

    k = k+1;

    u8g2.clearBuffer();

    u8g2.drawGlyph(34,60,65+k%8); //使用%循环播放 8为图片的数量,65为png bdf生成时设置的值

    //u8g2.drawGlyphX2(0,0,65+k%8);

    u8g2.sendBuffer();

    delay(100);

  }

}

****png 位深须为1 : 处理方法  保存为单色位图  bmp ,后再保存为png 

png2bdf 命令 -o 输出文件 名 -f 字体名称  tst\*.png 文件tst下所有png文件 -e 编码号开始  即显示时的第一个编码号设置 glyph显示时 65

bdfconv.exe 命令 

.c文件中添加 #include"u8g2.h" 否则错误

错误

表情字体显示错误

删除错误的图片重新编辑 

MP4转GIF python代码

import os

import imageio

def mp42gif(file_name):

    rd = imageio.get_reader(file_name)

    wt = imageio.get_writer('1.gif',mode="I",size=(80,40))

    for frame in rd:

        wt.append_data(frame)

   

    wt.close();

mp42gif(args[1])

GIF转PNG代码

import os

import sys

from PIL import Image

from PIL import ImageSequence

from pathlib import Path

def gif2png(file_name):

    image_name = 'gif'

    i = 0;

    with Image.open(file_name) as im:

        for i,frame in enumerate(ImageSequence.Iterator(im)):

            if(i % 5 == 0):

                pt = Path(file_name).stem

                frame = frame.convert('1')

                frame.save(r".\tst\%s%02d.png"%(pt,i))

           

            i = i+1;

if(__name__ == "__main__"):

    u = 0

   

    for i in (sys.argv):

        if(u >0):

            gif2png(i)

            print(i)

        u = u+1

       

    input('ab')

   

VSCODE

添加库

移植U8G2

ESP32

开发板选择 ESP32 dev module 

说明: https://img-blog.csdnimg.cn/9cbfc6d613b24781bff26eea0f8764fb.png

​编辑

esp投屏 拔掉重插

spi uart iic usb can

差别

同步时钟,由主机控制通信频率

spi SCLK MOSI MISO SS

IIC SCL SDA

速度spi

IIC  SDA SCL 上拉4.7K电阻,

UART 异步,约定通讯频率

USB

CAN

差分通信,速度,稳定性

PYTHON

Serial 串口

官方文档 pySerial API — pySerial 3.4 documentation

安装

先卸载serial

python 安装 pip install pyserial

import serial

import time

sr = serial.Serial("COM5",9600,timeout = 0.1)

time.sleep(3) #重要的事说三遍 延时 延时 延时等待初始化完成

sr.set_buffer_size(2,2) #上面不延时,此处设置无效

python3.6 如果装了serial很可能会遇到 AttributeError: module 'serial' has no attribute 'Serial' 这时候你要先卸载serial,在安装pyserial。

增加等待函数,否则

Input函数

input 阻塞 sys.stdin.readline()

串口通信 pyserial

问题 卸载

delay sleep 否则错误

https://www.cnblogs.com/liuxuanhe/articles/9112185.html python遇到的坑

python3.6 如果装了serial很可能会遇到 AttributeError: module 'serial' has no attribute 'Serial' 这时候你要先卸载serial,在安装pyserial。

Python应用开发——串口通信  Python应用开发——串口通信

不要使用 try 错误找不到

serial 御载 serial 安装 pyserial

文件名不要叫serial

VSCODE

vscode

ARUDINO exe的目录,否则错误

ARDUINO NANO A4,A5脚问题

STM32默认HARDWARE问题

STM32使用Arduino时指定串口的方法_arduino stm32 多串口-CSDN博客

拖地僧_国产MCU,stm32,ardunio-CSDN博客

软件SPI IIC WIRE HARDWIRE

stm32 arduino 使用

Ardruino IDE 

下载程序 

配件 usb转ttl ,stm32f103xx 板

使用 PA9 PA10 端口

PA9接 RX ,PA10接 TX ,3.3接 STM32板子的3.3V(面包板上发现5V更稳定,有时3.3无法上传),GND接GND

usb 转ttl  TX->PA10 RX ->PA9 GND->GND 3.3V ->3.3V 

python print("%d %d", %(1,2))

arduino 串口 不要回车

arduino

analogWrite 使用PWM

analogRead 使用DAC 两者不同

ANALOGWRITE 3,6,9,11,5,10 可使用PWM 其它引脚使用ANALOGWRITE不输出内容

 在Arduino GPIO

D0–D7是PD寄存器,

D8–D13是PB寄存器,

A0–A5+RESET是PC寄存器

每一个寄存器共8位,编号分别为0-7。

2.寄存器操作
DDRx ---------控制输出方向; //设定寄存器引脚输入输出模式(0:输入;1:输出)
PORTx -控制输出数据0、1; //改变寄存器引脚电平状态
PINx —控制(读取)输入数据; //读取寄存器引脚的电平状态


//指令中的x表示的要使用的寄存器
————————————————
版权声明:本文为CSDN博主「林逸壕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51358997/article/details/128642996

【Arduino学习】一、IO口操作_arduino 操作系统_林逸壕的博客-CSDN博客

使用PA9 PA10 进行串口收发

使用ST官方Arduino库,可在STM32全系列开发板上进行如下实验。

注意:实例化串口对象需要加数字编号(Serialx中的x是串口编号,取值是1,2……):

HardwareSerial Serialx(PA10, PA9);  //将Serialx(x=1-4)串口x的管脚,一定要带编号,如:Serial1
强调一下:不能实例化默认的串口:HardwareSerial Serial(PA10, PA9)
————————————————
版权声明:本文为CSDN博主「笑春风oO」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qcmyqcmy/article/details/128393652

修改delay函数,模拟多线程操作,可以随时中断程序操作

#include <HardwareSerial.h>

HardwareSerial Serial1(PA10,PA9);

void setup() {

  Serial1.begin(115200);

 pinMode(PC13, OUTPUT);

 Serial1.println("hello");

}

// the loop function runs over and over again forever

void loop() {

 Serial2.println("hello world");

 digitalWrite(PC13, HIGH);  // turn the LED on (HIGH is the voltage level)

 delay(100);       // wait for a second

 digitalWrite(PC13, LOW);  // turn the LED off by making the voltage LOW

 delay(100);       // wait for a second

 Serial1.println("hello world");

}

#include <HardwareSerial.h>

HardwareSerial Serial1(PA10,PA9);

typedef unsigned int time_count;

typedef unsigned int State;

void setup() {

  // put your setup code here, to run once:

  Serial1.begin(115200);

  pinMode(PA2,OUTPUT);

  pinMode(PB6,OUTPUT);

  Serial1.println("hello");

}

  time_count tc0 = 0;

  time_count tc1 = 0;

  time_count tc2 = 0;

  State state2 = 0;

  bool bl1 = 0;

  int data = 0;

void loop() {

  // put your main code here, to run repeatedly:

  tc0 = tc0 +1;

  delay(1);

  //fly delay(20)

  if(tc0 % 20 == 0)

  {

    tc1 = tc1+1;

  }

  if(tc1 > 50 )

  {

   

    bl1 = !bl1;

    digitalWrite(PA2,bl1);

    digitalWrite(PB6,!bl1);

    tc1 = 0;

  }

  //breath  0->10 -> 0 silm 50  delay(100);

  if( tc0 % 100 == 0)  //wait delay 50

  {

    tc2 = tc2 +1;

  if(tc2 <= 10)

  {

    state2 = 0;

    data = data +1;

  }

  else if(tc2 < 20 )

  {

    state2 = 1;

    data = data -1;

  }

  else if(tc2 < 70 )

  {

    state2 = 3;

    data = 0;

  }

  else

  {

    state2 = 0;

    tc2 = 0;

  }

  Serial1.println(data);

  analogWrite(PA3,data);

  }

}

python 串口发送图片给arduino

python 代码

import serial

import threading

import time

from PIL import Image

from PIL import ImageSequence

##    im.show()

   

##print(img)

##

####img = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

##print("image len:",len(img))

##for i in range(len(img)):

##    img[i] = i

   

##print(img)

sr = serial.Serial("COM5",9600,timeout = 0.1)

##sr.baudrate = 9600

##sr.bytesize = 8

##sr.parity = 'N'

##sr.stopbits = 1

sr.set_buffer_size(2,2)

time.sleep(3)

def rec_thread():

    while(1):

        data = ''

        if(sr.inWaiting()>0):

            print("receive:<------",end = '')

            data = sr.read(sr.inWaiting())

            print(str(data))

            print("receive end//")

           

if __name__ == "__main__":

    t1 = threading.Thread(target = rec_thread)

    t1.start()

    img = ''

    with Image.open(r"yh.gif") as im:

        for i,frame in enumerate(ImageSequence.Iterator(im)):

            frame = frame.resize((128,64),Image.ANTIALIAS)

            frame = frame.convert('1')

##            frame.show()

            img = frame.tobytes()

            sr.write(img)

            sr.flush()

##            time.sleep(0.1)

   

##    send_num = 1024

##

##    k = 0;

####    for i in range(int(len(img)/send_num)+1):

##    sr.write(img[k:k+send_num])

##    print("send---->:",img[k:k+send_num])

##    k = k + send_num

    time.sleep(0.1)

##        sr.flush()

       

##        print("s_hex:{} \n".format(  s_hex),end = '')

##        time.sleep(2)

    print("---------")

       

   

   

   

arduino代码 

#include <Arduino.h>

#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI

#include <SPI.h>

#endif

#ifdef U8X8_HAVE_HW_I2C

#include <Wire.h>

#endif

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/13, /* data=*/11, /* cs=*/10, /* dc=*/9, /* reset=*/8);

unsigned char buff[1024];

void setup(void) {

  Serial.begin(9600);

  u8g2.begin();

  // for(int i = 0;i<1024;i++)

  // buff[i] = 0xff;

    //u8g2.setBitmapMode(1);

    //u8g2.setFont(u8g2_font_ncenB14_tr);

}

int i = 0;

void loop(void) {

  if(Serial.available()>0){

    buff[i] = Serial.read();

    i = i +1;

  }

  if(i >= 1023)

  {

    i = 0;

      u8g2.firstPage();

      do {

        u8g2.drawBitmap(0, 0, 16,64, buff); //right

        //u8g2.drawXBM(0, 0, 128,64, buff);

        //u8g2.drawXBMP(0, 0, 128,64, buff);

     

      } while (u8g2.nextPage());

        delay(1000);

  }

}

print write 区别

wirte 16 进制 字节

print 字符

arduino print

参考:

u8g2绘制方法 - 简书

 https://github.com/olikraus/u8g2/wiki/u8g2reference

玩转u8g2 OLED库,一篇就够——基于SMT32、HAL_stm32 u8g2_深藏ぺblue的博客-CSDN博客

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

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

相关文章

javaweb中的转发与重定向

2023.10.22 在一个web应用中应该如何完成资源的跳转&#xff1f; 转发重定向 转发和重定向有什么区别&#xff1f; 转发是由服务器端进行的页面跳转&#xff0c;而重定向是由浏览器端进行的页面跳转。 ①代码上的区别&#xff1a; 转发&#xff1a; // 获取请求转发器对象…

Sublime Text forMac/Windows:高效代码编辑器的终极指南

你是否曾为寻找一款高效、强大且用户友好的代码编辑器而感到困扰&#xff1f;现在&#xff0c;让我们一起探索Sublime Text的魅力。Sublime Text是一款流行的代码编辑器&#xff0c;以其强大的功能和简洁的设计赢得了开发者的喜爱。本文将带你了解Sublime Text的各项特性&#…

1、VMware虚拟机及网络配置

一、VMware虚拟网络编辑器 1、选择NAT模式并配置子网 2、进入NAT设置&#xff0c;配置网关 3、宿主机网络适配器设置 二、创建虚拟机 在这里插入图片描述 三、开启虚拟机&#xff0c;安装操作系统 在该网段内配置静态ip&#xff0c;指定网关为前面NAT配置的网关地址…

游戏找不到msvcr100dll怎么办,分享5个有效修复方法

一、游戏找不到msvcr100dll会造成的困扰 在当今的数字时代&#xff0c;电子游戏已经成为了我们生活中不可或缺的一部分。它们为我们提供了娱乐和放松的机会&#xff0c;让我们能够在忙碌的生活中找到乐趣。然而&#xff0c;当我们在玩游戏时&#xff0c;可能会遇到一些技术问题…

【性能测试】MySQL慢查询原因/排查思路+SQL优化与性能定位思路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Mysql慢查询现象、…

十四天学会C++之第八天:文件操作

1. 文件的打开和关闭 文件操作的基本概念。打开文件&#xff1a;使用fstream库打开文件以供读写。关闭文件&#xff1a;确保文件在使用完毕后正确关闭。 文件的打开和关闭&#xff1a;C 文件操作入门 在C编程中&#xff0c;文件操作是一项重要的任务&#xff0c;可以读取和写…

Java日志系统之Log4j2

Log4j2介绍 Log4j2是Log4j的升级版&#xff0c;参考Logback的优秀设计并修复了一些问题。主要优点有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应用感知到&#xff0c;但是在log4j2中&#xff0c;提供了一些异常处理机制。性能提升&am…

Java高级编程----集合

集合 集合概述Collection接口List接口简介ArrayList集合Set接口简介Hash Set接口简介Map接口简介TreeMap集合Properties集合 集合概述 为了在程序中可以保存数目不确定的对象&#xff0c;Java提供了一系列特殊类&#xff0c;这些类可以存储任意类型的对象&#xff0c;并且长度…

使用java mail SMTPTransport发送邮箱,本地秒到,一上服务器就20-30s左右,生产环境直接发送失败。

一、代码 pom文件 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--pom.xml添加javax.mail的引用&#xff0c;或者项目引入…

【最短路径算法】一文掌握Dijkstra算法,详解与应用示例+代码

目录 1 Dijkstra算法 2 Dijkstra算法的步骤 3 Dijkstra算法python实现 4 Dijkstra算法应用示例详解 1 Dijkstra算法 Dijkstra算法&#xff08;迪杰斯特拉算法&#xff09;是一种用于在加权图中查找从一个起始节点到所有其他节点的最短路径的算法。该算法最初由荷兰计算机科…

JVM 基础篇:类加载器

一.了解JVM 1.1什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机功能来实现的&#xff0c;JVM屏蔽了与具体操作系统平台相关的信息&#xff0c;Java程序只需…

通讯录和内存动态管理

目录 (通讯录)动态增长版 实现效果 找单身狗 题目 源码 思路 三个内存函数的模拟实现 模拟实现strncpy 模拟实现strncat 模拟实现atoi (通讯录)动态增长版 该版本通讯录在原版的基础上增加了检查容量函数&#xff0c;实现了通讯录的动态…

在PS中轻松实现肖像磨皮,感受Imagenomic Portraiture 4的强大

每个人都希望自己的肖像照片看起来漂亮、清晰并且光滑。然而&#xff0c;在处理肖像照片时&#xff0c;要达到这些效果通常需要花费大量时间和精力。如果您正在寻找一种简单快捷的方法来优化您的肖像照片&#xff0c;那么Imagenomic Portraiture 4插件将是您的理想选择。 Imag…

单接口的批量测试如何实现

一、痛点&#xff1a;一条测试数据对应一个测试方法 前面的章节中我们已经写代码实现了登录接口的处理调用&#xff0c;但是一个接口往往是需要多条测试用例才能完整的覆盖到每一种情况&#xff0c;针对于单接口多条测试用例需要执行的情况&#xff0c;该如何处理呢&#xff0…

uboot移植之mx6ull_alientek_nand.h文件详解一

一. 简介 mx6ull_alientek_nand.h文件是 开发板的 uboot的一个配置文件。每个开发板都有一个 .h的配置文件。 mx6ull_alientek_nand.h文件其实是 之前针对正点原子ALPHA开发板移植的 Uboot配置文件。 本文简单分析一下 针对正点原子ALPHA开发板的 配置文件&#xff1a; mx6u…

STL模拟实现—vector

引言&#xff1a;本篇文章主要是模拟实现vector&#xff0c;但不同于stl中vector的成员变量都是迭代器&#xff0c;这个自定义的vector是一个T* 的数据变量和一个int类型的size和int类型的capacity。&#xff08;有时间再写三个迭代器的版本吧&#xff01;&#xff09; 首先来看…

Redis学习(第八章缓存策略)

目录 RdisExample 课程介绍 1.Redis介绍 2.Redis 安装 3. Redis的数据结构 4. Redis缓存特性 5. Redis使用场景 6. Redis客户端-Jedis 7. Jedis Pipeline 8. Redis缓存策略 学习资料 QA 相关问题 http, socket ,tcp的区别 RdisExample 项目代码地址&#xff1a;htt…

Leetcode—104.二叉树的最大深度【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—104.二叉树的最大深度 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int maxDepth(struct TreeNode* root){…

2017年高热度编程语言简介

世上语言千千万&#xff0c;我却独爱这一种!”这句话用来形容程序员和编程语言之间的爱恨情仇实在是再精准不过了。根据GitHub 2016年的开源报告&#xff0c;其上所有开源项目共包含了316种编程语言&#xff0c;这是一个什么概念呢?举个例子来说&#xff0c;世界上共有226个国…

高防CDN的发展趋势

随着互联网的迅速发展&#xff0c;网站和在线服务的安全性变得至关重要。网络攻击如DDoS攻击和恶意流量正在增加&#xff0c;因此高防CDN&#xff08;高防御内容分发网络&#xff09;成为网络安全的重要组成部分。本文将探讨高防CDN未来的发展趋势&#xff0c;并比较其与传统CD…