当前位置:首页 » 编程语言 » python串口编程

python串口编程

发布时间: 2022-12-29 02:12:17

python3.5 读取串口中的数据怎么解码

1、安装串口库
2、采用默认通信参数
import serial
t = serial.Serial('com1',9600)
n = t.write('you are my world')print t.portstrprint n
str = t.read(n)print str
3、可以自己设置参数

import timeimport serialser = serial.Serial( #下面这些参数根据情况修改 port='COM1', baudrate=9600, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO, bytesize=serial.SEVENBITS)data = ''while ser.inWaiting() > 0: data += ser.read(1)if data != '': print data
注意:Python与多个串口通信的时候,要确定端口号。如果有时间的话,可以自己写一个查询所有端口的信息,不想这么麻烦的话,下载个串口助手,自己看端口信息,在py文件中修改serial.Serial()里面的端口号。

② 如何用python实现串口通信

Python非常适合写一些测试的脚本,如快速的串口通信测试等。如果使用VC++ QT开发,可能用时较多,使用python,如果掌握使用方法,可以直接读写测试,配合设备或是串口助手,很快验证与实现。
Python有没有现成的串口API直接调用呢?经过实践验证,需要安装一个叫 Pyserial的组件即可。这个可以在github上下载。

在windows 7 64bit 上可以使用吗?当然可以使用,我安装的python3.5为64位的。把下载后的文件,其中有一个serial的文件夹,拷贝到python35安装路径, C:\Python35\Lib\site-packages\serial
网上可以搜一下windows的安装包,安装完也是:C:\Python35\Lib\site-packages\serial ,可以用最新的版本,替换即可。
测试的方法:在python IDE里测试:
>>> import serial
这里如果报错,是python版本与pyserial版本没有配合好。如果正常,不返回,即可以导入serial模块。
>>> ser=serial.Serial("COM5",115200)
这里为COM5,115200的波特率。如果打不开,请检查安装环境。
>>> ser.write('hello,serial test'.encode())
17
发送测试(如果返回字节数,说明返回成功),这里需要转换一个编码为字节。
以上测试,可以使用现在的设备或是串口助手,如安装Virtual Serial Port Driver 7.2 虚拟串口软件,设置一对串口,进行自发自收的测试。
>>> print(ser.readline())
b'abcdefg\r\n'
这里是串口接收,有接收的超时。设备或是串口助手发送一个字符串,以回车换行结束,这里就可以收到打印出来。
也可以用ser.read(),这里只接收一个字符来实现。
上面已经实现了基本的串口操作。
关闭串口为:
>>> ser.close()
如果使用python,一般写个py文件,就像windows bat 批处理一样,这是python强大的地方。如果写一个py脚本呢?其实只要把上面的命令,一条条写下来,就是一个脚本,测试如下:
import serialser=serial.Serial("COM5",115200,timeout=0.5)for i in range(0,100-1):ser.write('hello\r\n'.encode())print(ser.readline());ser.close()

③ 如何用python写个串口通信的程序

使用 pyserial 就可以处理串口通信,这个包是跨平台的。

http://pyserial.sourceforge.net/


示例程序在这里:

https://pyserial.readthedocs.io/en/latest/examples.html#wxpython-examples


importserial

#创建serial实例
serialport=serial.Serial()
serialport.port='COM1'
serialport.baudrate=9600
serialport.parity='N'
serialport.bytesize=8
serialport.stopbits=1
serialport.timeout=0.6
try:
serialport.open()
serialport.setDTR(True)
serialport.setRTS(True)
exceptException,ex:
printex

#发送数据
serialport.write(raw_data)

#根据项目要求,可以开一个线程扫描接收数据

④ 如何用python写个串口通信的程序

使用pyserial库,是最简单的!!!

import serial
ser = serial.Serial() # open 'COM1', baudrate=9600, etc
ser.write('string out')
ser.read(1) # read 1 byte from COM port
# ...
ser.close()<img id="selectsearch-icon" src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png" alt="搜索">

⑤ python对串口蓝牙模块的操作

python提供了丰富的mole 对串口的操作同样有对应的mole:serial

环境:python3.5 蓝牙模块:HC-05 波特率38400

首先导入serial模块(通过pip install serial 安装)
获取串口ser 通过serial.Serial(地址,波特率,超时时间)
创建线程监听串口数据
使用 ser.in_waiting() 获知数据量 这个函数返回当前串口收到的数据长度
收取数据后进行详细操作

⑥ python 串口

help(serial)看一下帮助里面的属,要区分大小写

⑦ 树莓派怎么样用 Python 控制 GPIO 来发送串口指令

python GPIO
1、先安装python-dev,输入以下指令。

sudo
apt-get install python-dev

2、安装RPi.GPIO,依次输入以下指令。

1)下载:$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz

