如何使用带有 python 的 pyserial 从 com 端口读取多个值?
how to read multiple values from com port using pyserial with python?
我有一个 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_10, 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 的值,分别在变量 raw1
、raw2
和 raw3
中。然后你可以使用 sprintf()
将它们全部格式化为一条消息,并使用 Tarmo 的建议来阅读它们。
sprintf(msg, "%hu;%hu;%hu\r\n", raw1, raw2, raw3);
请在变量 msg
中提供足够的内存。
我有一个 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_10, 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 的值,分别在变量 raw1
、raw2
和 raw3
中。然后你可以使用 sprintf()
将它们全部格式化为一条消息,并使用 Tarmo 的建议来阅读它们。
sprintf(msg, "%hu;%hu;%hu\r\n", raw1, raw2, raw3);
请在变量 msg
中提供足够的内存。