首页 > 编程语言 >Python-串口通信2

Python-串口通信2

时间:2023-10-08 15:12:37浏览次数:47  
标签:engine ser Python self 通信 timeout 串口 print main

安装

pip insatll pyserial

 

初始化

简单初始化示例

import serial
ser = serial.Serial('com1', 9600, timeout=1)

 

所有参数

 
ser = serial.Serial(
port=None,              # number of device, numbering starts at
# zero. if everything fails, the user
# can specify a device string, note
# that this isn't portable anymore
# if no port is specified an unconfigured
# an closed serial port object is created
baudrate=9600,          # baud rate
bytesize=EIGHTBITS,     # number of databits
parity=PARITY_NONE,     # enable parity checking
stopbits=STOPBITS_ONE,  # number of stopbits
timeout=None,           # set a timeout value, None for waiting forever
xonxoff=0,              # enable software flow control
rtscts=0,               # enable RTS/CTS flow control
interCharTimeout=None   # Inter-character timeout, None to disable
)
 

 

不同平台下初始化

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口连接串行口

 

serial.Serial类(另外初始化的方法)

class serial.Serial()
{
   def  __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)
}

 

 

ser对象属性

 
name:设备名字
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时
 

 

 

ser对象常用方法

 
ser.isOpen():查看端口是否被打开。
ser.open() :打开端口‘。
ser.close():关闭端口。
ser.read():从端口读字节数据。默认1个字节。
ser.read_all():从端口接收全部数据。
ser.write("hello"):向端口写数据。
ser.readline():读一行数据。
ser.readlines():读多行数据。
in_waiting():返回接收缓存中的字节数。
flush():等待所有数据写出。
flushInput():丢弃接收缓存中的所有数据。
flushOutput():终止当前写操作,并丢弃发送缓存中的数据。
 

 



封装参考

 
import serial
import serial.tools.list_ports

class Communication():

    #初始化
    def __init__(self,com,bps,timeout):
        self.port = com
        self.bps = bps
        self.timeout =timeout
        global Ret
        try:
            # 打开串口,并得到串口对象
             self.main_engine= serial.Serial(self.port,self.bps,timeout=self.timeout)
            # 判断是否打开成功
             if (self.main_engine.is_open):
               Ret = True
        except Exception as e:
            print("---异常---:", e)

    # 打印设备基本信息
    def Print_Name(self):
        print(self.main_engine.name) #设备名字
        print(self.main_engine.port)#读或者写端口
        print(self.main_engine.baudrate)#波特率
        print(self.main_engine.bytesize)#字节大小
        print(self.main_engine.parity)#校验位
        print(self.main_engine.stopbits)#停止位
        print(self.main_engine.timeout)#读超时设置
        print(self.main_engine.writeTimeout)#写超时
        print(self.main_engine.xonxoff)#软件流控
        print(self.main_engine.rtscts)#软件流控
        print(self.main_engine.dsrdtr)#硬件流控
        print(self.main_engine.interCharTimeout)#字符间隔超时

    #打开串口
    def Open_Engine(self):
        self.main_engine.open()

    #关闭串口
    def Close_Engine(self):
        self.main_engine.close()
        print(self.main_engine.is_open)  # 检验串口是否打开

    # 打印可用串口列表
    @staticmethod
    def Print_Used_Com():
        port_list = list(serial.tools.list_ports.comports())
        print(port_list)





    #接收指定大小的数据
    #从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。
    def Read_Size(self,size):
        return self.main_engine.read(size=size)

    #接收一行数据
    # 使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。
    # 如果没有超时,readline会报异常。
    def Read_Line(self):
        return self.main_engine.readline()

    #发数据
    def Send_data(self,data):
        self.main_engine.write(data)

    #更多示例
    # self.main_engine.write(chr(0x06).encode("utf-8"))  # 十六制发送一个数据
    # print(self.main_engine.read().hex())  #  # 十六进制的读取读一个字节
    # print(self.main_engine.read())#读一个字节
    # print(self.main_engine.read(10).decode("gbk"))#读十个字节
    # print(self.main_engine.readline().decode("gbk"))#读一行
    # print(self.main_engine.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用
    # print(self.main_engine.in_waiting)#获取输入缓冲区的剩余字节数
    # print(self.main_engine.out_waiting)#获取输出缓冲区的字节数
    # print(self.main_engine.readall())#读取全部字符。

    #接收数据
    #一个整型数据占两个字节
    #一个字符占一个字节

    def Recive_data(self,way):
        # 循环接收数据,此为死循环,可用线程实现
        print("开始接收数据:")
        while True:
            try:
                # 一个字节一个字节的接收
                if self.main_engine.in_waiting:
                    if(way == 0):
                        for i in range(self.main_engine.in_waiting):
                            print("接收ascii数据:"+str(self.Read_Size(1)))
                            data1 = self.Read_Size(1).hex()#转为十六进制
                            data2 = int(data1,16)#转为十进制print("收到数据十六进制:"+data1+"  收到数据十进制:"+str(data2))
                    if(way == 1):
                        #整体接收
                        # data = self.main_engine.read(self.main_engine.in_waiting).decode("utf-8")#方式一
                        data = self.main_engine.read_all()#方式二print("接收ascii数据:", data)
            except Exception as e:
                print("异常报错:",e)


