树莓派串口

串口使用例程及说明:http://elinux.org/Serial_port_programming

http://elinux.org/RPi_Serial_Connection

Pyserial API https://pyserial.readthedocs.io/en/latest/pyserial_api.html

sudo apt-get install python-serial

 

python -m serial.tools.list_ports 此命令可以查看设备的文件节点。

 

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)  

 

port:读或者写端口

baudrate:波特率

bytesize:字节大小

parity:校验位

stopbits:停止位

timeout:读超时设置

writeTimeout:写超时

xonxoff:软件流控

rtscts:硬件流控

dsrdtr:硬件流控

interCharTimeout:字符间隔超时

timeout 与read():

timeout = None一直等待,直到接受到数据

timeout = 0: 非阻塞

timeout = x: 等待时长

write() 默认阻塞, 除非write_timeout 被设置.

 

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

write(data):发送data,并返回发送字节数。如果bytesbytearray可用(python 2.6以上),则接受其作为参数;否则接受str作为参数。

异常:SerialTimeoutException——配置了写超时并发生超时时发生此异常。

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

例程:

#!/usr/bin/env python

import serial
import time

def uart(port):
	rv_buf=""
	ch=''
	while True:
		ch=port.read();
		rv_buf+=ch
		if ch=='' or ch=='\r':
			return rv_buf			
			
send_buf=""
port=serial.Serial("/dev/ttyUSB0",baudrate=115200,timeout=None)
while True:
	send_buf=uart(port)
	port.write(send_buf)
	print(send_buf)

用串口接受数据,单路的简单接受我们已经调试成功了。但是在实际应用过程中,需要用到多路。因此目前的想法是通过select来实现。

首先简单学习一下python中的select

Pythonselect()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()方法的文件句柄)何时变成readable writeable, 或者通信错误。

 

Select的用法很简单,select( iwtd, owtd, ewtd[, timeout])前三个参数是‘等待对象’。这三个参数分别按顺序等待输入、输出和异常状态。允许空数组timeout 参数接受浮点数表示的秒。如果省略 timeout 将会阻塞直到至少一个文件描述符准备就绪。timeout 0表示从不阻塞。这里在串口接收进程中是阻塞的操作,一直在阻塞,等待数据,防止数据丢失。

返回值是包含前三个参数里面已准备就绪的对象的3个列表.如果已经超时但是并没有对象准备就绪,那么返回3个空列表

#!/usr/bin/env python

import select
import serial
import time
import multiprocessing 

def uart(port):
	rv_buf=""
	ch=''
	while True:
		ch=port.read()
		rv_buf+=ch
		if ch=='' or ch=='\r':
			return rv_buf			
			
def uart_trans():
	send_buf0=""
	send_buf1=""
	i=0
	port0=serial.Serial("/dev/myuart0",baudrate=115200,timeout=0)
	port1=serial.Serial("/dev/ttyUSB1",baudrate=115200,timeout=0)
	fd0=file("/dev/myuart0","r+")
	fd1=file("/dev/ttyUSB1","r+")
	while True:
		rlist,wlist,elist=select.select([fd0,fd1],[],[],)
		for fd in rlist:
			if(fd==fd0):
				send_buf0=uart(port0)
				port0.write(send_buf0)
			if(fd==fd1):
				send_buf1=uart(port1)
				port1.write(send_buf1)
if __name__ =="__main__":
	uart_trans()

测试源码:https://github.com/IJustLoveMyself/Raspberry-Pi/blob/master/test1/uart.py

https://github.com/IJustLoveMyself/Raspberry-Pi/blob/master/test1/select.py



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值