python后端:UART先设置为双工再设为仅发送,下载工程时报错
原始代码
if item["status"] != "DISABLE" and item["pin"]:
#需要新增GPIO记录
pinParamDict = PinConfigManager.BuildPin(item)
PinConfigManager.CreateObject(project_id=project_id,
pin_number=int(item["pin"]),
peripheral=item["enablePeripheral"],
config=item["config"],
status=item["status"],
pin_param=pinParamDict)
elif item["status"] == "DISABLE" and item["pin"]:
#需要删除GPIO记录
PinConfigManager.DeletePara(pin_number=int(item["pin"]),
project_id=project_id)
item参数
{
"ret": True,
"pin": 9,
"status": "PERIPH",
"config": "LPUART0_TX",
"peripheral": "GPIOA_3",
"enablePeripheral": "LPUART0",
"disablePeripheral": None,
"beforConfig": "LPUART0_TX",
"mode": "DIGITAL",
"remap": True,
"haspin": True
}
PinConfigManager.BuildPin函数
@staticmethod
def BuildPin(pin,extern_member = None):
def swap(bool,extern_member):
if bool:
return "FL_ENABLE"
else:
return "FL_DISABLE"
if pin["ret"] == True and pin.get("haspin",False) is not True:
mypin = deepcopy(PIN_TEMP)
port, pinnum = pin["peripheral"].split("_")
mypin["GPIO_Type"] = port
mypin["FL_GPIO_InitTypeDef"]["pin"] = "FL_GPIO_PIN_"+pinnum
mypin["FL_GPIO_InitTypeDef"]["mode"] = MODE_TEMP[pin["mode"]]
mypin["FL_GPIO_InitTypeDef"]["remapPin"] = swap(pin["remap"],extern_member)
mypin["FL_GPIO_InitTypeDef"]["pull"] = swap(False,extern_member)
ext = EXTERN_GPIO.get(extern_member,False)
if ext:
mypin["FL_GPIO_InitTypeDef"][ext["member"]] = ext["defaultval"]
return mypin
else:
return None
问题分析
如果先启用双工,再改为仅发送,则其中一个GPIO是有记录的,此时item中haspin=True,到PinConfigManager.BuildPin中发现haspin为True,返回None,结果把数据库记录中的pin_parm值替换为了None,导致回传GPIO信息和下载工程过程python端报错。
解决方案
增添判断条件来确定是否要新增GPIO记录
if item["status"] != "DISABLE" and item["pin"]:
改为
if item["status"] != "DISABLE" and item["pin"] and item.get("haspin", False) == False: