TCPServerClient之嵌入式软件调试Python3

嵌入式软件需要测试软件进行测试

从使用场景中寻找痛点,挖掘场景中的智能硬件需求。嵌入式开发针对实际之问题,提出对应的解决方法。单独的产品针对应用场景在供电、电磁兼容性以及IP防护等级的要求下,对支持的功能进行梳理,在低成本和短开发周期的要求下,进行原理总图纸的敲定以及主要芯片器件的选型。
硬件原理确定之后,软件就可以针对主控芯片以及各个功能子系统编写对应的驱动级别软件,这部分作为嵌入式软件中相对基础的部分,在PCBA出来之后就可以进行调试。编写初始化和简单独立的控制逻辑就可以进行调试,作为验证原理以及板图的手段。这部分"测试"不是我们本片要讲的测试。
本片要讲的测试,主要是针对智能硬件(是将板子装到外壳里)在实际的应用场景的测试。首先,冷冰冰的硬件之所以称为智能硬件,不是因为我们能够驱动一些子系统完成一些功能,或者是将某种协议转换另一种协议进行透传,而是是因为嵌入式软件针对需求,针对使用场景,完成了一些业务逻辑上的实现以及优化,而这部分软件,是需要实际的业务使用才得以验证是否没有问题,越是深入行业的设备,这部分代码在总工程的比重越重。其次,有很多功能子系统(诸如射频),周围环境对其的影响颇大,需要调整驱动部分的代码来改变参数适应环境,甚至需要芯片的选型以及硬件的原理来达到要求。
嵌入式软件的测试软体不宜太庞大,用java或者c#或者Qt编写一个针对整个产品线的测试平台这是可以理解的,但是针对深埋某个业务场景中的智能硬件,就显得有些臃肿。于是,使用Python这种功能强大且跨平台的脚本语言,无论应对产品的测试,甚至是产品的功能演示,都能很好的完成。

Ptyhon环境的搭建

这里专门说一下Python环境的搭建,是因为这里边涉及一个Python2与Python3同时使用的问题。Python2与Python3在很多地方都不太一样,我以前的大部分测试程序都用的Python2来编写,但是Python3的库使用起来更加简单,所以新的测试程序我就是在用3在写。
以前的开发用的是VSCode代码编辑器来写Python的,下载安装的是Python2.7。在换3的时候发现了一个专门针对Pyhon的集成开发环境PyCharm,下载以及简单的使用教程见链接: PyCharm。这里专门说一下针对两种不同版本解释器的选择:点击File目录下边的Settings,选择左侧Project:Python_Project栏中的Project Interpreter,可以切换工程的解释器,值得一提的是编译器自带Python3的解释器:切换解释器

TCPServer+Client Python3实现

下面贴的代码是用Python3写的TCP服务器以及TCP客户端的实现代码,里边掺杂了一点业务,都是收到了特定的字节流将业务名称以及接收的时间打印了出来。详细的内容见代码。

import socketserver
import time
from socket import *
import multiprocessing
import struct
import os
import datetime

lhost = '192.168.1.100'
lport = 1008
laddr = (lhost, lport)
lbufsize = 1024




# 将字符串转化为16进制数
def str_to_hex(s):
    s = s.split(' ')
    send_buf = b''
    for i in range(len(s)):
        # print(s[i])
        send_buf += struct.pack('B', int(s[i], 16))
    return (send_buf)


# 自定义类来实现服务器通信处理
class MyTCPHandler(socketserver.BaseRequestHandler):
    # 必须写入handle方法,建立链接时会自动执行handle方法
    def handle(self):
        flag = 0;
        t = time.time()
        nnowTime = lambda: int(round(t * 1000))
        while True:
            try:
                data = self.request.recv(1024)
                if not data: break
                nowTime = nnowTime();
                temptime = "%s" % (nowTime);
                # temptime = time.strftime( '%Y-%m-%d-%H-%M-%S', time.localtime( time.time() ) )
                for i in range(len(data)):
                    if (data[i] == 0x02 and data[i + 1] == 0x92):
                        LocalAddr = " %x%x " % (data[i - 2], data[i - 1]);
                        if (data[i + 2] == 0x01):
                            print(temptime + ',Light Up' + LocalAddr)#光电触发
                        elif (data[i + 2] == 0x00):
                            print(temptime + ',Light Doen' + LocalAddr)#光电移开
                        else:
                            print(temptime + ',Error')

                self.request.send(data.upper())
            except ConnectionResetError:
                break
        self.request.close()

#客户端进程
def run_proc(name):
    tcpClient = socket(AF_INET, SOCK_STREAM)  # 这里的参数和UDP不一样。
    tcpClient.connect(laddr)  # 由于tcp三次握手机制,需要先连接

    ldata = "00 36 0F 02"  # 设置自适应功率
    ldata = str_to_hex(ldata)

    # tcpClient.send(b"\x01\x02\x03\x03")#设置功率
    # tcpClient.send( b"\x01\x02\x03\x04" )#设置功率

    tcpClient.send(ldata)
    DataTime = 0

    while True:

        data = tcpClient.recv(lbufsize)
        # temptime = time.strftime( '%Y-%m-%d-%H-%M-%S', time.localtime( time.time() ) )
        t = time.time()
        nowTime = lambda: int(round(t * 1000))

        int(round(t * 1000))
        for i in range(len(data)):
            if (data[i] == 0x01 and data[i + 1] == 0x02 and data[i + 2] == 0x03):  # 记录读到标签的时间
                DataTimeOn = nowTime();
                formated_str = "%s" % (DataTimeOn);
                print(formated_str + ',Lebal Found')
            elif (data[i] == 0x01 and data[i + 1] == 0x02 and data[i + 2] == 0x04):  # 记录没有读到标签的时间
                DataTimeOff = nowTime();
                formated_str = "%s" % (DataTimeOff);
                print(formated_str + ',Lebal Not Found')

    tcpClient.close()


if __name__ == '__main__':
    p = multiprocessing.Process(target=run_proc, args=('1',))
    p.start()
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 1234), MyTCPHandler)
    server.serve_forever()  # 链接循环
    p.join()

正所谓磨刀不误砍柴工,这部分的代码我一个经常不用Python的人查查资料,写起来也就1个小时左右,如果使用网口助手+execl记录这些时间,当次数多起来的时候就会体现出这种测试脚本的优势。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章