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
  • 相关阅读:
    SQLserver 逗号隔开字段分开
    css实现鼠标移动到div,改变另一个div 样式
    selenium账号密码模拟登陆豆瓣
    HTML+CSS基础
    Nginx 报错 413 Request Entity Too Large 的解决方法
    Nginx 报错 504 Gateway Time-out 的解决方法
    Object定时器
    Object标签遮挡
    winRAR打包EXE
    jqGrid API
  • 原文地址:https://www.cnblogs.com/stacklike/p/8278915.html
Copyright © 2011-2022 走看看