2)解压缩:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz

3)进入解压之后的目录 :$ cd RPi.GPIO-0.5.3a
4)启动安装 :$ sudo python setup.py install

3、例子:

[python] view plain
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)

while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)

4、执行:
sudo python led.py

5、说明:
1)GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。
2)由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。

python GPIO
1、说明:
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言包转,例如python、ruby或者PHP等。

wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询
GPIO管脚。wiringPi是可以扩展的,可以利用wiringPi的内部模块扩展模拟量输入芯片,可以使用
MCP23x17/MCP23x08(I2C
或者SPI)扩展GPIO接口。另外可通过树莓派上的串口和Atmega(例如arino等)扩展更多的GPIO功能。另外,用户可以自己编写扩展模
块并把自定义的扩展模块集成到wiringPi中。WiringPi支持模拟量的读取和设置功能,不过在树莓派上并没有模拟量设备。但是使用
WiringPi中的软件模块却可以轻松地应用AD或DA芯片。

⑧ 用Python控制串口连接的ESP8266无线芯片,如何操作

1、确定一下串口没问题(可以尝试用其他编程语言操作)
2、看下下面博客,试试能不能解决问题。
http://cache.content.com/c?m=&p=&newp=&user=&fm=sc&query=python+serial+%C4%A3%BF%E9&qid=d941882f0009a361&p1=5

⑨ 有没有python的串口库

串口模块的波特率比较特别,找了几个串口工具都不支持。。。所以,干脆用python自己来写了,其实已经好奇好久了,别人的工具各种不顺手。

需要pyserial的支持,兼容各种平台,不需要新编译二进制文件。

先贴一个定时发送的代码:

6. exception:serial.SerialException

另一个完整收发的例子,单片机数据以TLV(Type,Length,Value)格式发上来

#!/usr/bin/env python
# it's a program of luo, [email protected]
import serialimport arrayimport osimport signalfrom time import sleep

flag_stop = Falsedef onsignal_int(a,b): print "sigint!"
global flag_stop
flag_stop = True

signal.signal(signal.SIGINT, onsignal_int)
signal.signal(signal.SIGTERM, onsignal_int)

ser = serial.Serial('/dev/ttyUSB0', 9600, timeout = 0.001)print "serial.isOpen() =",ser.isOpen()

cmd_send = ""cmd_send = cmd_send.decode("hex")

stop = "7b04047d0d0a"stop = stop.decode("hex")

cmd_back = ""cmd_length = 0x00cmd_count = 0x00s = ser.write(cmd_send)while True:
sleep(0.1)
if flag_stop: # read data until Ctrl+c
ser.write(stop) # send cmd stop before exit
print "reset cmd has been sent!"
sleep(0.05) break

text = ser.read(1) # read one, with timout
if text: # check if not timeout
n = ser.inWaiting() # look if there is more to read
if n:
text = text + ser.read(n) #get it
cmd_back = cmd_back + text
text = ""

if len(cmd_back) < 2: # go back if no enough data recvd
continue

if cmd_length == 0x00: # new loop
cmd_length = ord(cmd_back[1]) # Type(1 byte),Length of Value(1 byte),Value
print "new cmd length,",cmd_length

if (cmd_length + 0x02) > len(cmd_back): # do nothing until all bytes is recvd
continue

