0 Serial方法

1、导入pyserial模块

import serial

2、打开串行口

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

3、获得串行口状态

串行口的属性:
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()

4、设置串行口状态

需要用的常量

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

5、Readline方法的使用

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

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

6、serial.Serial类——原生端口

class serial.Serial
{
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)

#其中:
# bytesize:FIVEBITS、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:找不到设备或不能配置

open():打开串口

close():立即关闭串口

del():析构函数

read(size=1):从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。

write(data):发送data,并返回发送字节数。如果bytes和bytearray可用(python 2.6以上),则接受其作为参数;否则接受str作为参数。
#异常:SerialTimeoutException——配置了写超时并发生超时时发生此异常。

inWaiting():返回接收缓存中的字节数

flush():等待所有数据写出。

flushInput():丢弃接收缓存中的所有数据

flushOutput():终止当前写操作,并丢弃发送缓存中的数据。

sendBreadk(duration=0.25):发送BREAK条件,并于duration时间之后返回IDLE

setBreak(level=True):根据level设置break条件。

setRTS(level=True)

setDTR(level=True)

getCTS()

getDSR()

getRI()

getCD()

#只读属性:
name:设备名字
portstr:已废弃,用name代替
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时

#端口设置可以被读入字典,也可从字典加载设置:
getSettingDict():返回当前串口设置的字典
applySettingDict(d):应用字典到串口设置

#对提供io库的系统(python 2.6或以上),Serial从io.RawIOBase派生。对其它系统,从FileLike派生。

#异常:
exception serial.SerialException
exception serial.SerialTimeoutException

#常量:
serial.VERSION:pyserial版本

#模块函数和属性:
serial.device(number)

serial.serial_for_url(url, *args, **kwargs)

serial.protocol_handler_packages()

serial.to_bytes(sequence):接收一个字符串或整数列表sequence,返回bytes实例

1 确定串口名称

1.1 WINDOWS

获取可用串口列表

#!/usr/bin/env python
#-*- coding: utf-8 -*
import serial
import serial.tools.list_portsplist = list(serial.tools.list_ports.comports())if len(plist) <= 0:print ("The Serial port can't find!")
else:plist_0 =list(plist[0])serialName = plist_0[0]serialFd = serial.Serial(serialName,9600,timeout = 60)print ("check which port was really used >",serialFd.name)

import serial #导入模块import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:print('无可用串口')
else:for i in range(0,len(port_list)):print(port_list[i])
1.2 LINUX

查询从系统启动到现在串口插拔的信息,显示串口Ubuntu连接的端口号:

在终端输入:

dmesg | grep ttyS*


在Ubuntu下装了CuteCom,但当打开 /dev/ttyUSB0 时,总提示错误,打开失败时:

用 Minicom 可以正常读取 ttyUSB0。

sudo chmod 666 /dev/ttyUSB0

这样修改后, CuteCom 就可以正常打开 USB 串口了

1,pycharm程序端代码。


#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
from time import sleepser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5)def recv(serial):global datawhile True:data = serial.read(30)if data == '':continueelse:breaksleep(0.02)return datawhile True:data = recv(ser)ser.write(data)

在pycharm上的程序:

程序效果为: 运行后,在CuteCom发生的代码, 程序这边会原文返回发给CuteCom。

1.3 Python(Linux下)获取串口的idv和idp以及serial序列号

串口端口的获取脚本

