ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于EB Tresos的芯驰E3118 UART配置实战与排障指南

基于EB Tresos的芯驰E3118 UART配置实战与排障指南 最近拿到一个以芯驰E3118为主控的项目需要把调试串口、蓝牙模组、外部传感器三路UART在MCAL层全部配好。说实话E3118本身是一颗不错的车规级芯片性能外设都够用但MCAL配置这块的中文实战资料是真的少网上搜来搜去大多是英飞凌TC3xx的EB Tresos配置教程直接照搬又对不上号只能自己对着工具和手册一点点试。这篇把我这次从EB Tresos建工程、导入MCAL包、配时钟树、算波特率到最后串口收发跑通的完整过程记录下来包括踩坑之后的排查思路希望能帮后面做E3118的朋友少走弯路。不管你是第一次接触MCAL还是从英飞凌TC3xx平台转过来这篇应该都能对上你的需求。1. E3118的UART配置为什么不能只盯着Uart模块看1.1 先搞清楚MCAL里的配置到底配的是什么很多人第一次打开EB Tresos会被一整面配置界面吓到觉得MCAL配置就是在填表格照着教程一步一步点就行了。我早几年也是这么干的但后来发现不明白背后的硬件逻辑填表基本等于碰运气。MCAL在AUTOSAR架构里的位置说白了就是芯片硬件和上层软件栈之间的适配层。你在配置工具上把一个下拉框从Disabled改成Enabled本质上是在决定某个芯片寄存器的某一个bit复位后被写0还是写1。配置工具只是把这些操作翻译成了C代码真正干活的是寄存器。所以配置MCAL之前建议先把E3118的芯片参考手册里UART外设那一章至少翻一遍。不用全部背下来但有三块必须看时钟来源、寄存器描述、引脚复用表。这三块决定了你后面在工具里做的所有选择。拿点菜来类比的话配置界面就像菜单MCAL把菜做成固定套餐而芯片手册是后厨的菜谱。你只有知道菜谱大概长什么样才能跟服务员准确描述你的需求不然端上来的菜跟你想象的不是一回事。1.2 三个模块一条链路时钟、引脚、协议在E3118的MCAL配置里配UART从来不是只配Uart一个模块的事。至少Mcu、Port、Uart三个模块要一起动手三者有严格的前置依赖关系。先看Mcu模块它负责整颗芯片的时钟树、电源模式和低功耗管理。UART外设自己不产生时钟它需要从时钟树上挂下来一路时钟信号这条路通不通取决于Mcu模块里时钟源、PLL、分频器的配置有没有打通。再看Port模块UART的TX/RX信号不是凭空从芯片里冒出来的它要经过引脚复用逻辑最终接到某一个物理引脚上。同一个物理引脚往往可以复用好几个外设功能你得在Port模块里显式地把这个引脚配成UART功能否则UART模块就算把数据发出来了信号也到不了外面的引脚。最后才是Uart模块在时钟和引脚都准备好的前提下设置波特率、数据位、停止位、校验位、FIFO深度、中断使能这些协议层面的参数。用一个简单的类比Mcu_Init是接通电源和水管Port_Init是决定水龙头装在哪个接口上Uart_Init是设置水温和流量。光拧开水龙头不接水管水是出不来的光接水管不开阀门一样没水。1.3 UART协议本身的理解决定后面怎么填参数UART是异步串行通信意味着收发双方之间没有独立的时钟线。没有时钟线双方就必须提前约定好一个节奏也就是波特率。为了对得上节奏协议定义了电平变化的格式空闲状态下TX线保持高电平要发一个字节时先把电平拉低一个bit时间这个低电平称为起始位接着按位输出数据低位在前通常是8个bit最后拉高电平一个bit时间作为停止位。这里要提一个东西就是行业里常说的16550标准UART。当年PC上用的16550芯片定义了一套寄存器和帧格式的基本框架后来的绝大多数MCU片上UART外设都沿用了这个思路。E3118的UART寄存器组织也跳不出这个套路配置项大体对应着波特率分频寄存器、行控制寄存器管数据位/停止位/校验、FIFO控制寄存器、中断使能寄存器这几类。理解了这套框架打开E3118的MCAL配置界面时你会觉得每个配置项都有迹可循而不是一堆陌生的英文名词。同理后面调波形时要看的电平变化起始位是低电平数据位LSB first停止位是高电平。这些理解和MCAL配置里的波特率、帧格式设置是直接对应的。2. EB Tresos环境准备从安装到导入E3118 MCAL包的完整过程2.1 版本匹配EB Tresos和MCAL包别乱搭EB Tresos是Elektrobit家的AUTOSAR配置工具界面就是一套基于Eclipse的IDE。这个工具本身版本很多不同版本对应的插件机制和生成器版本都不一样而芯驰官方的MCAL开发包一般会标明它基于哪个EB版本。装之前一定先查清楚版本要求这一点相当重要。之前看到有同事装了最新版的EB Tresos回头导入芯驰的MCAL包之后插件配置界面里死活找不到E3118的芯片型号。折腾了大半天最后查到MCAL包要求的EB版本比他装的旧一两个版本换了对应版本后一次通过。另外编译器和调试器也要留意。MCAL包里的Demo工程一般会指定编译器版本常见的GCC、Tasking都会遇到版本匹配问题。如果你本机装了多个编译器记得在工程属性里把编译工具链的路径指对。工程构建时报出各种看不懂的诡异错误十有八九是编译器版本和工程默认配置不匹配导致的。2.2 导入MCAL包与新建工程的实操步骤芯驰的MCAL包拿到手之后通常是一个压缩包解压后里面自带示例工程和文档。这类包的目录结构一般会分MCAL、Examples、Doc几个部分。建议先阅读包里的README或者Release Notes确认版本匹配关系。具体步骤大概是这样的安装EB Tresos安装完成后先激活License。没有License的话工具能打开但无法生成代码。解压芯驰MCAL开发包找到示例工程目录。打开EB Tresos通过File - Import - Existing Projects into Workspace把示例工程导入。如果MCAL包以插件形式提供则需要通过Help - Install New Software配合本地插件包路径安装。导入完成后在工程配置界面中能看到可配置模块列表Mcu、Port、Uart、Gpt、Dio等。新建工程或切换芯片型号时在芯片选择界面里选E3118。如果列表里找不到E3118说明芯片支持包没有正确加载。打开配置界面找到Uart模块开始按需求配置。导入之后我建议第一件事不是改配置而是先编译一版Demo工程确认工具链能跑通。这一步的意义在于把环境问题先排除掉。后面如果改了配置发现有问题至少能确定不是环境的问题而是配置或参数的问题。省得后面绕一大圈又绕回来查工具。2.3 英飞凌TC3xx玩家迁移过来的几个注意点如果你之前按英飞凌TC275或TC397的流程配过MCAL那么对EB Tresos的操作应该不会陌生。芯驰的MCAL同样跑在EB Tresos环境里整体交互逻辑是同一套网上英飞凌的教程也完全可以用来理解工具操作。但几个差异点要心里有数。对比项英飞凌TC3xx芯驰E3118MCAL包来源英飞凌官网/代理商芯驰官方/芯片代理商芯片选择列表TC3xx系列E3系列时钟树命名SCU/CCU等时钟节点芯驰自有命名体系中断控制器配置ARM NVIC或英飞凌中断路由器需要按E3118手册确认外设寄存器名称英飞凌定义芯驰定义注意别混用核心逻辑是相通的英飞凌的教程用来理解EB Tresos操作流程完全够用但参数值一定要拿E3118的手册对照不要直接抄。比如同一个波特率计算功能英飞凌的时钟源频率可能默认是100MHzE3118的可能默认是80MHz公式一样但数值完全不同直接抄的话波特率误差会很大。3. UART模块核心配置项拆解时钟、波特率、帧格式、FIFO与引脚3.1 时钟链路Mcu模块配置决定UART能否工作UART模块本身不产生时钟。它从时钟树上拿一路时钟信号把这路时钟经过分频后产生发送接收的bit时钟。这路时钟的来源和频率是在Mcu模块里配置的。在EB Tresos中打开Mcu模块一般能看到时钟源选择PLL、外部晶振等各种PLL倍频分频系数以及外围总线的时钟分配关系。需要根据E3118手册里的时钟树图找到UART外设挂在哪一条总线上然后把对应的时钟使能位打开设置好期望的频率。讲一个实际操作经验配置时钟树之前建议先在纸上把时钟树画一遍从晶振频率开始经过哪个PLL分频多少到哪条总线再到UART外设每一步的频率都标出来。后面排错的时候这张纸比什么都有用。MCAL配置界面里的选项非常多很容易点了一圈之后忘了自己把哪路时钟关掉了。有了这张图每个配置项对应树上哪个节点一目了然。另外要注意如果UART外设所在的时钟域没有上电或者时钟门控没有打开Uart_Init执行时写入的分频寄存器实际不会生效因为外设压根没有时钟脉冲。这种问题在MCAL配置里不报错表现形式就是串口完全没有输出排查起来很容易走弯路。3.2 波特率计算分频系数和误差评估波特率是UART配置里最容易被差不多心态坑掉的参数。经典16550架构中接收器会用一个16倍波特率的时钟去采样接收线上的每一位也就是说波特率等于UART外设时钟频率除以16再除以一个分频系数。换算一下就是波特率 外设时钟频率 / (16 × 分频系数)举例来说假设E3118给UART提供的时钟是80MHz目标波特率是115200。分频系数N 80,000,000 / (16 × 115,200) ≈ 43.4许多UART的分频系数是整数取43去算实际波特率 80,000,000 / (16 × 43) ≈ 116,279误差 (116,279 - 115,200) / 115,200 ≈ 0.94%异步通信里收发双方波特率误差一般要求控制在±2%以内短帧情况下0.94%是可以接受的实际跑起来也稳。但如果目标波特率是921,600呢再算一下N 80,000,000 / (16 × 921,600) ≈ 5.43取5的话实际波特率是1,000,000误差8.5%取6的话实际波特率是833,333误差9.6%。这两个都远远超过了±2%的范围通信会不稳定甚至完全不通。这种时候怎么做要么换一个时钟源频率让分频系数更接近整数要么用支持分数分频的UART外设有些芯片的UART支持半步进甚至更细的分频可以显著逼近目标波特率要么干脆降低目标波特率选一个当前时钟下误差最小的档位。所以在MCAL配置界面里填目标波特率时工具通常会自动计算分频系数但你一定要看一眼实际计算出来的波特率和误差。别把配置了921600当成实际就是921600。3.3 数据帧格式与流控数据位、停止位、校验位这三个选项决定了串口帧的具体结构。最常见的是8数据位、1停止位、无校验也叫8N1。大多数串口设备默认用这个格式。为什么默认8N1因为一个字节正好是8bitASCII字符、二进制数据都能直接塞进去。无校验省掉了额外处理也避免了校验位不匹配带来的误判。1位停止位在大多数板级短连线场景下足够可靠了。但也有一些场景不是8N1比如老式工业仪表可能要7E17数据位、偶校验、1停止位某些设备要求2位停止位。这类参数完全取决于对端设备的数据格式约定配置之前第一件事是和对方确认协议格式而不是自己定。硬件流控这一项容易被忽略。RTS/CTS流控用的是额外的两根信号线配置时不仅要在Uart模块里把流控打开还要保证Port模块把RTS/CTS引脚的复用功能同时配好。如果不使用流控RTS/CTS引脚可以做别的用途。有朋友遇到过这种怪现象MCAL包里流控选项没有显式配成None默认走了自动流控逻辑结果接收端一直检测不到CTS引脚的电平变化整个链路直接卡死不出数据。所以不用流控的时候一定在Uart模块里明确把流控类型设为None。3.4 FIFO、中断与DMA三种收发模式怎么选E3118的UART外设通常带发送和接收FIFOFIFO能在一定程度上缓存数据减小软件响应不及时造成的数据丢失。MCAL配置里需要设置FIFO深度、触发阈值、中断使能这些参数。收发方式一般有三种选择按场景来定轮询每次发送前死等发送保持寄存器空接收时循环去读状态寄存器。代码简单逻辑直观但极其占用CPU。适合调试串口这种低频场景不适合跑业务。中断接收FIFO中的数据达到设定的触发阈值时产生一次UART中断在中断服务程序里把数据搬走。这是实际项目里用得最多的方式实时性好CPU占用也不高。要注意的是中断服务程序里动作要快尽量只做数据搬移不要做复杂的业务处理。DMA数据量很大的时候UART和内存之间可以直接走DMA搬运CPU全程不用管。虽然吞吐量高CPU占用最低但链路更长要额外配置DMA模块、中断优先级、传输完成中断等排查问题的复杂度也更高。一个实际建议调试串口用轮询就够了和蓝牙模块或者传感器交互通常开中断加FIFO只有大吞吐量、周期性收发才考虑DMA。不要一上来就全上DMA链路一旦长了出一个问题排查起来相当酸爽。3.5 引脚复用Uart和Port模块的联动引脚复用配置错误是UART初始化失败最常见的原因之一。UART外设的TX/RX信号并不天然对应到某个物理引脚同一个物理引脚可以复用好几个外设功能必须显式地在Port模块里指定当前引脚工作为UART功能。操作上分三步走打开原理图找到该UART通道的TX/RX连接到了哪个物理引脚。对照E3118手册里的引脚复用表找到UART_TX和UART_RX对应的复用功能编号AF编号。在MCAL的Port模块里把对应引脚的PinMux配成这个AF编号同时把方向设对TX是输出RX是输入。开了流控的话RTS/CTS引脚也要一起配好。有一个小坑有些配置界面里PinMux的编号和芯片手册上标的不完全一致会差一个序号或者用了不同的命名方式。拷贝别人工程里的配置时最容易踩这个坑因为看起来好像配了实际复用功能选错了。配完之后花一分钟验证一下引脚电平状态也是一个好习惯配置正确后空闲状态下TX引脚应该能测到高电平。4. 生成代码与协议实现从配置到一组可用的UART收发API4.1 生成代码里发生了什么配置完成之后在EB Tresos里执行代码生成工具会输出一批C源文件。MCAL层按模块划分一般能看到Mcu、Port、Uart各自的.c和.h文件外加一个集成用的配置结构体文件。这些文件的形态大概是Mcu模块包含Mcu_Init、Mcu_InitClock等接口内部是一张大表把你在配置界面里填的时钟源、分频系数、使能位全部固化成常量数组。Port模块包含Port_Init接口内部根据配置生成引脚初始化和复用设置表。Uart模块包含Uart_Init、Uart_Write、Uart_Read等标准API以及对应的配置结构体把波特率、帧格式、FIFO阈值、中断源选择等打包成数据。注意一点MCAL生成的代码并不是一个完整的嵌入式工程。它假设已经有启动代码、中断向量表、系统初始化这些底层环境。所以最稳妥的做法是在芯驰MCAL包自带的示例工程基础上改启动文件和链接脚本都用现成的不要自己从零搭。4.2 核心API逐个看初始化、发送、接收MCAL层UART模块的标准API名字很有规律常用的就几个。Uart_Init负责初始化所有配置过的UART通道。它读取配置结构体把分频值、帧格式、FIFO、中断使能一次性写入寄存器。调用顺序要求很严格必须在Mcu_Init和Port_Init之后执行否则外设时钟没开、引脚功能没配对初始化等于白做。Uart_Write用于发送数据。有的驱动实现是阻塞式一定要等所有数据都进了发送FIFO或者发完才返回有的实现是异步式把数据塞进FIFO就立刻返回。用之前先搞清楚你这个MCAL包是哪一种不然很容易在流程控制上出问题。Uart_Read用于读取接收数据。用轮询模式的话需要先通过Uart_GetStatus之类接口判断接收寄存器有没有数据再调用读取用中断模式的话通常在中断回调里读。每个UART通道的中断会对应一个ISR入口。在生成的驱动里中断入口里一般还会调用一个MCAL提供的处理函数。这里要检查中断向量表里有没有给这个UART通道留向量地址中断控制器侧有没有使能对应的中断请求。这两个地方漏了接收中断就永远不会进来。有用过STM32 HAL库的朋友其实可以类比理解MCAL的Uart_Write大概相当于HAL_UART_TransmitUART中断处理入口类似于HAL_UART_IRQHandler。只不过AUTOSAR把这个API的命名和调用方式标准化了换芯片平台时接口长得基本一样。4.3 用回环测试验证配置正确性配置完最直接的验证方式是把UART模块的TX和RX引脚短接也就是物理回环。程序里发送一段数据再收回来对比是否一致。如果一致至少说明芯片内部UART的发送路径、接收路径、FIFO、中断配置都是通的。下面是一段示意性质的伪代码思路uint8_t tx_buf[] Hello E3118 UART; uint8_t rx_buf[64] {0}; void UartTest_Loopback(void) { /* 初始化顺序必须是 Mcu - Port - Uart */ Mcu_Init(Mcu_ConfigData); Port_Init(Port_ConfigData); Uart_Init(Uart_ConfigData); Uart_Write(UART_CH_0, tx_buf, sizeof(tx_buf) - 1); /* 轮询读取等待接收状态标志 */ while ((Uart_GetStatus(UART_CH_0) UART_STATUS_RX_DATA) 0) { /* 可加超时保护 */ } Uart_Read(UART_CH_0, rx_buf, sizeof(rx_buf)); /* 对比收发数据一致则回环通过 */ if (memcmp(tx_buf, rx_buf, sizeof(tx_buf) - 1) 0) { /* 配置链路基本OK */ } }回环通过说明芯片内部的收发链路是好的但还不能证明物理连线和外部设备没问题。所以回环测试做完之后建议再用外部USB转串口工具做一次交叉验证从芯片侧发数据用电脑串口助手接收两头能对上才算完整跑通。5. 实测中的波形与排查为什么配置全对了还是不通5.1 用逻辑分析仪看UART波形调UART最怕的就是感觉应该通了但就是不通信。遇到这种情况建议不要对着代码瞎猜直接上逻辑分析仪看波形这是最硬核的排错手段。逻辑分析仪接在芯片侧TX引脚上设置好目标波特率然后抓一发数据。正常波形应该是空闲时高电平发送起始时拉低一个bit时间接着是最低有效位先发出的数据位最后高电平停止位。逻辑分析仪能自动解码把电平变化翻译成十六进制或者ASCII非常直观。有一个经验想重点说一下从USB转串口工具那边看到乱码不一定是芯片波特率错了。先拿逻辑分析仪接在芯片侧TX引脚看芯片发出来的原始信号。如果芯片侧波形解码是正常的那就说明问题出在外围电路或者对端设备如果芯片侧波形本来就是乱的再回头查MCAL配置。实际排查顺序我一般是芯片侧TX波形是否存在。芯片侧波特率解码是否正常。外部线路中是否有电平转换芯片转换方向对不对。对端设备配置是否和芯片一致。这个顺序能帮你快速缩小范围不会乱了阵脚。5.2 波形异常、解码乱码的排查表平时调串口时常见的几类现象我习惯整理成表格遇到问题直接对照查现象可能原因排查方法TX一直高电平没有波形引脚复用没配对、UART外设时钟没开查Port的PinMux配置、Mcu时钟树有波形但解码全是乱码波特率误差太大、校验位格式不匹配用逻辑分析仪测量实际波特率计算误差波形边沿有毛刺线路过长、接线接触不良、地线不共地缩短杜邦线检查GND连接芯片发送正常但外部接收不到RX引脚配错、电平转换芯片方向不对查引脚复用配置查外围硬件偶发丢帧或错帧FIFO溢出、中断响应不及时调大FIFO触发阈值降低波特率长包乱码、短包正常波特率误差累积采样点偏移重新计算分频系数校准波特率有一个经常被忽略的外部因素USB转串口工具本身的驱动问题。FT232、FT231x这类芯片如果驱动没装对电脑端会识别成错误端口或者干脆无响应。排查到最后发现是USB串口线坏了或者驱动不对这种事真的太常见了。遇到诡异问题先换个USB口、换根线、重装一下驱动能排除掉一大批外部干扰。5.3 一个真实排查案例波特率误差导致的长包乱码分享一次实际排查经历很有代表性。当时现象是配置界面看着一切正常引脚没配错时钟也开了发短数据完全正常但只要发送超过64字节的数据包接收端就会时不时乱码而且包越长乱码概率越高。第一反应是FIFO和中断配置出了问题于是调大了FIFO触发阈值结果问题没有消失。又怀疑是中断响应不及时导致数据覆盖加了大缓冲区还是不行。后来用逻辑分析仪抓波形发现了关键细节芯片发出的起始位和第一个数据位的波形宽度比理论值窄了一点而且越到后面的数据位每个bit的采样点越靠近bit边界。这不是偶发干扰这是典型的波特率误差累积。回去翻MCAL里的波特率计算发现目标配的是921600但当时给的时钟源频率算下来分频后只能到85万多一点误差接近8%。短包发送时误差还没累积到阈值随便发就正常长包连续发送几十字节之后采样点逐渐飘到bit边界甚至更远的地方就开始乱码了。解决办法是把时钟源频率调整到能整除目标波特率的分频组合或者干脆换一个当前时钟下误差极小的波特率档位。改完后再测连续发几千次长包都没有再出错。这个案例给我的教训是波特率误差不能只看理论值能不能用还要结合实际传输长度去评估。配置界面里自动计算出来的波特率自己一定要复核一遍误差。6. 配置之外的几个坑MCAL项目里容易被忽略的隐性依赖6.1 初始化顺序Mcu_Init必须先跑MCAL层对初始化顺序有硬性要求优先级是Mcu先于PortPort先于Uart。这个顺序写下来很容易理解但在实际项目里就是有人会图省事调换。我见过的情况是代码里把Uart_Init放在Mcu_Init前面调用。结果Uart_Init里写了半天分频寄存器但外设根本没有时钟输入写进去等于白写整个串口一片死寂。这种问题还不会马上报错等你检查寄存器发现值确实写进去了就很容易陷入配置没错但为什么没输出的迷惑。另外要提一嘴Mcu模块里的电源管理和时钟树如果漏配了UART外设所在域的供电也会表现出同样的症状——外设完全没有反应。这类问题在MCAL配置工具里一般不报错只能在运行时排查。所以每次配置完先确认Mcu_Init正常返回再往后初始化这是一个值得养成的习惯。6.2 中断向量表UART中断进不去的真相如果UART用的是中断方式收发除了Uart模块里打开中断使能之外还必须在中断控制器层面给对应UART中断源分配优先级并且使能中断请求。这一步漏了现象很经典发送看着正常接收永远等不到数据因为中断根本没有触发。用调试器查看的话会看到中断标志位其实已经置位了但CPU就是没有跳到中断服务函数。问题就出在中断控制器这边没使能。排查时看两个位置第一中断向量表里有没有为这个UART通道分配向量地址第二中断控制器的中断屏蔽寄存器里对应位有没有清零、优先级配置有没有设置正确。尤其在多中断源的项目里UART中断优先级配得太低还可能被其他高频中断饿死。如果数据和日志反复出现接收丢字节的现象也可以回头看一眼中断优先级分配是否合理是不是有其他中断长时间占用了CPU导致UART中断无法及时响应。6.3 数据缓冲MCAL不帮你缓存MCAL层的职责边界很清晰它只负责从FIFO里把数据读出来交给你的缓冲区不会主动帮你做环形缓冲。如果应用层只在中断里把数据塞进一个固定数组却不维护好读写指针收不了几帧数据就会发生覆盖。很多MCAL驱动在接收时要求应用调用方提供一个接收缓冲区驱动把数据写进这个缓冲区。什么时候取走这些数据、怎么保证多段数据不冲突这些问题都要应用层自己解决。最常用的方案是自己维护一个环形缓冲区写指针由中断处理逻辑推进读指针由主循环推进两个指针互不干扰满则丢弃或置溢出标志位。这道工序在STM32 HAL上可能已经由底层库帮你处理了一部分但到了MCAL上所有缓冲区管理都回到你自己手里。我见过一些从HAL转过来的工程师默认以为底层自带接收缓冲实际在MCAL上跑起来就吃了亏。收到数据乱、丢数据先查自己的环形缓冲区这个概率比查硬件大得多。6.4 动态修改波特率时的同步问题有些应用需要在运行过程中切换波特率比如上电之后先以低速握手再切到高速通信。MCAL一般会提供Uart_SetBaudrate之类的接口但直接调用是会出问题的。首先是切换时机。一定要确保串口总线上没有任何正在传输的数据否则对方还在按旧波特率收你的尾包帧就错位了。稳妥的做法是先通知对端准备切换发一段约定的空闲序列等两个字符时间的余量再执行波特率切换。其次是切换之后FIFO里可能有残留数据。有些驱动在修改波特率后FIFO中残留的旧数据会导致下一帧解析错位。我习惯的做法是切换前先屏蔽收发中断然后清FIFO写完新的分频系数后再重新使能中断。这样能减少很多莫名的错帧问题。动态切换波特率还需要注意对端设备是否支持无感知切换。如果对端是那种必须在掉线重连后才切换波特率的模块那你在MCAL层再折腾也没用应用流程上要做好重连握手的设计。
返回列表