线程1发出信号,线程2进行判断(判断有没有收到包),然后解码(10进制转16进制含浮点数),写数据库,需要代码
import copy
import threading
from PyQt5.QtCore import pyqtSignal, QObject
from Sql import sql
import time
import traceback
from FormatConvert import FormatConvert
class myThread2 (QObject,threading.Thread):
DataReady_recv = pyqtSignal(list)
def __init__(self, name):
QObject.__init__(self)
threading.Thread.__init__(self)
self.name = name
#数据库
self.sql=sql()
self.FormatCon = FormatConvert()
def data_decoding(self,data1):
write_data=[]
print("接收到数据:"+data1)
table_name='device_info'+data1[0:1]
disu = self.FormatCon.int64_to_float(int(data1[2:10],16))
write_data.append(disu)
yuliang = self.FormatCon.int64_to_float(int(data1[11:19], 16))
write_data.append(yuliang)
if data1[-2:] == '01':
status = "正常"
else:
status = "异常"
write_data.append(status)
self.sql.insert_device_info_table(table_name,write_data)
#self.data2=[{'node': '2', 'lon': 114.4198, 'lat': 30.5186}, {'node': '2', 'lon': 114.4198, 'lat': 30.5186}]
def run(self):
while True :
#收到数据了
print()
#这里进行判断
if __name__ == "__main__":
#这里进行解码,写数据库(类似下面这个)
thread1=myThread2("thrad2")
print(".....1")
# thread1.creatable(s)
s2={'node_name': 'lora_node3', 'data': 'AAAA0312013BD1E442BC34F441CDCC4C3DDA5555'}
s={'node_name': 'lora_node18', 'data': '"/a14FBbBQKgS/lora_node18/user/update"\r\nAAAA03250214021B1021101327E1BFD78D7ABE952BF64003B9FB430550A23FD792FC43641EA141E4BD75403F3BD1E442BC34F4414C5555'}
s3 = {'node_name': 'lora_node18',
'data': '"/a14FBbBQKgS/lora_node18/user/update"\r\nAAAA03020215030C0E2001410BBE3E752F85BEC2DC87C2FC8A3DC10000000000000000073B8D4133698640BA5555'}
s4={'data': 'AAAA03020215030C0E1F345960BD3E76CC00BF4E5B75C2DA0745C10000000000000000073B8D41997486403F55',
'node_name': 'lora_gateway'}
s5={'data': 'AAAA03020215030C0E1F36E0FEBB3ECA6E00BF289684C212FD42C10000000000000000073B8D41A46B8640AB55',
'node_name': 'lora_gateway'}
thread1.data_check(s5)
thread1.data_decoding(s3)
可以使用线程同步机制来实现线程1和线程2之间的通信,并使用适当的算法来完成十进制到十六进制的转换,包括浮点数的转换。
一种可能的实现方式如下:
在线程1中,使用信号量或条件变量来通知线程2有新的包需要处理。当线程1发送信号时,它可以将包的数据存储在共享的缓冲区中。
在线程2中,等待信号量或条件变量的触发,以判断是否有新的包需要处理。如果有,它可以读取缓冲区中的数据,并进行解码。
对于十进制转换为十六进制的部分,可以使用标准的算法来实现,如除以16取余数并逆序排列。对于浮点数的转换,可以使用IEEE 754标准中的算法来实现。
可以使用共享内存或者其他线程间通信机制来进行线程之间的数据传输和共享。
需要注意的是,线程同步和共享数据可能会导致一些并发问题,例如竞态条件和死锁。因此,在设计和实现多线程程序时,需要仔细考虑并发问题,并使用适当的同步机制来确保线程安全。