# coding=utf-8
#__author__ = 'Haleydu'
__editTime__ = '2018.12.7'import serial.tools.list_ports
import serial
import os
import reclass AutoMatchSerialPort:#一.获取串口 or 判断是否存在该串口def getSerial(self,needdev=''):needSerial=''port_list = list(serial.tools.list_ports.comports())if len(port_list) <= 0:print ("The Serial port can't find!")else:#1.过滤,获取需要的串口for i in list(port_list):if i.name==needdev:needSerial=i.nameprint(i.name,end=',')print('\n')#2.返回获取的目的串口为了绑定return needSerial# 二.根据端口号返回ID号和硬件号def getSerialIDAndSer(self,dev):cmd = "udevadm info --attribute-walk --name=" + devresult = self.execCmd(cmd)pat1 = "ATTRS{idVendor}==.?(\d\d\d\d).?"pat2 = "ATTRS{idProduct}==.?(\d\d\d\d).?"pat3 = 'ATTRS{serial}==.([A-Za-z0-9]+).'ret1 = re.search(pat1,result)ret2 = re.search(pat2,result)ret3 = re.search(pat3,result)idv = ret1.group(1)idp = ret2.group(1)ser = ret3.group(1)return idv,idp,ser# 三.根据ID号或者序列号返回串口的端口号,也可以用别名直接调用该串口(运行后需要拔插目的串口后生效)def getSerialPort(self,idv='',idp='',ser='',alias='ttyUSB_test'):if idv==''or idp=='':contentID = 'ATTRS{serial}=="'+ser+', MODE:="0777", SYMLINK+="'+ alias +'" \n'elif ser=='':contentID = '", ATTRS{idVendor}=="'+idv+'", ATTRS{idProduct}=="'+idp+'", MODE:="0777", SYMLINK+="'+ alias +'" \n'else:contentID = 'ATTRS{serial}=="'+ser+'", ATTRS{idVendor}=="'+idv+'", ATTRS{idProduct}=="'+idp+'", MODE:="0777", SYMLINK+="'+ alias +'" \n'path='/etc/udev/rules.d/getSerialPort_'+alias+'.rules'if os.path.exists(path):#print('存在文件')f = open(path,"w")f.write(contentID)f.flush()f.close()#print('创建成功')#print('重新拔插串口后生效')else:#print('不存在文件,开始创建getSerialPort_'+alias+'.rules的udev规则文件')f = open(path,"w")f.write(contentID)f.flush()f.close()#print('创建成功')#print('重新拔插串口后生效')#重启udev规则#sudo /etc/init.d/udev restart#根据ID获得端口号cmd = "udevadm info --attribute-walk --name=" + aliasresult = self.execCmd(cmd)pat = '(ttyUSB.)'ret = re.search(pat,result)dev=''try:dev = ret.group(1)except AttributeError:if dev=='':print('重新拔插串口后生效')return dev#调用终端,获取终端输出def execCmd(self,cmd):  r = os.popen(cmd)  result = r.read()  r.close()  return result  if __name__ == '__main__':am=AutoMatchSerialPort()am.getSerial()print('ttyUSB0:' + str(am.getSerialIDAndSer("ttyUSB0")))print('ttyUSB1:' + str(am.getSerialIDAndSer("ttyUSB1")))print('0403:6002,FT2NPXY4,ttyUSB_1:' + am.getSerialPort('0403','6002','FT2NPXY4','ttyUSB_1'))print('0403:6001,FTSYWCXZ,ttyUSB_2:' + am.getSerialPort('0403','6001','FTSYWCXZ','ttyUSB_2'))

2 SERIAL 串口操作

参考文档:
https://blog.csdn.net/qq_14997473/article/details/80875722:Python学习笔记——串口配置以及发送数据

https://blog.csdn.net/ubuntu14/article/details/75335106:python实现串口自动触发工作

(1) 安装pyserial库

pip install pyserial

serial = serial.Serial(‘COM1’, 115200) 打开COM1并设置波特率为115200,COM1只适用于Windows
serial = serial.Serial(‘/dev/ttyS0’, 115200) 打开/dev/ttyS0并设置波特率为115200, 只适用于Linux

