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')
对程序注释说明:
- 可以用bytes来定义8位数据串
- struct.unpack('f', struct,pack('4b', *vx))将4字节的浮点数转换成python的浮点数。
- 如果在c语言中会使用sprintf(svy, "%.2f", vy); 但是用python就变得非常简单了,只使用一个是svy = %.2f" %vy就可以完成这个转换,方便。
- entry的delete的应用。使用(0, END)将entry的内容全部清除
总结
python的tkinter做简单的HMI方便,免费,非常实用。