Python 之 Serial串口通信

2023-05-16

0 Serial方法

1、导入pyserial模块

import serial

2、打开串行口

// 打开串口0, 9600,8N1,连接超时0.5秒
import serial
ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5) #使用USB连接串行口
ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5) #使用树莓派的GPIO口连接串行口
ser=serial.Serial(1,9600,timeout=0.5)#winsows系统使用com1口连接串行口
ser=serial.Serial(“com1”,9600,timeout=0.5)#winsows系统使用com1口连接串行口
ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系统使用com1口连接串行口
print ser.name#打印设备名称
print ser.port#打印设备名
ser.open() #打开端口
s = ser.read(10)#从端口读10个字节
ser.write(“hello”)#向端口些数据
ser.close()#关闭端口
data = ser.read(20) #是读20个字符
data = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()#都需要设置超时时间
ser.baudrate = 9600 #设置波特率
ser.isOpen() #看看这个串口是否已经被打开

3、获得串行口状态

串行口的属性:
name:设备名字
portstr:已废弃,用name代替
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时

属性的使用方法:
ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)
ser.open()

print ser.name
print ser.port
print ser.baudrate#波特率
print ser.bytesize#字节大小
print ser.parity#校验位N-无校验,E-偶校验,O-奇校验
print ser.stopbits#停止位
print ser.timeout#读超时设置
print ser.writeTimeout#写超时
print ser.xonxoff#软件流控
print ser.rtscts#硬件流控
print ser.dsrdtr#硬件流控
print ser.interCharTimeout#字符间隔超时

ser.close()

4、设置串行口状态

需要用的常量

bytesize:FIVE BITS、SIXBITS、SEVENBITS、EIGHTBITS
parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
异常:
ValueError:参数错误
SerialException:找不到设备或不能配置

ser.baudrate=9600#设置波特率

ser.bytesize=8#字节大小
ser.bytesize=serial.EiGHTBITS#8位数据位

ser.parity=serial.PARITY_EVEN#偶校验
ser.parity=serial.PARITY_NONE#无校验
ser.parity=serial.PARITY_ODD#奇校验

ser.stopbits=1#停止位
ser.timeout=0.5#读超时设置
ser.writeTimeout=0.5#写超时
ser.xonxoff#软件流控
ser.rtscts#硬件流控
ser.dsrdtr#硬件流控
ser.interCharTimeout#字符间隔超时

5、Readline方法的使用

是读一行,以/n结束,要是没有/n就一直读,阻塞。

使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。如果没有超时,readline会报异常。

6、serial.Serial类——原生端口

class serial.Serial
{
init(port=None, baudrate=9600, bytesize=EIGHTBITS,parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)

#其中:
# bytesize:FIVEBITS、SIXBITS、SEVENBITS、EIGHTBITS
# parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
# stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
#异常:
#ValueError:参数错误
#SerialException:找不到设备或不能配置

open():打开串口

close():立即关闭串口

del():析构函数

read(size=1):从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。

write(data):发送data,并返回发送字节数。如果bytes和bytearray可用(python 2.6以上),则接受其作为参数;否则接受str作为参数。
#异常:SerialTimeoutException——配置了写超时并发生超时时发生此异常。

inWaiting():返回接收缓存中的字节数

flush():等待所有数据写出。

flushInput():丢弃接收缓存中的所有数据

flushOutput():终止当前写操作,并丢弃发送缓存中的数据。

sendBreadk(duration=0.25):发送BREAK条件,并于duration时间之后返回IDLE

setBreak(level=True):根据level设置break条件。

setRTS(level=True)

setDTR(level=True)

getCTS()

getDSR()

getRI()

getCD()

#只读属性:
name:设备名字
portstr:已废弃,用name代替
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时

#端口设置可以被读入字典,也可从字典加载设置:
getSettingDict():返回当前串口设置的字典
applySettingDict(d):应用字典到串口设置

#对提供io库的系统(python 2.6或以上),Serial从io.RawIOBase派生。对其它系统,从FileLike派生。

#异常:
exception serial.SerialException
exception serial.SerialTimeoutException

#常量:
serial.VERSION:pyserial版本

#模块函数和属性:
serial.device(number)

serial.serial_for_url(url, *args, **kwargs)

serial.protocol_handler_packages()

serial.to_bytes(sequence):接收一个字符串或整数列表sequence,返回bytes实例

1 确定串口名称

1.1 WINDOWS

获取可用串口列表

#!/usr/bin/env python
#-*- coding: utf-8 -*
import serial
import serial.tools.list_ports

plist = list(serial.tools.list_ports.comports())

if len(plist) <= 0:
    print ("The Serial port can't find!")
else:
    plist_0 =list(plist[0])
    serialName = plist_0[0]
    serialFd = serial.Serial(serialName,9600,timeout = 60)
    print ("check which port was really used >",serialFd.name)

在这里插入图片描述

import serial #导入模块

import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
   print('无可用串口')
else:
    for i in range(0,len(port_list)):
        print(port_list[i])
1.2 LINUX

查询从系统启动到现在串口插拔的信息,显示串口Ubuntu连接的端口号:

在终端输入:

dmesg | grep ttyS*

在这里插入图片描述
在这里插入图片描述

在Ubuntu下装了CuteCom,但当打开 /dev/ttyUSB0 时,总提示错误,打开失败时:

用 Minicom 可以正常读取 ttyUSB0。

sudo chmod 666 /dev/ttyUSB0

这样修改后, CuteCom 就可以正常打开 USB 串口了

1,pycharm程序端代码。


#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
from time import sleep
 
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5)
 
 
def recv(serial):
        global data
        while True:
                data = serial.read(30)
                if data == '':
                        continue
                else:
                        break
                sleep(0.02)
        return data
 
 
