zoukankan      html  css  js  c++  java
  • Python的扩展接口[1] -> 串口通信

    串口通信 / Serial Communication


    1 串口简介 / Serial Introduction

    串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为一位一位地顺序传送,通信线路简单,一对传输线即可实现双向通信,适用于远距离且传输速度慢的通信。其中最常用的也是标准接口为RS-232,除此之外还有RS-422,RS-485等。

    2 pyserial环境搭建

    Pyserial的安装可以通过pip进行,直接在命令行输入下列命令进行安装,

    pip install pyserial

    3 pyserial基本用法

    利用pyserial可以实现Python对串口的控制,其基本使用方式十分简单,主要为一下几步,

           1. 利用Serial类传入配置参数,生成串口实例;

           2. 利用串口实例的write()/read()方法消息的发送与接收。

    Note: 关于Serial类,主要参数为端口和波特率,更多参数可查看源代码。

     1 import serial
     2 
     3 ser = serial.Serial(port='com1', baudrate=9600)
     4 print(ser.portstr)
     5 
     6 def serial_communi(ser, msg):
     7     # n is the length of msg sent
     8     n = ser.write(msg.encode())
     9     print(n)
    10     s = ser.read(n)
    11     print(s)

    4 read_until 方法的实现与扩展
    在pyserial中,read_until 方法只能处理一个终止符,而当需要处理多个终止标志的时候,则需要重新定义一个新的方法,参考 pyserial 源代码中的 read_until 函数,其实现方式为:

    1. 每次读取一个字符,加入待返回字符串
    2. 根据终止符长度n,获取字符中后 n 位字符,检测是否为终止符

    下面的代码供参考,

     1     def _read_until(self):
     2         line = ''
     3         while True:
     4             try:
     5                 c = self.read(1)
     6             except (
     7                     AttributeError, TypeError,          # COM Exception
     8                     ValueError, EOFError,               # TELNET Exception
     9                     self._connection.OpenCloseException) as e:
    10                 # Above Exception happens when communication manually closed,
    11                 # if still should run, condition sleep here,
    12                 # else return None to exit thread
    13                 if self.should_run:
    14                     self._cond_wait(self._recv_cond)
    15                     continue
    16                 else:
    17                     return None
    18             if c:
    19                 line += c
    20                 self._result.put(c)
    21                 tokens = [self._term_token, self._abort_token, self._cr_token, self._lf_token]
    22                 for token in tokens:
    23                     if not line[-len(token):] == token:
    24                         continue
    25                     if token == self._cr_token or token == self._lf_token:
    26                         return line
    27                     if token == self._term_token:
    28                         self.waiter_wake_up()
    29                         self.termi_signal(True)
    30                         self._result.save(strip=self._term_token)
    31                         self.logger.debug("TERMINATE %s" % self._term_token)
    32                         return line
    33                     if token == self._abort_token:
    34                         # TODO: handle this abort token encountered
    35                         self.logger.debug("ABORT %s" % self._abort_token)
    36                         pass
    37             # When timeout will enter this else
    38             # else:
    39             #     return line
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/stacklike/p/8278915.html
Copyright © 2011-2022 走看看