• python_serial


    serial

    python中pyserial模块使用方法,pyserial模块封装了对串口的访问。

    在支持的平台上有统一的接口。

    通过python属性访问串口设置。

    支持不同的字节大小、停止位、校验位和流控设置。

    可以有或者没有接收超时。 

    类似文件的API,例如read和write,也支持readline等。

    支持二进制传输,没有null消除,没有cr-lf转换。

    使用方法和实例

    导入pyserial模块

    import serial

    打开串行口

    // 打开串口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("com1",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() #看看这个串口是否已经被打开

     

    获得串行口状态、属性

    串行口的属性:

    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()

    设置串行口状态

    需要用的常量

    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#字符间隔超时

    Read

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

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

    其中,read(value)方法的参数value为需要读取的字符长度。 如果想要全部读取,提供两个方法:

    inWaiting:监测接收字符。

    inWaitting返回接收字符串的长度值,然后把这个值赋给read做参数。

    data =readall()::读取全部字符。

    data = ser.read()可以读一个字符

    data = ser.read(20) 是读20个字符

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

    data = ser.readlines()和ser.xreadlines()都需要设置超时时间

      1 import serial
      2 import serial.tools.list_ports
      3 
      4 
      5 #测试调试输出开关,正式发布需调整为False
      6 mytest = True
      7 #mytest = False
      8 
      9 '''
     10 ** Descriptions:       获取串口
     11 ** Parameters:        void 无
     12 ** Returned value:    list - port_serial串口列表
     13 ** Created By:        yanerfree
     14 ** Created on:        2018年9月25日
     15 ** Remarks:
     16 '''
     17 def getPort():
     18     port_serial=[]#返回串口列表
     19     port_list = list(serial.tools.list_ports.comports())  
     20 
     21     if len(port_list) <= 0:  
     22         print("The Serial port can't find!")      
     23     else:  
     24         #if(mytest):print("port_list: ",port_list)
     25         for port in port_list:
     26             #if(mytest):print("port: ",port)
     27             port_serial.append(str(port).split(' ')[0])
     28            # if(mytest):print("port_serial: ",port_serial)
     29             
     30     return(port_serial)   
     31 
     32 '''
     33 ** Descriptions:      发送串口数据
     34 ** Parameters:        
     35 ** Returned value:    
     36 ** Created By:        yanerfree
     37 ** Created on:        2018年10月16日
     38 ** Remarks:以二进制读取
     39 '''  
     40 def send_data(serial_port="COM6", baudrate=115200, bytesize=8,
     41               parity=serial.PARITY_NONE,stopbit=1,
     42               timeout=5, filename="F:	est.txt"):
     43     serial_port_1 = serial_port
     44     baudrate_1 = int(baudrate)
     45     bytesize_1 = int(bytesize)
     46     parity_1 = parity[:1]
     47     stopbit_1 = int(stopbit)
     48     timeout_1 = timeout
     49     filename_1 = filename
     50     print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
     51     try:
     52         print("初始化串口")
     53 #         ser_port = serial.Serial("COM6",115200,timeout=1.5,parity=serial.PARITY_NONE,
     54 #                     stopbits=serial.STOPBITS_ONE,
     55 #                     bytesize=serial.EIGHTBITS)
     56         ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
     57         print("串口是否打开:",ser_port.isOpen())
     58         if not ser_port.isOpen():
     59             ser_port.open()
     60         print("串口是否打开:",ser_port.isOpen())
     61         
     62         f = open(filename_1,'rb')#打开或者新建一个文件
     63         i=0
     64         while 1:
     65             i = i + 1
     66             print("读取文 件第  %d 行"%i)
     67             #fileData=f.readline().strip('
    ').encode(encoding='utf_8')#编码转换成字节发送
     68             fileData=f.readline().strip(b'
    ')
     69             fileData=fileData.strip(b'
    ')
     70             if fileData==b'':
     71                 break
     72             #fileData_1=(fileData+'SDSA
    '.encode(encoding='utf_8'))
     73             fileData_1=(fileData+b'SDSA
    ')
     74             print("发送数据为:",fileData_1)
     75             ser_port.write(fileData_1)
     76             #print("fileData[-11:]",fileData[-11:])
     77             if fileData[-11:]==b'***[END]***':
     78             #if fileData[-11:]=='***[END]***':
     79                 print("检测到文件结束符,退出")
     80                 break;
     81             print("等待2s")
     82             time.sleep(2)
     83     except Exception:
     84         print("发送脚本失败")
     85     finally:
     86         f.close()
     87         ser_port.close()      
     88 
     89  
     90 '''
     91 ** Descriptions:      获取串口数据
     92 ** Parameters:        
     93 ** Returned value:    
     94 ** Created By:        yanerfree
     95 ** Created on:        2018年10月17日
     96 ** Remarks:二进制保存
     97 '''      
     98 def receive_data(serial_port="COM6", baudrate=115200, bytesize=8,
     99                  parity=serial.PARITY_NONE,stopbit=1,
    100                  timeout=5,filename="F:	est.txt"):
    101     serial_port_1 = serial_port
    102     baudrate_1 = int(baudrate)
    103     bytesize_1 = int(bytesize)
    104     parity_1 = parity[:1]
    105     stopbit_1 = int(stopbit)
    106     timeout_1 = timeout
    107     filename_1 = filename
    108     print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
    109     try:
    110         print("初始化串口")
    111         #ser_port = serial.Serial(serial_port, baudrate,bytesize,parity,stopbit, timeout)
    112         ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
    113         print("串口是否打开:",ser_port.isOpen())
    114         if not ser_port.isOpen():
    115             ser_port.open()
    116         print("串口是否打开:",ser_port.isOpen())
    117         
    118         #f = open(filename_1,'w',encoding='utf-8')#打开或者新建一个文件
    119         f = open(filename_1,'wb')#以二进制打开或创建一个文件
    120        
    121         while True:
    122             fileData=ser_port.readline()
    123             if(len(fileData)==0 or fileData[-6:]!=b'SDSA
    '):
    124                 continue;
    125             print("接收到的数据:",fileData)
    126             fileData1=fileData.split(b'SDSA
    ')[0]
    127             fileData2=fileData1+b'
    '#'0X0D'
    128             filedata_str=fileData1.decode(encoding='utf_8')
    129             content = filedata_str + '
    '
    130             print("保存的数据为:",fileData2)
    131             #saveFile(filename_1,fileData1)
    132             f.write(fileData2)
    133             if filedata_str[-11:]=='***[END]***':
    134                 break;
    135             sleep(1)
    136     except Exception:
    137         print("获取脚本失败")
    138     finally:
    139         f.close()
    140         ser_port.close()
    141         if mytest: print("串口是否打开:",ser_port.isOpen())
  • 相关阅读:
    vue form dynamic validator All In one
    TypeScript api response interface All In One
    closable VS closeable All In One
    macOS 如何开启 WiFi 热点 All In One
    vue css inline style All In One
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)
    牛腩新闻 59 整合添加新闻页 FreeTextBox 富文本编辑器,检测到有潜在危险的 Request.Form 值,DropDownList 的使用
    牛腩新闻 61尾声: error.aspx的使用 防止报错
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (上)
    牛腩新闻 62:尾声续2 asp.net的编译和发布
  • 原文地址:https://www.cnblogs.com/yaner2018/p/9818066.html
Copyright © 2020-2023  润新知