while True:
        data = recv(ser)
        ser.write(data)
 

在pycharm上的程序:

在这里插入图片描述

程序效果为: 运行后,在CuteCom发生的代码, 程序这边会原文返回发给CuteCom。

1.3 Python(Linux下)获取串口的idv和idp以及serial序列号

串口端口的获取脚本

# coding=utf-8
#

__author__ = 'Haleydu'
__editTime__ = '2018.12.7'

import serial.tools.list_ports
import serial
import os
import re

class AutoMatchSerialPort:
    #一.获取串口 or 判断是否存在该串口
    def getSerial(self,needdev=''):
        needSerial=''
        port_list = list(serial.tools.list_ports.comports())
        if len(port_list) <= 0:
            print ("The Serial port can't find!")
        else:
        #1.过滤,获取需要的串口
            for i in list(port_list):
                if i.name==needdev:
                    needSerial=i.name
                print(i.name,end=',')
            print('\n')
        #2.返回获取的目的串口为了绑定
        return needSerial

   # 二.根据端口号返回ID号和硬件号
    def getSerialIDAndSer(self,dev):
        cmd = "udevadm info --attribute-walk --name=" + dev
        result = self.execCmd(cmd)
        pat1 = "ATTRS{idVendor}==.?(\d\d\d\d).?"
        pat2 = "ATTRS{idProduct}==.?(\d\d\d\d).?"
        pat3 = 'ATTRS{serial}==.([A-Za-z0-9]+).'
        ret1 = re.search(pat1,result)
        ret2 = re.search(pat2,result)
        ret3 = re.search(pat3,result)
        idv = ret1.group(1)
        idp = ret2.group(1)
        ser = ret3.group(1)
        return idv,idp,ser

    # 三.根据ID号或者序列号返回串口的端口号,也可以用别名直接调用该串口(运行后需要拔插目的串口后生效)
    def getSerialPort(self,idv='',idp='',ser='',alias='ttyUSB_test'):
        if idv==''or idp=='':
            contentID = 'ATTRS{serial}=="'+ser+', MODE:="0777", SYMLINK+="'+ alias +'" \n'
        elif ser=='':
            contentID = '", ATTRS{idVendor}=="'+idv+'", ATTRS{idProduct}=="'+idp+'", MODE:="0777", SYMLINK+="'+ alias +'" \n'
        else:
            contentID = 'ATTRS{serial}=="'+ser+'", ATTRS{idVendor}=="'+idv+'", ATTRS{idProduct}=="'+idp+'", MODE:="0777", SYMLINK+="'+ alias +'" \n'

        path='/etc/udev/rules.d/getSerialPort_'+alias+'.rules'
        if os.path.exists(path):
            #print('存在文件')
            f = open(path,"w")
            f.write(contentID)
            f.flush()
            f.close()
            #print('创建成功')
            #print('重新拔插串口后生效')
        else:
            #print('不存在文件,开始创建getSerialPort_'+alias+'.rules的udev规则文件')
            f = open(path,"w")
            f.write(contentID)
            f.flush()
            f.close()
            #print('创建成功')
            #print('重新拔插串口后生效')
        #重启udev规则
        #sudo /etc/init.d/udev restart
        #根据ID获得端口号
        cmd = "udevadm info --attribute-walk --name=" + alias
        result = self.execCmd(cmd)
        pat = '(ttyUSB.)'
        ret = re.search(pat,result)
        dev=''
        try:
            dev = ret.group(1)
        except AttributeError:
            if dev=='':
                print('重新拔插串口后生效')
        return dev


    #调用终端,获取终端输出
    def execCmd(self,cmd):  
        r = os.popen(cmd)  
        result = r.read()  
        r.close()  
        return result  

