You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++控制器与Python客户端串口奇偶校验配置不匹配未触发异常问题咨询

C++控制器与Python客户端串口奇偶校验配置不匹配未触发异常问题咨询

各位大佬好,我遇到一个串口奇偶校验的诡异问题,想请教下大家的思路:

我这边做的是Microsemi Smartfusion 2板卡(C++控制器,用MSS UART驱动)和Python客户端(Pyserial库,Windows下实际是Win32Serial)之间的串口通信,本来想靠奇偶校验做消息的基础合法性验证,但碰到了不符合预期的情况:

  • 当两端奇偶校验配置一致时(都是无校验、都是奇校验/偶校验),通信完全正常,和预期一致;
  • 但核心问题:当两端配置成不匹配的情况(比如一端设偶校验、另一端设奇校验),通信居然还是正常运行?我本来以为会触发校验错误、通信卡住或者丢帧,但实际消息照样收发、业务逻辑也正常执行,完全没报错。

两边的配置代码:

Python客户端串口初始化:

try:
    self.port = serial.Serial(
        port=self.port_name,
        baudrate=SERIAL_CONSTS.BAUDRATE,
        parity=serial.PARITY_ODD,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=SERIAL_CONSTS.DEFAULT_TIMEOUT
    )

C++控制器UART初始化:

MSS_UART_init(
    &g_mss_uart0,
    UARTParameters::SerialBaudRate_BPS,
    UARTParameters::SerialIFConfig);

对应的配置常量:

const uint32_t SerialBaudRate_BPS = 4000000U;
const uint8_t SerialIFConfig      =
MSS_UART_DATA_8_BITS | MSS_UART_ODD_PARITY | MSS_UART_ONE_STOP_BIT;

补充细节:

  • 我抓了收发的二进制消息,能确认两端发送时的奇偶校验位是符合各自配置的,但接收端就算校验配置不匹配,也照样接收并执行消息;
  • 只有当某一端设为无校验时,才会出现预期的确认错误(看起来是因为消息长度不匹配,接收端直接丢弃了校验位)。

我自己初步想到的排查方向,也想听听大家的建议:

  • 检查UART硬件的校验错误检测是否启用:Smartfusion 2的MSS UART默认可能不会自动处理校验错误,是不是需要手动开启校验错误的中断,或者轮询状态寄存器里的MSS_UART_PARITY_ERROR标志位?毕竟硬件可能不会主动丢弃错误帧,得自己去检查处理;
  • Pyserial的校验处理逻辑:Windows下的Win32Serial可能默认不会上报校验错误,而是默默接收。有没有办法让驱动抛出校验错误?比如检查serial.Serial的framing_error这类属性,或者有没有配置项可以开启错误检测;
  • 高速波特率的影响:我用的是4Mbps的波特率,会不会速率太高导致硬件/驱动的校验错误检测逻辑跟不上?打算降低波特率测试看看;
  • 手动实现应用层校验:如果硬件和驱动层面都不会自动处理校验错误,那可能只能在应用层自己计算每个帧的奇偶校验位,和接收到的对比,自己触发错误处理流程。

备注:内容来源于stack exchange,提问作者Justin Queen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:59:38