pythonarduino串口通信(python做串口通讯)

http://www.itjxue.com  2023-03-27 20:44  来源:未知  点击次数: 

如何在pcDuino上面使用python-serial

HomepcDuino如何在pcDuino上面使用python-serial

Previous Next

如何在pcDuino上面使用python-serial

1

Posted by: wang, lei , 六月 19, 2015

相信有些朋友在pcduino上面使用python的时候会发现串口(GPIO0和GPIO1)发不出数据也接收不到数据,在ArduinoIDE里面使用却可以正常通讯;然后返回到python下面,python-serial下面的通讯也正常,这是因为在python下面没有设置gpio0和gpio1模式为UART模式,那么我们在python代码里面将模式设置为UART,对pcduino GPIO模式的设置,可以对下面文件夹里面对应的端口写模式,通用写‘0’为输入模式,写‘1’为输出模式,这里我们在GPIO里面写‘3’可以配置为UART:

/sys/devices/virtual/misc/gpio/mode/

安装python-serial:

sudo apt-get instal python-serial

测试代码:

import serial

with open("/sys/devices/virtual/misc/gpio/mode/gpio0",'w') as UART_RX:

UART_RX.write('3')

with open("/sys/devices/virtual/misc/gpio/mode/gpio1",'w') as UART_TX:

UART_TX.write('3')

myport = serial.Serial("/dev/ttyS1",9600,timeout=10)

myport.open()

myport.write('python serial test on pcduino\n')

data = myport.readline()

if len(data)0:

print(data)

myport.close()

保存上面的测试代码为“serial_test.py”文件,然后运行:sudo python ./serial_test.py (需要外接一个USB转串口的模块和pcduino串口通讯,如果没有,也可以直接用跳线将RXD和TXD短接起来,终端会打印出发送的数据“python serial test on pcduino”):

1

使用pc端的串口调试工具发送数据到pcduino上:

2

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

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

示例程序在这里:

import?serial

#?创建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)

except?Exception,?ex:

????print?ex

????

#?发送数据

serialport.write(raw_data)

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

python读取arduino串口数据有版本要求吗?

不需要,Python支持多种系统和平台,跨平台安装库能满足读取Arduino串口数据的需求,无论Python版本如何都可以使用。

如何用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.read()line())

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()

arduino——串口通讯(笔记)

Arduino与外部设备通信的方式均属于串行通讯。

串行通讯的概念是相对于并行通信而言的。

(当然目前来说只是概念上的认知。)

arduino硬件集成了串口、IIC、SPI三种常见的的通信方式,掌握了这三种通讯类库的方法,即可与具有响应通信接口的各种设备通信,也可以为基于这些通信方式的传感器或者模块编写驱动程序。

HardwareSerial类库的使用

hard硬

ware器物或者什么

Serial这里是串口或者串行的意思

我们理解arduino和USB接口的简单通信构成了计算机和arduino之间的串口通信,除此之外arduino还可以与其他串口设备进行通信。

TX发送端

RX接收端

通过简单的图可以理解两个设备之间共用电源接地。

实际的arduino板子上的这两个端口为数字端口0和1

1为发送端

0为接收端

板子上有很明显的标志。

首先简单回顾一下数组在arduino的用法。

数据类型 数组名称【数组元素的个数】

例如 int a[5];定义了一个有5个整数型元素数组。

int a[5]={1,2,3,4,5}

int a[5];

a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;

是等效的。

取值方法:

a[0]

当使用print()发送数据时,发送的不是数据本身,而是将数据转换成字符,再转换成对应的ASCII码发送出去,串口见失去接收到ASCII码,则会显示对应的字符。

而当使用write()时,发送的是数据本身,但当串口见失去接收到数据后,会将数值当成ASCII而显示对应的字符。

因此123对应的字符为{。

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(duration=0.25):发送BREAK条件,并于duration时间之后返回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

(责任编辑:IT教学网)

更多

推荐服务器空间文章