Communication.Print_Used_Com()
Ret =False #是否创建成功标志

Engine1 = Communication("com12",115200,0.5)
if (Ret):
    Engine1.Recive_data(0)
 

 

 
    while(1)
    {
      //发送测试
      uint8_t a = 61;
      delayms(300);
      printf("%c", a);
}
 

 

开始接收数据:
接收ascii数据:b'='
收到数据十六进制:3d  收到数据十进制:61

 

标签:engine,ser,Python,self,通信,timeout,串口,print,main
From: https://www.cnblogs.com/TodayWind/p/17749112.html

相关文章

  • python命令行传参
    #run.pyimportargparseparser=argparse.ArgumentParser()parser.add_argument('--device',type=str,default='cpu:0',help='usewhichdevice')parser.add_argument('--worker',type=int,default=1,help='numofwor......
  • Python学习 —— 初步认知
    写在前面Python是一种流行的高级编程语言,具有简单易学、代码可读性高、应用广泛等优势。它是一种解释型语言,可以直接在终端或集成开发环境(IDE)中运行,而无需事先编译。Python的安装Python的安装过程非常简单。首先,你可以从Python的官方网站(https://www.python.org)下载安装包。根......
  • python查看占用系统内存
    importosimportpsutilinfo=psutil.virtual_memory()print(u'cpu个数:',psutil.cpu_count())print(u'电脑总内存:%.4fGB'%(info.total/1024/1024/1024))print(u'当前进程的内存使用:%.4fGB'%(psutil.Process(os.getpid()).memory_info().rs......
  • Python入门示例系列20 函数
     函数function函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数built-in,比如print()。也可以自己创建函数,叫做用户自定义函数。 函数的定义(define)和调用(call)掌握函数的定义和调用。定义一个函......
  • Python入门示例系列18 条件控制 Conditional Statements
    Python提供了bool类型来表示真(对)或假(错),比如常见的5>3比较算式,这个是正确的,在程序世界里称之为真(对),Python使用True来代表;再比如4>20比较算式,这个是错误的,在程序世界里称之为假(错),Python使用False来代表。True和False是Python中的关键字,当作为Python代码输入时,一......
  • Python入门示例系列19 循环语句
    Python中的循环语句有for和while。 while语句Python中while语句的一般形式:while判断条件condition:执行语句statements同样需要注意冒号和缩进。另外,在Python中没有do..while循环。以下实例使用了while来计算1到100的总和:sum=0counter=1whilecounte......
  • Python入门示例系列17 输入与输出( 格式化输出 )
    Python入门示例系列17输入与输出 读取键盘输入(input)Python提供了input()内置函数从标准输入(键盘)读入一行文本,默认的标准输入是键盘。返回结果是字符串。>>>astr=input("请输入:");##input('提示的内容')请输入:123>>>print(astr)123 如果从键盘输入两个数字,并求这......
  • Python入门示例系列16 集合
    Python入门示例系列16集合 集合 集合(set)是一个无序的不重复元素序列。可以使用大括号{}或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个空字典。集合是由不同元素组成,所以即便里面的值重复了,也会自动去重。示例:>>>s=set()#创......
  • Python入门示例系列14 元组
    Python入门示例系列14元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号(),列表使用方括号[]。元组创建只需要在括号中添加元素,并使用逗号隔开即可。示例:>>>t4=(1,2,3,4)#四个整数的元组>>>t4(1,2,3,4)>>>t1=()#空元祖>>>t1()>>......
  • Python入门示例系列15 字典
    Python入门示例系列15字典 字典的每个键值对用冒号:分隔,每个键值对之间用逗号(,)分隔,整个字典包括在花括号{}d={key1:value1,key2:value2,key3:value3}键必须是唯一的,但值则不必唯一。值可以取任何数据类型,但键必须是不可变的(immutable)数据类型,如字符串,数字。......