(2) pyserial库常用函数介绍
serial = serial.Serial(‘COM1’, 115200) 打开COM1并设置波特率为115200,COM1只适用于Windowsserial = serial.Serial(‘/dev/ttyS0’, 115200) 打开/dev/ttyS0并设置波特率为115200, 只适用于Linuxprint serial .portstr 能看到第一个串口的标识serial .write(“hello”) 往串口里面写数据serial .close() 关闭serial 表示的串口serial .open() 打开串口data = serial .read(num) 读num个字符data = serial .readline() 读一行数据,以/n结束,要是没有/n就一直读,阻塞。serial .baudrate = 9600 设置波特率print serial 可查看当前串口的状态信息serial .isOpen() 当前串口是否已经打开serial.inWaiting() 判断当前接收的数据serial.flushInput() 清除输入缓冲区数据serial.flushOutput() 中止当前输出并清除输出缓冲区数据
(3) 实例: 获取从其他串口发送来的数据并回显
#!/usr/bin/python
# coding=UTF-8
import serial
###################################################
#
# 功 能: 将接收到的数据已hex显示
# 参 数: 串口接受到的数据
# 返 回: 转换后的数据
#
###################################################
def hexshow(data): hex_data = '' hLen = len(data) for i in xrange(hLen): hvol = ord(data[i]) hhex = '%02x' % hvol hex_data += hhex+' 'print 'hexshow:', hex_data
###################################################
#
# 功 能: 将需要发送的字符串以hex形式发送
# 参 数: 待发送的数据
# 返 回: 转换后的数据
#
###################################################
def hexsend(string_data=''): hex_data = string_data.decode("hex") return hex_data if __name__ == '__main__': serial = serial.Serial('/dev/ttyS0', 115200) print serial if serial.isOpen(): print("open success") else: print("open failed") try: while True: count = serial.inWaiting() if count > 0: data = serial.read(count) if data != b'': print("receive:", data) serial.write(data) else: serial.write(hexsend(data)) except KeyboardInterrupt: if serial != None: serial.close()
16进制处理
import serial #导入模块
try:portx="COM3"bps=115200#超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)timex=Noneser=serial.Serial(portx,bps,timeout=timex)print("串口详情参数:", ser)#十六进制的发送result=ser.write(chr(0x06).encode("utf-8"))#写数据print("写总字节数:",result)#十六进制的读取print(ser.read().hex())#读一个字节print("---------------")ser.close()#关闭串口except Exception as e:print("---异常---:",e)
其他
import serial #导入模块
try:#端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等portx="COM3"#波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200bps=115200#超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)timex=5# 打开串口,并得到串口对象ser=serial.Serial(portx,bps,timeout=timex)print("串口详情参数:", ser)print(ser.port)#获取到当前打开的串口名print(ser.baudrate)#获取波特率result=ser.write("我是东小东".encode("gbk"))#写数据print("写总字节数:",result)#print(ser.read())#读一个字节# print(ser.read(10).decode("gbk"))#读十个字节#print(ser.readline().decode("gbk"))#读一行#print(ser.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用#print(ser.in_waiting)#获取输入缓冲区的剩余字节数#print(ser.out_waiting)#获取输出缓冲区的字节数#循环接收数据,此为死循环,可用线程实现while True:if ser.in_waiting:str=ser.read(ser.in_waiting ).decode("gbk")if(str=="exit"):#退出标志breakelse:print("收到数据:",str)print("---------------")ser.close()#关闭串口except Exception as e:print("---异常---:",e)

3 解决 ImportError: No module named ‘serial’ 问题

在pycharm里编写Python串口程序的时候,编译时提示 ImportError: No module named ‘serial’

解决办法:

安装 serial module
这里区分python2和 python3:

首先需要在终端输入:

sudo apt install python-pip //python2
sudo apt install python3-pip    //python3


安装python3的 pip3的时候,如果时国内的软件源可能安装不上,(当时用中国科学技术大学的软件源,python3-pip下载有问题),换成ubuntu官网成功下载。

如果系统已经安装过了pip,就不需要这一步了。
然后通过:

pip install pyserial    //python2
pip3 install pyserial   //python3

可以从pyserial下载这里去获取源码进行熟悉和学习。

4 PYCHARM 里面的no module name serial错误


错误原因在于:==interpreter的选择==

安装目录下的python,其模块只有一个setuptools,所以找不到serial

ANACONDA下的python.exe里面包含了多个模块,所以应该将interpreter改为该目录下的python.exe

5 TypeError: ‘bool’ object is not callable

因为 isOpen是属性所以有如下做法

 def isOpen(self):return Truedef is_active(self):return Truedef is_anonymous(self):return False

不是方法,将sOpen()括号去掉,完美解决!