if __name__ == '__main__':
    am=AutoMatchSerialPort()
    am.getSerial()
    print('ttyUSB0:' + str(am.getSerialIDAndSer("ttyUSB0")))
    print('ttyUSB1:' + str(am.getSerialIDAndSer("ttyUSB1")))
    print('0403:6002,FT2NPXY4,ttyUSB_1:' + am.getSerialPort('0403','6002','FT2NPXY4','ttyUSB_1'))
    print('0403:6001,FTSYWCXZ,ttyUSB_2:' + am.getSerialPort('0403','6001','FTSYWCXZ','ttyUSB_2'))
    


2 SERIAL 串口操作

参考文档:
https://blog.csdn.net/qq_14997473/article/details/80875722:Python学习笔记——串口配置以及发送数据

https://blog.csdn.net/ubuntu14/article/details/75335106:python实现串口自动触发工作

(1) 安装pyserial库

pip install pyserial

serial = serial.Serial(‘COM1’, 115200) 打开COM1并设置波特率为115200,COM1只适用于Windows
serial = serial.Serial(‘/dev/ttyS0’, 115200) 打开/dev/ttyS0并设置波特率为115200, 只适用于Linux

(2) pyserial库常用函数介绍
serial = serial.Serial(‘COM1’, 115200) 打开COM1并设置波特率为115200,COM1只适用于Windows

serial = serial.Serial(‘/dev/ttyS0’, 115200) 打开/dev/ttyS0并设置波特率为115200, 只适用于Linux

print serial .portstr 能看到第一个串口的标识

serial .write(“hello”) 往串口里面写数据

serial .close() 关闭serial 表示的串口

serial .open() 打开串口

data = serial .read(num) 读num个字符

data = serial .readline() 读一行数据,以/n结束,要是没有/n就一直读,阻塞。

serial .baudrate = 9600 设置波特率

print serial 可查看当前串口的状态信息

serial .isOpen() 当前串口是否已经打开

serial.inWaiting() 判断当前接收的数据

serial.flushInput() 清除输入缓冲区数据

serial.flushOutput() 中止当前输出并清除输出缓冲区数据
(3) 实例: 获取从其他串口发送来的数据并回显
#!/usr/bin/python 
# coding=UTF-8 
import serial 
################################################### 
# 
# 功 能: 将接收到的数据已hex显示 
# 参 数: 串口接受到的数据 
# 返 回: 转换后的数据 
# 
################################################### 
def hexshow(data): 
  hex_data = '' hLen = len(data) 

  for i in xrange(hLen): 
    hvol = ord(data[i]) 
    hhex = '%02x' % hvol 
    hex_data += hhex+' '

  print 'hexshow:', hex_data 
################################################### 
# 
# 功 能: 将需要发送的字符串以hex形式发送 
# 参 数: 待发送的数据 
# 返 回: 转换后的数据 
# 
################################################### 
def hexsend(string_data=''): 
  hex_data = string_data.decode("hex") 
  return hex_data 

if __name__ == '__main__': 
  serial = serial.Serial('/dev/ttyS0', 115200) 
  print serial 

  if serial.isOpen(): 
    print("open success") 
  else: 
    print("open failed") 


  try: 

    while True: 
      count = serial.inWaiting() 
      if count > 0: 
        data = serial.read(count) 
        if data != b'': 
          print("receive:", data) 
          serial.write(data) 
        else: 
          serial.write(hexsend(data)) 

  except KeyboardInterrupt: 
    if serial != None: 
      serial.close()
