Python 串口

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

结果:

[<serial.tools.list_ports_common.ListPortInfo object at 0x000000000C526908>] 

COM8 - XR21V1410 USB UART (COM8)
1553062041.3768208
=================
<class 'time.struct_time'>
<class 'str'>
=================
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()#保证关闭串口

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值