如何使用pyserial和python从com端口读取多个值?

问题描述

我有一个 STM32 连接到一个热传感器,它指示房间的温度,我编写了这个程序来从我的 com 端口读取这个温度。现在我需要一个程序来从我的 com 端口读取多个值。 谢谢你帮我解决这个问题。

import serial

serport = 'COM3'
serbaudrate = 38400
ser = serial.Serial(port = serport,baudrate = serbaudrate,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,timeout=2)
try:
    ser.isopen()
except:
    print("Error")
    exit()

if ser.isopen():
    try:
        while 1:
            if ser.inWaiting() > 0:
                #print(ser.readline())
                response = ser.readline()
                print(response.decode("utf-8"))

            else:
                ser.write(b"1")
    except Exception as e:
        print(e)

@Tarmo 感谢您回答我的问题。这是我为微控制器编程编写的代码

while (1)
      {
  // Test: Set GPIO pin high
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);

    // Get ADC value
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
    raw = HAL_ADC_GetValue(&hadc1);
    raw = ((raw*0.000244*3.3) - 0.25)/0.028;
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_RESET);

    // Convert to string and print
    sprintf(msg,"%hu\r\n",raw);
    HAL_UART_Transmit(&huart2,(uint8_t*)msg,strlen(msg),HAL_MAX_DELAY);
    // Pretend we have to do something else for a while
    HAL_Delay(100);  
    }

在这种情况下,我只读取一个值,因为热传感器只给出一个值。如果我有多个值,我如何用分号分隔它们?

解决方法

如果您已经采用了将数值作为文本发送的方式,则可以扩展它。假设您想同时发送 3 个整数值,只需用分号分隔它们。例如。 123;456;789\n

然后您的微控制器应该以这种格式输出数据,并且您的 Python 程序可以像现在一样读取整行。您可以使用正则表达式将此行解析为单个值:

import re
...
    response = ser.readline()
    needles = re.match("(\d+);(\d+);(\d+)",response)
    if needles:
        print("Got: {} {} {}".format(needles[0],needles[1],needles[2]))

,

假设您有 3 个来自 ADC 的值,分别位于变量 raw1raw2raw3。然后您可以使用 sprintf() 来格式化包含所有这些的消息,并使用 Tarmo 的建议来阅读它们。

sprintf(msg,"%hu;%hu;%hu\r\n",raw1,raw2,raw3);

请在变量 msg 中提供足够的内存。