武汉公司注册核名aso优化方法
Python4字节浮点数读取
- 背景
- 读取4字节的浮点数
- 总结
背景
用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));
然后向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'
其中的msg[14], msg[15], msg[16], msg[17]是一个浮点数,要在HMI的页面上显示
下面是代码:
def tcp_read(para='hi', sleep=1.0):while True:global stop_threadsif stop_threads:breaktime.sleep(sleep)if ( bConnect == True):try:msg = tcp_client.recv(512)print(len(msg))if ( len(msg) > 0 ):vx = [c_byte(msg[14]).value,c_byte(msg[15]).value,c_byte(msg[16]).value,c_byte(msg[17]).value]vy = struct.unpack('f', struct.pack('4b', *vx))[0]e4.delete(0, END)svy = "%.2f" %vye4.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')
对程序注释说明:
- c_byte(msg[14]).value是将msg[14]的内容转换成带有±的8位数,也就是有符号字节数。signed char
- 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方便,免费,非常实用。