# so far, we have got a full cmd
hex_list = [hex(ord(i)) for i in cmd_back] # more readable than data.encode("hex")
print "In buffer:",hex_list
cmd_back = cmd_back[cmd_length+2:] # remove this cmd(TLV) from buffer
cmd_length = 0
cmd_count += 1
print "==> %d cmds recvd."%(cmd_count) print "-------------"
ser.close()

——————

⑩ python - serial communication(串口通信)

由于测试工作的需要,在C端产品上经常使用串口进行通信,而测试脚本大部分时候又采用python编写,于是就不得不了解并熟悉python下的串口通信实现方法了,整理如下以备随时使用:

一、说明

pyserial封装了python环境下对串口的访问,其兼容各种平台,并有统一的操作接口。通过python属性访问串口设置,并可对串口的各种配置参数(如串口名,波特率、停止校验位、流控、超时等等)做修改,再进行串口通信的类与接口封装后,非常方便地被调用和移植。

二、模块安装

pip insatll pyserial

三、初始化与参数说明

import serial

ser = serial.Serial('COM3', 115200, timeout=0.5, ....................)

下面看看 serial.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口连接串行口

五、串口属性

ser.name #串口名称

ser.port #端口号

ser.baudrate #波特率

ser.bytesize #字节大小

ser.parity #校验位N-无校验,E-偶校验,O-奇校验

ser.stopbits #停止位

ser.timeout #读超时设置

ser.writeTimeout #写超时

ser.xonxoff #软件流控

ser.rtscts #硬件流控

ser.dsrdtr #硬件流控

ser.interCharTimeout #字符间隔超时 

六、串口常用方法

isOpen():查看端口是否被打开。

open() :打开端口‘。

close():关闭端口。

read(size=1):从端口读字节数据。默认1个字节。

read_all():从端口接收全部数据。

write(data):向端口写数据。

readline():读一行数据。

readlines():读多行数据。

in_waiting():返回输入缓存中的字节数。

out_waiting():返回输出缓存中的字节数。

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

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

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

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

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

setRTS(level=True):设置请求发送(RTS)的控制信号

setDTR(level=True):设置数据终端准备就绪的控制信号

七、类与接口封装

import time

import serial

import serial.tools.list_ports

# 串口操作类

class serialCommunication(object):

    def __init__(self, port, bps, timeout):# 可配置更多参数

        port_list =self.show_usable_com()

        if len(port_list) >0:

            if portnot in port_list:

                self.port = port_list[0]

            else:

                self.port = port

        else:

            print("no usable serial, please plugin your serial board")

            return

        self.bps = bps

        self.timeout = timeout

        try:

            # 初始化串口,并得到串口对象,根据需要可拓展更多参数

            self.ser = serial.Serial(self.port, self.bps, 8, 'N', 1, timeout=self.timeout, write_timeout=self.timeout)

        except Exception as e:# 抛出异常

            print("Exception={}".format(e))

    # 显示可用串口列表

    @staticmethod

    def show_usable_com():

        serialport_list = []

        portInfo_list =list(serial.tools.list_ports.comports())

        if len(portInfo_list) <=0:

            print("can not find any serial port!")

        else:

            print(portInfo_list)

            for i in range(len(portInfo_list)):

                plist =list(portInfo_list[i])

                print(plist)

                serialport_list.append(plist[0])

            print(serialport_list)

            return serialport_list

