问题描述
我有一个 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 的值,分别位于变量 raw1
、raw2
和 raw3
。然后您可以使用 sprintf()
来格式化包含所有这些的消息,并使用 Tarmo 的建议来阅读它们。
sprintf(msg,"%hu;%hu;%hu\r\n",raw1,raw2,raw3);
请在变量 msg
中提供足够的内存。