【python读取485串口数据并转存到MySQL数据库】

# -*- coding: utf-8 -*-


from socket import timeout
import serial
import pymysql
import time

t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
# str_return_data = '080328A71342327FA34243B5C8424711DF427FE9624241AB4642053CC342E3F1EB424A340D424D0A6E426E5B00'

def gettime():
    timen=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    return timen

def conn():
    ser = serial.Serial("com3", 9600, timeout = 5)
    # 选择串口,并设置波特率
    send_data = bytes.fromhex('08 03 00 00 00 14 45 5C')
    # hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同
    # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
    # input('Press any key to quit program.')
    while ser.is_open:
        print("port open success")
        ser.write(send_data)
        # 发送命令
        # print('发送数据:', send_data)
        time.sleep(1)
        # 延时,否则len_return_data将返回0,此处易忽视!!!
        len_return_data = ser.inWaiting()
        # 获取缓冲数据(接收数据)长度
        print('len_return_data', len_return_data)
        if len_return_data == 45:
            return_data = ser.read(len_return_data)
            # 读取缓冲数据
            # bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制
            # print('收到数据:', return_data)
            str_return_data = str(return_data.hex())
            # print('收到字符:', str_return_data)
            break
        else:
            print("try again")
            continue
    else:
        print("port open failed")
    print("port closed")
    ser.close()
    return(str_return_data)

def gett(str_return_data):
    for i in range(0,10):
        x = 8*i
        h = str_return_data[x+10:x+14] + str_return_data[x+6:x+10]
        h_b = '{:0>32}'.format(bin(int(h,16))[2:33])
        e = int(h_b[1:9],2) - 127
        # 将整数部分与小数部分分离并分别存在s_int,s_float字符串中
        s_int = '1' + h_b[9:9+e]
        s_float = h_b[9+e:]
        total_int = total_float = 0
        # 整数部分转化为十进制,li为整数部分的长度,记录到整数末尾的长度,结果记在total_int中
        li = len(s_int)
        for c in s_int:
            li = li - 1
            total_int = total_int + int(c)*pow(2,li)
        # 小数部分转化为十进制,lf记录距离小数点的位数,结果记在total_float中
        lf = 0
        for c in s_float:
            lf = lf + 1
            total_float = total_float +int(c)*pow(2,-lf)
        # 小数与整数相加,输出结果,保留4位小数
        t_d = "{:.{}}".format(total_int + total_float, 4)
        t[i] = t_d
    t[10] = gettime()
    return(t)

def insert_data():
    db = pymysql.connect(host='200.100.50.2', port=3306, user='root', passwd='123456', db='shucai')
    cursor = db.cursor()
    insert_t = "insert into lehr(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,times)values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
    cursor.execute(insert_t,t)
    db.commit()
    cursor.close()
    print('成功更新温度数据:', t)
    '''except Exception as e:
        db.rollback()
        print(str(e))
        break'''

def wraps():
    def inner(main):
        while True:
            main()
            print('wait next ^^^')
            time.sleep(59)
            continue
    return inner
    
@wraps()
def main():
    a = conn()
    # a = str_return_data
    gett(a)
    insert_data()

if __name__ == "__main__":  # 起到一个初始化或者调用函数的作用
    main()
 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值