python 串口data_ser.read_until(b"\r\n") 读取 b'\x11\x06\xf5\xda\r\n' 就卡住了
时间: 2023-07-09 18:55:09 浏览: 334
`read_until` 方法会一直等待串口接收到指定的终止符(`b"\r\n"`)后才会返回读取到的数据。如果接收不到终止符,就会一直等待下去,导致程序卡住。
可能的原因有:
1. 没有收到终止符:检查一下发送端是否正确发送了数据,并且包含了终止符。
2. 终止符不正确:检查一下接收端是否正确设置了终止符,以及终止符是否正确匹配。
3. 串口通信参数不正确:检查一下串口通信的波特率、数据位、停止位和校验位等参数是否正确设置,否则可能导致数据接收错误。
建议尝试以下方法:
1. 尝试更换终止符,比如尝试使用 `b"\n"` 或者其他自定义的终止符。
2. 在读取数据之前,先设置一个超时时间,在超时时间内如果没有读取到数据就返回一个空值或者异常。
3. 检查一下串口通信参数是否正确设置,如果不确定可以尝试使用串口调试工具进行调试。
相关问题
def get_data(): ser = serial.Serial('COM3', 9600) data = ser.readline() if data: print(data) ser.close() return data返回的数据为ST,GS, 0.248 kg,怎么更改返回数据为数值
可以使用字符串的切片和类型转换来提取数值部分并将其转换为浮点数。例如,可以使用以下代码:
```python
def get_data():
ser = serial.Serial('COM3', 9600)
data = ser.readline()
if data:
print(data)
# 提取数值部分并转换为浮点数
weight_str = data.split(b',')[2].split(b' ')[1]
weight = float(weight_str)
print("Weight:", weight)
ser.close()
return weight
```
这里假设返回的数据格式为 "ST,GS, 0.248 kg",其中数值部分为第三个逗号后面的字符串,需要先使用 `split()` 方法将其分割成列表,再提取数值部分并使用 `float()` 函数将其转换为浮点数。最后返回浮点数值。
def outliers_proc(data, col_name, scale = 3): # data:原数据 # col_name:要处理异常值的列名称 # scale:用来控制删除尺度的 def box_plot_outliers(data_ser, box_scale): iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25)) # quantile是取出数据对应分位数的数值 val_low = data_ser.quantile(0.25) - iqr # 下界 val_up = data_ser.quantile(0.75) + iqr # 上界 rule_low = (data_ser < val_low) # 筛选出小于下界的索引 rule_up = (data_ser > val_up) # 筛选出大于上界的索引 return (rule_low, rule_up),(val_low, val_up) data_n = data.copy() data_series = data_n[col_name] # 取出对应数据 rule, values = box_plot_outliers(data_series, box_scale = scale) index = np.arange(data_series.shape[0])[rule[0] | rule[1]] # 先产生0到n-1,然后再用索引把其中处于异常值的索引取出来 print("Delete number is {}".format(len(index))) data_n = data_n.drop(index) # 整行数据都丢弃 data_n.reset_index(drop = True, inplace = True) # 重新设置索引 print("Now column number is:{}".format(data_n.shape[0])) index_low = np.arange(data_series.shape[0])[rule[0]] outliers = data_series.iloc[index_low] # 小于下界的值 print("Description of data less than the lower bound is:") print(pd.Series(outliers).describe()) index_up = np.arange(data_series.shape[0])[rule[1]] outliers = data_series.iloc[index_up] print("Description of data larger than the lower bound is:") print(pd.Series(outliers).describe()) fig, axes = plt.subplots(1,2,figsize = (10,7)) ax1 = sns.boxplot(y = data[col_name], data = data, palette = "Set1", ax = axes[0]) ax1.set_title("处理异常值前") ax2 = sns.boxplot(y = data_n[col_name], data = data_n, palette = "Set1", ax = axes[1]) ax2.set_title("处理异常值后") return data_n代码每一行解析
这是一个用于处理异常值的函数,其输入为原始数据、要处理异常值的列名称和处理异常值的尺度。函数内部定义了一个嵌套函数 box_plot_outliers,用于通过箱型图的方法找出异常值的索引,并返回删除异常值后的数据、删除的样本数、小于下界的值的描述统计和大于上界的值的描述统计。主函数中先将原始数据复制到一个新的变量 data_n 中,然后取出要处理的列数据 data_series,调用 box_plot_outliers 函数找到要删除的异常值的索引,再根据索引从 data_n 中删除异常值,并重新设置索引。最后,将处理前后的箱型图绘制出来,返回处理后的数据。
阅读全文