Python读取TCP的4字节浮点数

Python4字节浮点数读取

背景

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

读取4字节的浮点数

在MCU端,用

cpp 复制代码
memcpy(&txBuff[14], &fMeterValue, sizeof(MeterValue));

然后向client发送一串字节。

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

cpp 复制代码
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'

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

下面是代码:

cpp 复制代码
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. 可以用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方便,免费,非常实用。

相关推荐
星越华夏10 小时前
python——三角函数用法
开发语言·python
gmaajt10 小时前
mysql如何检查数据库表是否存在损坏_使用CHECK TABLE命令修复
jvm·数据库·python
heRs BART11 小时前
【Flask】四、flask连接并操作数据库
数据库·python·flask
PyHaVolask11 小时前
Python 爬虫进阶:直接请求 JSON 接口与开发者工具使用
爬虫·python·请求头·反爬·json接口·chrome开发者工具
larance11 小时前
安装dify的几个问题
python
2301_7735536211 小时前
CSS如何对用户访问过的链接进行降级颜色处理_使用-visited伪类改变颜色
jvm·数据库·python
2301_8152795211 小时前
Golang怎么理解Go的sync.Pool底层_Golang如何理解Pool的本地缓存和GC清理机制【详解】
jvm·数据库·python
2301_7641505611 小时前
MySQL迁移过程如何避免数据不一致_利用强一致性备份方案
jvm·数据库·python
m0_7164300711 小时前
Redis如何处理预热失效引起的开局雪崩
jvm·数据库·python
m0_3776182311 小时前
c++文件锁使用方法 c++如何实现多进程文件同步
jvm·数据库·python