# 输出串口基本信息

    def serial_infor(self):

        print(self.ser.name)# 设备名字

        print(self.ser.port)# 读或者写端口

        print(self.ser.baudrate)# 波特率

        print(self.ser.bytesize)# 字节大小

        print(self.ser.parity)# 校验位

        print(self.ser.stopbits)# 停止位

        print(self.ser.timeout)# 读超时设置

        print(self.ser.writeTimeout)# 写超时

        print(self.ser.xonxoff)# 软件流控

        print(self.ser.rtscts)# 软件流控

        print(self.ser.dsrdtr)# 硬件流控

        print(self.ser.interCharTimeout)# 字符间隔超时

    # 打开串口

    def serial_open(self):

        try:

            if not self.ser.isOpen():

                self.ser.open()

        except Exception as e:# 抛出异常

            print("serial_open Exception={}".format(e))

            self.ser.close()

    # 读取指定大小的数据

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

    def serial_read_with_size(self, size):

        try:

            self.serial_open()

            return self.ser.read(size).decode("utf-8")

        except Exception as e:

            print("serial_read_all Exception={}".format(e))

            self.ser.close()

    # 读取当前串口缓存中的所有数据

    def serial_read_data(self):

        try:

            self.serial_open()

            datalen =self.ser.inWaiting()

            if datalen ==0:

                return None

            return self.ser.read(datalen).decode("utf-8")

        except Exception as e:

            print("serial_read_data Exception={}".format(e))

            self.ser.close()

    # 读串口全部数据,注意timeout的设置

    # 在设定的timeout时间范围内,如果读取的字节数据是有效的(就是非空)那就直接返回,

    # 否则一直会等到设定的timeout时间并返回这段时间所读的全部字节数据。

    def serial_read_all(self):

        try:

            self.serial_open()

            return self.ser.read_all().decode("utf-8")

        except Exception as e:

            print("serial_read_all Exception={}".format(e))

            self.ser.close()

    # 读一行数据

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

    # 如果没有超时,readline会报异常。

    def serial_read_line(self):

        try:

            self.serial_open()

            return self.ser.readline().decode("utf-8")

        except Exception as e:

            print("serial_read_line Exception={}".format(e))

            self.ser.close()

    # 读多行数据,返回行列表

    def serial_read_lines(self):

        try:

            self.serial_open()

            return self.ser.readlines().decode("utf-8")

        except Exception as e:

            print("serial_read_lines Exception={}".format(e))

            self.ser.close()

    # 写数据

    def serial_write_data(self, data):

        try:

            self.serial_open()

            self.ser.flushOutput()

            data_len =self.ser.write(data.encode('utf-8'))

            return data_len

        except Exception as e:

            print("serial_write_data Exception={}".format(e))

            return 0

    # 写行数据,注意参数差异

    def serial_write_lines(self, lines):

        self.ser.writelines(lines)

    # 清除串口缓存

    def serial_clean(self):

        try:

            if self.ser.isOpen():

                self.ser.flush()

        except Exception as e:

            print("serial_clean Exception={}".format(e))

    # 关闭串口

    def serial_close(self):

        try:

            if self.ser.isOpen():

                self.ser.close()

        except Exception as e:

            print("serial_clean Exception={}".format(e))

if __name__ =='__main__':

    testSerial = serialCommunication("COM10", 1500000, 0.5)

    testSerial.serial_open()

    testSerial.serial_infor()

    testSerial.serial_write_data("ifconfig eth0\n")

    time.sleep(0.1)

    data = testSerial.serial_read_all()

    print(data)

    testSerial.serial_close()

八、其他

1)ser.VERSION表示pyserial版本; 另外,ser.name表示设备名称

2)端口设置可以被读入字典,也可从字典加载设置:

    getSettingDict():返回当前串口设置的字典

    applySettingDict(d):应用字典到串口设置

3) Readline()是读一行,以/n结束,要是没有/n就一直读,阻塞。注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。

4)serial.read_all 与 serial.read_all()区别

    serial.read_all:读取串口所有的参数信息

    serial.read_all():超时时间内从串口读取的所有数据

5) 异常信息

    exception serial.SerialException

    exception serial.SerialTimeoutException

热点内容
登录时设置密码保存在哪里 发布:2025-07-04 04:34:23 浏览:530
网站开发源码 发布:2025-07-04 04:30:45 浏览:339
魔戒护卫队是什么配置 发布:2025-07-04 04:25:33 浏览:565
数据库外网 发布:2025-07-04 04:19:48 浏览:111
固件解压包 发布:2025-07-04 04:15:02 浏览:925
卡罗拉顶配都有什么配置 发布:2025-07-04 04:12:50 浏览:671
python3435 发布:2025-07-04 04:12:07 浏览:828
数据库日志满了 发布:2025-07-04 04:09:15 浏览:515
尚硅谷java视频ftp 发布:2025-07-04 04:09:13 浏览:646
编程的苦难 发布:2025-07-04 04:08:16 浏览:356