zoukankan      html  css  js  c++  java
  • 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())
  • 相关阅读:
    linux RCU锁机制分析
    什么是上下文切换
    Linux内核哈希表分析与应用
    linux内核中hlist_head和hlist_node结构解析
    如何使用queue_delayed_work函数
    《Linux内核设计与实现》读书笔记(十)- 内核同步方法
    自旋锁,读写锁和顺序锁的实现原理
    C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
    深入理解linux系统下proc文件系统内容
    以太网最小帧长为什么是64字节
  • 原文地址:https://www.cnblogs.com/yaner2018/p/9818066.html
Copyright © 2011-2022 走看看