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
相关产品推荐
相关产品推荐

