吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2875|回复: 15
收起左侧

[Python 转载] 串口通信不太完美! Python 跨平台真的太棒了!

[复制链接]
Cool_Breeze 发表于 2021-11-4 18:05
基于 pyserial 开发!

这个程序很简单,自动连接串口,发送一条指令后退出!

这个程序需要在Windows,和Ubuntu上面跑。

唯一改动的就是文件格式,需要转换为 unix 格式  vim 命令 set ff=unix

厉害的是 pyinstaller 居然可以在两个平台上无改动编译成功!太棒了!

配置文件 是json格式。一个字典内套一个字典!

statusLight.py:
    实现串口通信
    bpsList = [38400, 921600] 这个是波特率的集合,我们这个项目只用到这两种

[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import serial
import serial.tools.list_ports
import os
import sys

class StatusLight(object):
    ''' 连接串口,实现通信类 '''
    
    # 兼容频率
    bpsList = [38400, 921600]
    # 端口
    ports = serial.tools.list_ports.comports()
    
    
    def __init__(self, sendStr, receive, timeout=0.2):
        ''' args:
            sendStr 发送数据 
            reverse 接送数据
            timeout 超时
            # portn 端口
            # bps 波特率
        '''
        self.portn = ""
        self.bps = ""
        self.sendStr = sendStr
        self.receive = receive
        self.timeout = timeout
        self.serial = None # type pyserial.Serial
    
    def _connect(self):
        ''' 连接串口 '''
        result = True
        try:
            self.serial = serial.Serial(self.portn, self.bps, timeout=self.timeout)
            self.checkDevice()
        except Exception as e:
            result = False
        return result
        
    def setInfo(self, portn, bps, timeout=0.2):
        self.portn = portn
        self.bps = bps
        self.timeout = timeout
        if not self._connect():
            self.automaticAddressing()
    
    def close(self):
        ''' 关闭串口通信 '''
        self.serial.close()

    def automaticAddressing(self):
        ''' 
            自动寻找设备
            实现方法 发送 sendStr 接受返回 数据 与 receive 匹配
        '''
        breakFlag = False
        for n in StatusLight.ports:
            self.portn = n.device
            for b in StatusLight.bpsList:
                self.bps = b
                if self._connect():
                    breakFlag = True
                    break
            if breakFlag:
                break
        if breakFlag:
            print('-' * 20)
            print(f'Device   = {self.portn}')
            print(f'Baudrate = {self.bps}')
            print('-' * 20)
        else:
            print("Failed to connect to serial device!")
            sys.exit(1)
    
    def checkDevice(self):
        ''' 验证设备 '''
        self.write(self.sendStr)
        serial.time.sleep(0.1)
        byteDate = self.serial.read(1)
        if byteDate != self.receive.encode('gbk'):
            raise ValueError(f"check Device Failed: {send} not equal to {receive}")
            
    def write(self, string):
        ''' 发送数据 '''
        self.serial.reset_input_buffer() # 清空输入缓冲器(清空返回值)
        self.serial.write(string.encode('gbk'))
        
    def read(self, count=1):
        ''' 读取数据 count = 字节数'''
        return self.serial.read(count)

if __name__ == "__main__":
    ser = StatusLight('COM4', 38400)
    ser.automaticAddressing()
    print(ser.serial.write("b".encode('gbk')))
    serial.time.sleep(0.5)
    ser.serial.write("d".encode('gbk'))
    ser.close()


RGBLight.py:
    实现命令行、配置文件的解析
    很丑,因为没有其它参数。。
   
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3# -*- coding: utf-8 -*-

import json
import sys
import re
import os
from statusLight import StatusLight



# 命令行参数
configF = "statusLight"
sendStr = ""
version = 0.1

    

def errorPrint(string):
    print("eg: exe -send=a")
    print(string)
    print(sys.argv)
    sys.exit(1)

def parseCommandLine():
    ''' 解析命令行参数 '''
    global sendStr, version
    argv = sys.argv
    # configFRex = re.compile("-configF=(.+)")
    sendStrRex = re.compile("-send=(.+)")
    if len(argv) <= 1:
        print("eg: exe -send=a")
        print(f"version: {version}")
        print("Parse CommandLine Error !")
        input("Type any key to exit!")
        sys.exit(1)
        
        
    for n in argv[1:]:    
        stripN = n.strip()
        # res = configFRex.match(stripN)
        # if res:
            # configF = res.group(1)
        res = sendStrRex.match(stripN)
        if res:
            sendStr = res.group(1)
        
    
    if sendStr == "":
        errorPrint("Parse CommandLine Error !")
    
parseCommandLine()

# 加载本地配置文件
if not os.path.exists(configF):
    errorPrint(f"file does not exit: {configF}")
    
config = None
with open(configF, encoding='utf-8') as f:
    config = json.load(f)

s = config['check'].get('s', None)
e = config['check'].get('e', None)
if s is None or e is None:
    errorPrint("parse file fail!")
    
rgb = StatusLight(s, e)
rgb.automaticAddressing()
rgb.write(sendStr)
rgb.close()
sys.exit(0)

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

阳光肥肥 发表于 2021-11-4 18:42
你确定能在ubuntu上跑?我记得linux系统下那个端口名字用COM4是不行的。。。
 楼主| Cool_Breeze 发表于 2021-11-4 20:13
阳光肥肥 发表于 2021-11-4 18:42
你确定能在ubuntu上跑?我记得linux系统下那个端口名字用COM4是不行的。。。

能跑啊。com4 只是表面。
ynboyinkm 发表于 2021-11-4 19:34
zlf2020999 发表于 2021-11-4 19:52
谢谢分享!认真学习!
wqs0987 发表于 2021-11-4 21:00
感谢大佬的无私分享
bennyt 发表于 2021-11-5 00:45
大神来学习了。
jiguang523 发表于 2021-11-5 07:49
向前辈们致敬
rxxcy 发表于 2021-11-5 09:17
串口通信?还是怎么回事
 楼主| Cool_Breeze 发表于 2021-11-5 15:36
rxxcy 发表于 2021-11-5 09:17
串口通信?还是怎么回事

串口通信! 需要 Ubuntu glibc 2.25以上版本!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表