16进制处理
import serial #导入模块
try:
  portx="COM3"
  bps=115200
  #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
  timex=None
  ser=serial.Serial(portx,bps,timeout=timex)
  print("串口详情参数:", ser)

  #十六进制的发送
  result=ser.write(chr(0x06).encode("utf-8"))#写数据
  print("写总字节数:",result)

  #十六进制的读取
  print(ser.read().hex())#读一个字节

  print("---------------")
  ser.close()#关闭串口

except Exception as e:
    print("---异常---:",e)
其他
import serial #导入模块
try:

  #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
  portx="COM3"
  #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
  bps=115200
  #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
  timex=5
  # 打开串口,并得到串口对象
  ser=serial.Serial(portx,bps,timeout=timex)
  print("串口详情参数:", ser)



  print(ser.port)#获取到当前打开的串口名
  print(ser.baudrate)#获取波特率

  result=ser.write("我是东小东".encode("gbk"))#写数据
  print("写总字节数:",result)


  #print(ser.read())#读一个字节
  # print(ser.read(10).decode("gbk"))#读十个字节
  #print(ser.readline().decode("gbk"))#读一行
  #print(ser.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用
  #print(ser.in_waiting)#获取输入缓冲区的剩余字节数
  #print(ser.out_waiting)#获取输出缓冲区的字节数

  #循环接收数据,此为死循环,可用线程实现
  while True:
         if ser.in_waiting:
             str=ser.read(ser.in_waiting ).decode("gbk")
             if(str=="exit"):#退出标志
                 break
             else:
               print("收到数据:",str)

  print("---------------")
  ser.close()#关闭串口


except Exception as e:
    print("---异常---:",e)

3 解决 ImportError: No module named ‘serial’ 问题

在pycharm里编写Python串口程序的时候,编译时提示 ImportError: No module named ‘serial’

解决办法:

安装 serial module
这里区分python2和 python3:

首先需要在终端输入:

sudo apt install python-pip //python2
sudo apt install python3-pip    //python3

在这里插入图片描述
安装python3的 pip3的时候,如果时国内的软件源可能安装不上,(当时用中国科学技术大学的软件源,python3-pip下载有问题),换成ubuntu官网成功下载。

如果系统已经安装过了pip,就不需要这一步了。
然后通过:

pip install pyserial    //python2
pip3 install pyserial   //python3

在这里插入图片描述

可以从pyserial下载这里去获取源码进行熟悉和学习。

4 PYCHARM 里面的no module name serial错误

在这里插入图片描述
错误原因在于:==interpreter的选择==
在这里插入图片描述

安装目录下的python,其模块只有一个setuptools,所以找不到serial
在这里插入图片描述
ANACONDA下的python.exe里面包含了多个模块,所以应该将interpreter改为该目录下的python.exe

5 TypeError: ‘bool’ object is not callable

因为 isOpen是属性所以有如下做法

 def isOpen(self):
        return True

  def is_active(self):
        return True

  def is_anonymous(self):
        return False

