import serial#导入模块
ser = serial.Serial(串口号,波特率) #打开第一个串口
print ser.portstr 能看到第一个串口的标识,windows下是COM1
ser.write(“hello") 就是往串口里面写数据
ser.close() 就是关闭ser表示的串口
ser.open() 会打开这个串口
ser = serial.Serial('COM1', 115200) 来设置波特率,当然还有专门的函数
data = ser.read()可以读一个字符
data = ser.read(20) 是读20个字符
data = ser.readline() 是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()都需要设置超时时间
ser.baudrate = 9600 设置波特率
ser 来查看当前串口的状态
ser.isOpen() 看看这个串口是否已经被打开
serial = serial.Serial(‘COM1’, 115200) 打开COM1并设置波特率为115200,COM1只适用于Windows
serial = serial.Serial(‘/dev/ttyS0’, 115200) 打开/dev/ttyS0并设置波特率为115200, 只适用于Linux
print 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() 中止当前输出并清除输出缓冲区数据
查看所有串口
import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
if len(port_list) == 0:
print('找不到串口')
else:
for i in range(0,len(port_list)):
print(port_list[i])
将int型转换成byte型:链接地址
>>> bytes([2])
b'\x02`
注意:
The integer must be surrounded by the parenthesis, otherwise, you will get the
bytes object of size given by the parameter initialized with null bytes
but not the corresponding bytes.>>> bytes(3) b'\x00\x00\x00' >>> bytes([3]) b'\x03'
通过帮助可以得知的信息
>>> help(bytes)
Help on class bytes in module builtins:
class bytes(object)
| bytes(iterable_of_ints) -> bytes
| bytes(string, encoding[, errors]) -> bytes
| bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
| bytes(int) -> bytes object of size given by the parameter initialized with null bytes
| bytes() -> empty bytes object
|
| Construct an immutable array of bytes from:
| - an iterable yielding integers in range(256)
| - a text string encoded using the specified encoding
| - any object implementing the buffer API.
| - an integer
完整的bytes帮助信息
至于 iterable_of_ints 可以参考 网站 :迭代器
取得当前时间戳
import time
print time.time()
格式化时间戳为标准格式
print time.strftime(
'%Y.%m.%d'
,time.localtime(time.time()))
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
import serial #导入模块
import time
import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
print(port_list,'\n')
if len(port_list) == 0:
print('无可用串口')
else:
for i in range(0,len(port_list)):
print(port_list[i])
print( time.time())
print( '=================')
a=time.localtime(time.time())
print(type(a))
c=time.strftime('%Y.%m.%d.%H.%M.%S',time.localtime(time.time()))
print(type(c))
print( '=================')
print (time.strftime('%Y.%m.%d-%b.%a-%H.%M.%S',time.localtime(time.time())))
time.localtime(time.time())
结果:
[]
COM8 - XR21V1410 USB UART (COM8)
1553062041.3768208
=================
=================
2019.03.20-Mar.Wed-14.07.21
Python中的延时,可以使用time模块中的sleep函数来实现,代码如下:
import time
time.sleep(1)
目标:首先电脑能够自动识别已连接的串口,电脑通过串口发送数据到单片机,按一次enter键,就发送一次,一共发送五次,从a-e,并且单片机每接收到一次数据,就把之前的数据都会一股脑的发送给电脑
完整的Python代码:
#导入模块
import time
import serial
import serial.tools.list_ports
#识别电脑端连接成功的串口
port_list = list(serial.tools.list_ports.comports())#返回的是字符串
if len(port_list) == 0:
print('无可用串口')
else:
for i in range(0,len(port_list)):
print(port_list[i])
print("---------------")
#为了保证串口的关闭,使用try...except ...finally...
try:
portx=port_list[0][0]
bps=115200
#超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
timex=10
ser=serial.Serial(portx,bps,timeout=timex)
if ser.isOpen() :
print(portx+" open success")
else :
print(portx+" open failed")
for x in range(65,70):
input('按Ente键进行下一步')#等待输入enter
ser.write(bytes([x]))#输出一个字节
print('send ',x-65,':',bytes([x]))#显示发送的信息
time.sleep(0.5)#单片机返回是有延时的,所以要等一等,否则就无法接收到发送的数据
count = ser.inWaiting()#看看是不是接到了数据,返回的是接收缓冲区的字节数
if count > 0:
data = ser.read(count)#把接收缓冲区的数据都读出来
print('rece ',x-65,':',count,'bytes- ',data)
except Exception as e:
print("---异常---:",e)
finally:
ser.close()#保证关闭串口