用python读取串口值并记录在日志文件中

怎么快速完成1572864次循环?


while i < 1572864:
   start_position = 11   # 起始位置索引从0开始计数
   end_position = start_position + 8    # 结束位置索引加上想要读取的字节数减一
   integer_value = int(string, 16)+16*i   # 将二进制字符串转换为整数
   i=i+1
   # 转换为十六进制,并补齐到8位
   output.Data2 = hex(integer_value)[2:].zfill(8)
   f = int('0178',16)
   s = f + integer_value
   n = s  & 0xFFFF
   output.sum1 = hex(n)[2:].zfill(4)
   output.c = output.a+output.length+output.CLA+output.INS+output.P1+output.P2+output.Lc+output.Data1+output.Data2+output.Le+output.sum1+output.b
   data = bytes.fromhex(output.c)
   ser.write(data)
   res = ser.read(36).hex()
   print(res)
   logging.info(f"输出结果为: {res}")

串口读写速度受限

【以下回答由 GPT 生成】

import logging
import serial

ser = serial.Serial('COM1', 9600)  # 设置串口号和波特率

logging.basicConfig(level=logging.INFO, filename='serial_log.txt', filemode='w', format='%(asctime)s - %(levelname)s - %(message)s')

i = 0

while i < 1572864:
    start_position = 11   # 起始位置索引从0开始计数
    end_position = start_position + 8    # 结束位置索引加上想要读取的字节数减一
    string = ser.read(36).hex()  # 从串口读取36字节的数据,并将其转换为16进制字符串
    integer_value = int(string, 16) + 16 * i   # 将二进制字符串转换为整数
    i = i + 1

    # 转换为十六进制,并补齐到8位
    output.Data2 = hex(integer_value)[2:].zfill(8)
    f = int('0178', 16)
    s = f + integer_value
    n = s & 0xFFFF
    output.sum1 = hex(n)[2:].zfill(4)
    output.c = output.a + output.length + output.CLA + output.INS + output.P1 + output.P2 + output.Lc + output.Data1 + output.Data2 + output.Le + output.sum1 + output.b
    data = bytes.fromhex(output.c)
    ser.write(data)
    res = ser.read(36).hex()
    print(res)
    logging.info(f"输出结果为: {res}")

这段代码中的主要瓶颈在于循环中的串口读写操作,以及日志记录操作。

优化建议如下:

  1. 降低读取操作的频率:可以通过调整循环条件和读取的数据量来减少读取操作的次数。可以参考串口的通信协议来确定合适的读取数据量。

  2. 批量写入日志:每次循环中都进行一次日志记录操作会增加系统开销。可以将需要记录的日志内容先保存在一个列表中,然后在循环结束后使用logging.info一次性写入日志文件。

  3. 使用多线程/多进程:如果可以充分利用计算机的多核处理能力,可以考虑将串口读取和日志记录分别放在不同的线程或进程中,以提高整体的处理速度。

以下是优化后的代码示例:

import logging
import serial
import threading

ser = serial.Serial('COM1', 9600)  # 设置串口号和波特率

logging.basicConfig(level=logging.INFO, filename='serial_log.txt', filemode='w', format='%(asctime)s - %(levelname)s - %(message)s')

i = 0
res_list = []

def read_serial():
    while i < 1572864:
        start_position = 11
        end_position = start_position + 8
        string = ser.read(36).hex()
        integer_value = int(string, 16) + 16 * i
        i = i + 1

        output.Data2 = hex(integer_value)[2:].zfill(8)
        f = int('0178', 16)
        s = f + integer_value
        n = s & 0xFFFF
        output.sum1 = hex(n)[2:].zfill(4)
        output.c = output.a + output.length + output.CLA + output.INS + output.P1 + output.P2 + output.Lc + output.Data1 + output.Data2 + output.Le + output.sum1 + output.b
        data = bytes.fromhex(output.c)
        ser.write(data)
        res_list.append(ser.read(36).hex())

    logging.info(f"输出结果为: {','.join(res_list)}")

read_thread = threading.Thread(target=read_serial)
read_thread.start()
read_thread.join()

上述代码中,串口读取的操作通过read_serial函数在一个独立的线程中执行,当循环结束后,一次性将结果写入日志文件。

请注意,以上代码只提供了一种可能的优化方案,具体的优化策略可以根据具体的需求和环境进行调整。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^