不是方法,将sOpen()括号去掉,完美解决!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 之 Serial串口通信 的相关文章

  • 如何避免使用 python 处理空的标准输入?

    The sys stdin readline 返回之前等待 EOF 或新行 所以如果我有控制台输入 readline 等待用户输入 相反 我想打印帮助并在没有需要处理的情况下退出并显示错误 而不是等待用户输入 原因 我正在寻找一个Pytho
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • 飞书扫码登录网页

    二维码 SDK 接入文档 最后更新于 2022 06 14 概述 为了实现在网页内部完成授权登录的流程 xff0c 避免跳转到飞书登录页 xff0c 保证流畅的体验 xff0c 可以接入二维码 SDK 将飞书登录的二维码嵌入到网页中 当用户
  • make命令参数详解

    Make命令本身可带有四种参数 xff1a 标志 宏定义 描述文档名和目标文档名 其标准形式为 xff1a Make flags macro definitions targets Unix系统下标志位flags选项及其含义为 xff1a
  • c语言汉诺塔问题详解

    一 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金
  • 阿里云服务器的使用

    阿里云服务器的使用 外网ip 39 108 98 xxx xff08 linux xff09 ubuntu16 04 root root密码 putty ssh工具 xshell ssh scp 登录到阿里云服务器上 xff08 ubunt
  • 项目如何介绍

    谈谈XXX项目 分析 xff1a 考官通过看你的简历或者你的介绍来了解你所做的项目 xff0c 那么考官肯定想更详细的了解您的项目 xff0c 看是不是与你的简历写的项目经验一致 也就是考核你是否具有真实的项目经验 一般来说 xff0c 在
  • K8S的flannel组件容器网络分析

    kubernetes的网络通信可以分为一下几个部分 xff1a pod内部的容器间通信pod间通信pod与service之间网络通信kubernetes外部与service之间的网络通信 理论 xff1a 1 pod内部的容器间通信 kub
  • 数据结构(Data Structure)——1、栈(Stack)

    栈的介绍 栈 xff08 stack xff09 在计算机科学中是限定仅在表尾进行插入或删除操作的线形表 栈是一种数据结构 xff0c 是只能在某一端插入和删除的特殊线性表 它按照先进后出的原则存储数据 xff0c 先进入的数据被压入栈底
  • 进程间通信之消息队列

    首先说一下什么是消息队列 消息队列是进程间通信的一种 xff0c 它是由操作系统维护的以字节序列为基本单位的间接通信机制 xff0c 它提供了一个进程向另一个进程发送一个带类型的数据块的方法 我们知道用管道来实现进程间通信的机制是两个进程利
  • STM32 编码器模式详解

    0 编码器模式 stm32的定时器带的也有编码器模式 所用的编码器是有ABZ三相 xff0c 其中ab相是用来计数 xff0c z相输出零点信号 AB相根据旋转的方向不同 xff0c 输出的波形如下图所示 xff1a 从图上可以看出来 xf
  • LAN8720A网络模块关于时钟的使用问题

    微雪的LAN8720A驱动电路 xff1a 正点原子LAN8720A驱动电路 xff1a 1 nINTSEL Configuration 从原理图中可以看出正点原子的LAN8720A模块所使用的晶振是25M 而微雪的LAN8720A模块使用
  • 机器学习和深度学习大纲

    机器学习 https blog csdn net qq 45056216 article details 104303569 深度学习 https blog csdn net weixin 42237113 article details
  • VIM 助记符

    https www bilibili com video BV114411J7Z8 from 61 search amp seid 61 9900190950002805677 一 工作模式 vim其实三种模式 xff0c 一般模式 xff
  • STLINK下载程序(附STLINK驱动包)

    一 ST Link V2的JTAG SWD接口定义及产品图 实物图 STLINK指定标准接口 xff1a 二 STLINK驱动安装 xff1a 双击ST LinkUpgrade安装即可 安装成功之后 xff0c 设备管理器 三 打开工程文件
  • STM32 之 HAL库

    1 STM32的三种开发方式 通常新手在入门STM32的时候 xff0c 首先都要先选择一种要用的开发方式 xff0c 不同的开发方式会导致你编程的架构是完全不一样的 一般大多数都会选用标准库和HAL库 xff0c 而极少部分人会通过直接配
  • 迷你版的ARDUINO MEGA2560

    1 传统的MEGA2560板 xff1a 2 迷你的MEGA2560 特点 xff1a 嵌入版Mega 2560 CH340G ATmega2560 兼容 Mega 2560主板 基于Atmel ATmega2560微控制器和USB UAR
  • MATLAB撸了一个2D LiDAR SLAM

    0 引言 刚刚入门学了近一个月的SLAM xff0c 但对理论推导一知半解 xff0c 因此在matlab上捣鼓了个简单的2D LiDAR SLAM的demo来体会体会SLAM的完整流程 1 数据来源 xff1a 德意志博物馆Deutsch
  • 基于粒子滤波的定位算法 ——原理、理解与仿真

    1 算法原理 1 1 机器人定位问题 关于机器人定位 xff0c 有三大问题 xff0c 它们分别是 xff1a 1 全局定位 xff1a 指初始位置未知 xff0c 机器人靠自身运动确定自己在地图中的位姿 2 位姿跟踪 xff1a 指已知
  • 从图片中提取曲线坐标数据--基于MATLAB

    转载 https zhuanlan zhihu com p 52112012 0 引言 在读文献的时 xff0c 经常遇到这样的情况 xff1a 文章里提出的方法好有趣啊 xff0c 好想拿文中用的数据来试试看看能不能得到相近的结果 xff
  • 49天精通Java,第8天,JDK 和 JRE 、final 与 static 、堆和栈

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • Python 之 Serial串口通信

    0 Serial方法 1 导入pyserial模块 import serial 2 打开串行口 打开串口0 xff0c 9600 xff0c 8N1 xff0c 连接超时0 5秒 import serial ser 61 serial Se