• Python读取TCP的4字节浮点数


    Python4字节浮点数读取

    背景

    用Python的tkinter开发人机界面。机器是MCU的无线服务器端。Python程序为Client,连接MCU TCP server。client发送21个字节帧。按modbusTCP发送。为提高通讯效率,server端在接到client发送来的8位的数据串后给client发送MCU的运行数据。在server端要解释4个字节的浮点数。

    读取4字节的浮点数

    MCU端,用

    memcpy(&txBuff[14], &fMeterValue, sizeof(MeterValue));
    
    • 1

    然后向client发送一串字节。
    在python程序侧,一般是要建立一个独立的线程来接收从server发送来的数据。比如,我们从server端读取了下面的一串字节:

    b'\x00\x00\x00\x00\x00\x00\x19\x01\x10\x00d\x00\t\x12\x8f\xc2\xd5\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    
    • 1

    其中的msg[14], msg[15], msg[16], msg[17]是一个浮点数,要在HMI的页面上显示

    下面是代码:

    def tcp_read(para='hi', sleep=1.0):
        while True:
            global stop_threads
            if stop_threads:
                break
            time.sleep(sleep)
            if ( bConnect == True):
                try:
                    msg = tcp_client.recv(512)
                    print(len(msg))
                    if ( len(msg) > 0 ):
                        vx = bytes([msg[13], msg[14], msg[15], msg[16]])
                        vy = struct.unpack('f', vx)[0]
                        e4.delete(0, END)
                        svy = "%.2f" %vy
                        e4.insert(0, svy)
                        #print(msg)
                        print('The meter = %.2f' %vy)                                 
                except Exception as e:
                    print('time out')
                    logging.debug(e)
        print('Thread 2 end\r\n')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    对程序注释说明:

    1. 可以用bytes来定义8位数据串
    2. struct.unpack(‘f’, struct,pack(‘4b’, *vx))将4字节的浮点数转换成python的浮点数。
    3. 如果在c语言中会使用sprintf(svy, “%.2f”, vy); 但是用python就变得非常简单了,只使用一个是svy = %.2f" %vy就可以完成这个转换,方便。
    4. entry的delete的应用。使用(0, END)将entry的内容全部清除

    总结

    python的tkinter做简单的HMI方便,免费,非常实用。

  • 相关阅读:
    vue3 的 ref、isRef、toRef、toRefs、toRaw 详细介绍
    python 生成器
    RFID基础知识,都学会了吗
    mysql中的case when 与 if else
    Android 12.0 hal层添加自定义hal模块功能实现
    mysql 插入sql语句,把当前时间格式话到时分秒 yyyy-MM-dd
    OpenHarmony、HarmonyOS、HarmonyNext互相兼容吗?
    MySQL流程控制函数
    测试流程规范
    信息学奥赛一本通:1162:字符串逆序
  • 原文地址:https://blog.csdn.net/weixin_44481398/article/details/132783083