Python 之 Serial串口通信相关推荐

  1. USB to TTL python 本地测试串口通信

    手头上有个 USB to TTL CH340 型号的,想在本地用 python 测试下串口通信. 硬件准备 首先是 USB to TTL 元件,找个跳线帽将 TXD 和 RXD 针脚相连,插到电脑上 ...

  2. python实现CH340串口通信(超详细)

    mac python实现CH340串口通信 串口通信介绍 烧录程序 代码实现串口通信 https://www.lanqiao.cn/courses/2947,提供准备好的云主机ros环境,进行实操,课 ...

  3. python中select模块_基于python select.select模块通信的实例讲解 如何用python写个串口通信的程序...

    python socket怎么利用select实现双工通信 方法: Before : 0000000000000000000000000000000000000000 After pack: 0100 ...

  4. Python的Serial串口通讯协议

    Python的Serial串口通讯协议 一.概述 pyserial模块封装了对串口的访问. 二.特性 在支持的平台上有统一的接口. 通过python属性访问串口设置. 支持不同的字节大小.停止位.校验 ...

  5. 如何用python写串口通信软件_如何用python写个串口通信的程序?

    展开全部 打开串口后启动一个线程来监听串口数据的进入,有数据时,就做数据的处理. 用python写串口通信e68a84e8a2ad32313133353236313431303231363533313 ...

  6. Python之UART串口通信

    Python学习之UART串口通信 ```python import serial #导入串口模块 import time #导入时间模块try:#打开串口,并且获得串口对象MyCom = seria ...

  7. python和arduino串口通信_利用串行通信实现python与arduino的同步

    我有一个需要:使用arduino将伺服电机移动到某个位置并在该位置停止 让一个由python控制的相机在那个位置获取图像 当图像被采集到时,伺服机构应该移动到一个对称的位置 这个序列重复N次 所以我尝 ...

  8. 树莓派python版本的串口通信设置

    经过一天的探索终于解决了一个问题,就是在树莓派上用python代码来使用串口来通讯,看过了无数的教程 踩过了无数的坑,下面是我结合各个案例总结的设置方法. 参考链接: 1.https://blog.c ...

  9. Python之PySerial串口通信

    安装PySerial Python环境安装完成后,会默认安装PIP,在命令行窗口输入以下命令,即可完成PySerial的安装. pip install pyserial

最新文章

  1. 玩转Linux:常用命令实例指南
  2. 基于Matlab的模拟通信实验平台设计,【通信原理仿真实验】通信原理虚拟实验仿真平台的设计和实现_玛雅作文网...
  3. 机器学习知识总结系列- 基本概念(1-0)
  4. 想转行,是要入坑Python还是Java?这问题还用问?
  5. 主从复制1062错误解决方法
  6. eagle8.6 linux 补丁,Ubuntu 12.04无法安装Eagle-6.x 解决方法
  7. 上位机控制PWM占空比
  8. matlab心电显示,请问如何在GUI界面中打开并显示心电信号
  9. 接口测试主要做以下3个方面:
  10. 单片机 74HC595 实例
  11. Node.js模拟登录强智科技教务系统
  12. 功能性需求和非功能性需求
  13. 至联云讲解《IPFS/Filecoin上线后会涨的八大理由》
  14. Apache BookKeeper 简介
  15. 使用java代码实现扫码登录
  16. 各样本观察值均加同一常数_医药数理统计学试题及答案
  17. DO、DTO、BO、VO、POJO等各种O浅学(总结)
  18. Tushare介绍、安装及使用教程
  19. 准确率-召回率 - Precision-Recall
  20. 如何在Mac上安装Python

热门文章

  1. sssssssssssssss
  2. 2018年ACM总结(下)——icpc 香港赛区
  3. UMI采用ts文件导入mockjs包,无法找到模块
  4. 中间继电器DZK-114/220VDC
  5. JANAM XT2耐用型RFID触摸式计算器获取Stratus Mobile应用的运行许可
  6. jmeter稳定性测试
  7. 几种单USB转多串口的方案
  8. turn(sturn协议拓展)协议解析介绍
  9. 信息安全-网络安全漏洞防护技术原理与应用
  10. Unity3d Webplayer 障蔽缓存机制