1. 熟练掌握 STM32、GD32 等多款 MCU 开发,熟练使用 UART、SPI、I²C、CAN、Modbus 等通信协议,对4G、wifi等无线模组以及物联网平台有熟练的使用经验。
stm32、GD32
问题1:熟练掌握 STM32、GD32 等多款 MCU 开发,你用过哪几款芯片
stm32f103c8t6 意法半导体
- ARM cortex-m3 内核,72Mhz主频,64kflash(闪存存储器),20ksram
stm32f407igh6
- arm cortex-m4 内核,168Mhz主频,1mflash,
- 主系统ram为128
- 64k核心耦合内存ccm ram(不支持DMA,外设有不能使用但cpu访问速度最快),
- 合计为128+64=192k的sram
- 还有0.5k选项字节opt,一般用来存放产品序列号,加密密钥等
- 还有4kb备份静态存储器,一般不计入总内存,用在掉电后可通过 VBAT 供电保持数据,常用来存储断电也要保留的重要参数,例如时间和设备配置等
gd32e230re 兆易创新公司
- ARM Cortex-M23,72 MHz
- 64 KB Flash;8 KB SRAM
gd32f303re
- Cortex-M4 , 120 MHz
- 128 KB falsh, 32 KB SRAM
py32f030 普冉公司
- Cortex-M0,48 MHz
- 64kb flash,8k SRAM
问题2:stm32f407igh6有有多点sram,怎么分别使用呢
- sram的中文名称是静态随机存储器
- stm32f407常说的内存有两段,一段是主系统内存,一段是核心耦合内存
- 128k的主系统内存一般用在全局变量、堆栈、DMA缓冲等场景,直接声明变量、malloc、创建任务等都是用这段内存
- 64k的核心耦合内存是cpu直接连接的高速ram,dma和外设都不能访问,一般是用来存放实时性要求高的数据或运算缓存区的,像中断服务,算法等等。
- 使用64k的核心耦合内存需要在定义变量前加入链接脚本__attribute__((section(".ccmram"))),意思就是通过实行section将变量不放在默认的sram,而是放在名为.ccmram的特定内存段里
问题3:说说spi有几种模式,不同的模式有什么区别
- 先说下spi吧,spi是一种高速、全双工、一主多从、无需应答的同步串行通信协议
- 常用于mcu与外设如屏幕、flash、传感器之间的数据传输
- 由四条信号线组成,分别是时钟线sclk、片选线cs,主机输出从机输入MOSI和主机输入从机输出MISO
- spi有四种模式,Mode0~Mode3,每种模式的数据采样方式略微有些区别,由时钟极性和时钟相位两个参数决定
- 时钟极性是指时钟信号空闲时的电平状态,
- 个人理解时钟极性,指时钟线sclk,空闲的时候,也就是不采样的时候,低电平就是0,高电平是1
- 时钟相位是指数据采样沿的选择
- 个人理解时钟相位,就是时钟极性采样沿,并且是根据时钟极性来的,如果时钟极性是低电平,相位0采第一个沿,相位1采第二个沿,如果时钟极性是高电平,相位0采第二个沿,相位1采第一个沿
- 不同的模式时钟相位和极性不一样,采样的位置就不一样
- 大部分spi设备都是使用mode0
问题4:为什么i2c要用开漏输出,什么是仲裁机制和应答机制
- I2c是一种两根的串行总线通信协议
- 由一根SDA数据线和一根SCL时钟线组成
- 一般用来连接低速外设,像传感器、oled、触摸屏的触摸芯片等
- 它是多主多从,由地址位决定和那个从机通讯,然后有应答机制
- i2c由仲裁机制来决定当多个主机同时试图占用i2c总线时,决定谁能继续通信,谁必须让步
- 数据线sda和时钟线scl都需要上拉电阻
- i2c是多主多从结构,scl和sda都是总线共享的。
- 如果用推挽输出,当一个设备输出高电平,另一个设备输出低电平,会直接短路,造成芯片损坏。
- 用开漏方式就不会有这种问题,0是由设备主动拉低,1是被动释放,由上拉电阻拉高
- 多个设备同时拉低,电平依然是低,安全无冲突
- i2c用开漏输出主要是为了安全的多机共享,这样0由设备拉点,1由上拉电阻拉高,就不会出现设备之间的电平冲突。同时它还能实现线与逻辑,用来完成仲裁和ack机制。这是i2c能可靠工作的关键
问题5:gpio有几种模式
- 输入有三种,浮空输入、上拉输入、下拉输入
- 输出有两种,推挽输出(能输出高电平和低电平,用于led等)和开漏输出(一般用于i2c)
- 复用,用在uart、spi、i2c、pwm、can等
- 模拟,adc和dac,采集和输出模拟电压
问题6:can总线
- can总线是一种多主机差分总线,支持广播通信,所有节点都能收到数据;
- 通过id过滤器来决定接收哪些数据帧
- 通过仲裁机制解决多主机竞争,id越小的帧优先级越高,当多个设备同时发送数据时,通过低电平优先的规则来比拼,输的人停下,赢的人继续
- 通过应答机制保证数据可靠
问题7:modbus
- modbus是一种工业通信协议,常见形式有
- modbusRTU,一般配合串口加rs485
- modbusASSCII,一般配合串口
- modbus TCP,一般配合以太网
- 主从模式,
- 数据由帧构成,有地址位、功能码、数据位、还有CRC校验
- 兼容性较好,支持设备多,但是只能主机问从机答,效率一般
问题8:4g模块通信的流程
- 配置4g模块连接的串口
- 给4g模块供电,根据时序图,使能初始化引脚
- 发送at给4g模块,看是否返回ok,返回ok表示mcu和4g模块通信成功
- 发送带运营商编码的at指令拨号上网,如果没成功换个运营商编码再拨号
- 发送ip的a指令获取ip地址
- 发送获取iccid和imei的指令,获取iccid和imei
- 发送带服务器地址端口的at指令,建立tcp连接
- 按照mqtt格式发送iccid、imei和固定的token,与服务器进行通信校验,成功就达到了硬件和服务器通信的效果
- 通信完毕后可以发送断开指令,然后关闭4g模块的供电
问题9:esp8266联网流程
- 给模块供电,让它启动
- 配置好模块和mcu连接的串口
- 发送at测试指令,返回ok说明通信正常
- 设置wifi工作模式,有三种模式,连wifi模式、自己开热点模式、混合模式
- 发送指令加对应wifi名和密码,进行wifi连接
- 获取ip地址
- 发送指令加tcp和ip和端口,和服务器通信
- 与服务器连接后可以按照服务器校验规则发送和接收数据
- 发送完毕后发送断开指令
2. 熟练使用 freeRTOS 进行多任务管理,精通 LVGL 图形库实现 GUI 界面设计。
问题10:freeRTOS任务之间通信方式
- 二值信号量:类似于一个开关,只有两个状态0和1,任务可以阻塞等待信号量变为1。比如一个任务里面执行完成了,通知另一个任务执行,例如传感器采集完成,通知处理任务开始解析数据。只能用于单一事件通知,不适合传递数据。
- 互斥量:用于保护共享资源,支持优先级继承,防止任务优先级反转。一般用在串口、spi、i2c等总线,共享全局变量时。主要要及时进行释放,否则可能导致死锁。并且要避免在中断中使用互斥量。
- 队列:用于任务间传递数据、线程安全、支持阻塞等待。一般是创建队列,一个任务中发送数据,另一个任务中接收数据,如果发送没完成,接收会阻塞。一般用在采集任务向上传递任务发送数据等场景。
- 事件组:可同时等待多个事件条件,支持按位操作。一般是创建事件组、然后任务等待、最后设置事件。
- 任务通知:每个任务自带32位通知值,可以用作轻量级信号量或传递数据。一般用在任务间快速通知或传递小数据,效率比队列高。但是一次只能通知一个任务,适合一对一通信。
- 临界区:用来禁止任务调度和中断,保证一段代码的原子性操作。一般用在全局变量、寄存器等必须原子操作的情况。但是要注意临界区时间不能太长,否则会影响系统实时性和响应性。
物联网光功率计项目讲解
- 物联网光功率计是一种应用在光纤施工和维护场景的专用仪器。传统设备需要工程师走到设备端才能看到功率数据,这个项目通过4g模块+后端服务+微信小程序,让施工人员可以远程实时查看设备数据。设备端基于freeRTOS+LVGL+彩屏+InGaAs传感器,实现本地测量,本地和远端都可以展示。
- 传感器采样,使用的InGaAs传感器将采集的光信号转换为电压信号,并且为了保证强弱光信号下都有良好的精度,我们设计了运放自动增益切换,根据采样值动态改变放大倍数,提高分辨率。
- 采样后,每隔50ms采样一组数据进行通过排序算法去掉杂波,然后通过平均算法,计算出光功率值和频率。
- 使用tft彩屏+lvgl实行图形化界面,显示采样值,点亮,充电动画,4g连接状态等。
- 使用ec800m4g模块,通过mqtt协议与后台和微信小程序通信
- 首先配置好4g模块和mcu相连接的串口,然后给4g模块供电,然后根据4g模块时序图,使能初始化引脚,然后发送at指令检测mcu和4g模块间的串口通信是否连接成功,成功后发送at加运营商编号发起拨号上网,然后发送iccid和imei获取iccid号和imei号,再然后发起at加服务器地址和端口发起tcp请求,成功后发送at加iccid加imei加token和服务器建立连接,后续就可以进行通信了
- 整个项目用freertos对任务进行了划分,传感器、屏幕、通信、电池管理,按键、都拆分成了独立的任务,任务间通过队列、信号量等进行解耦,比如通信任务收到mqtt指令后,捅咕队列通知ui任务刷新状态
8月20日金码测控面试问题
i2c
- i2c是一种串行、同步、半双工、多主多从的通信总线。它最显著的特点就是只用两根线就能实现复杂的网络拓扑结构,一根是串行时钟线SCL,一根是串行数据线SDA。
- 因为有时钟线,所以是同步的
- 因为只有一根数据线,所以只能一位一位的传,所以是串行。
- 因为只有一根数据线,所以同一个时间只能发或者收,所以是半双工。
- 因为这两根线上可以挂在多个设备,所以是多主多从。
i2c一帧的基本结构
- 起始位:时钟线高电平时,主机拉低数据线
- 地址位:主机发送7位地址
- 读写位:主机发送1位读写位
- 应答位:从机发送1位应答位
- 数据位:写的情况下,主机发送8位数据位。读的情况下,从机发送8位数据位。
- 应答位:写的情况下,从机发送1位应答位。读的情况下,主机发送1位应答位
- 停止位:时钟线高电平时,主机拉高数据线
i2c的起始start信号和停止信号stop是如何产生的?
- 起始信号和停止信号是i2c协议每一帧数据的边界
- 起始信号为,当时钟线高电平的时候,数据线由高电平跳变为低电平,开始一帧
- 停止信号为,当时钟线高电平的时候,数据线由低电平跳变为高电平,结束一帧
- 只有主机又权利发起起始信号或停止信号,而从机是受控的,是被动的
i2c总线为什么必须外接上拉电阻
- 上拉电阻接线位置,主机端数据线SDA和时钟线SCL直接接电阻,上拉到vcc
- i2c的数据线SDA和时钟线SCL必须配置成开漏输出,不能是推挽输出,
- 在多个从机的情况下,如果配置成推挽输出,那输出的高电平是有驱动能力的,如果信号线从机1输出了高电平1,从机2输出的是低电平0,则电流就会从从机1流向从机2,然后io口的mos管内阻是非常小的,就会烧坏从机2的mos管,那从机2芯片就烧毁了
- 开漏输出下,高电平是没有驱动能力的,要靠外部上拉电阻来驱动,从机2和vcc之间又上拉电阻,就不会烧毁mos管
- 还有一个原因,总线空闲的时候,意味着所有的设备,它都是释放了总线的,这个时候总线的电平也得默认是高电平,所以需要上拉电阻
- 总结:开漏输出加上上拉电阻,就实现了线与逻辑
- 线与逻辑是实现多主仲裁和时钟拉伸等功能的必备基础,而且允许多个设备安全的共享总线,不会出现电气上的冲突
i2c的ack应答nack非应答机制是怎样的,是由谁发出的
- i2c一次完整的信息发送,至少由两次应答。第一次,在地址位和读写位后面,由从机发送应答位。第二次及以后,如果是读,也就是读写位为1,数据位由从机发送,数据位后面接一次应答位由主机发送。如果是低电平ack表示这一次接收完成,继续下一段数据。如果是高电平nack表示这一次接收完成,也全部发完毕了。
什么是时钟拉伸,有什么作用
- i2c的时钟线scl是由主机驱动的
- 但从机在数据未准备好等情况下,可以主动将scl拉低,主机检测到时钟没释放就会等待从机
i2c如何实现多主通信和总线仲裁?
- i2c支持多个主机接在同一条总线上,多个主机可能会同时发起通信
- 总线上是数据线和时钟线都是开漏输出,需要外接上拉电阻。
- 如果某主机输出1,而另一个主机输出0,实际上总线会被拉成0;
- 主机在传输的过程中会监控数据线,如果自己发的1,但看到总线上是0,就说明自己被抢占了,仲裁失败,自动退步通信。胜出的主机继续传输数据。
- 仲裁机制的优点是不会出现总线冲突或数据损坏,确保通信可靠。
i2c总线仲裁的线与特性
- i2c的数据线和时钟线引脚不能主动输出高电平,只能拉低,否则保持悬空
- 总线上的高电平实际上是靠上拉电阻拉上去的。
- 所以总线上只有两种情况,一种是所有设备都不拉低,总线电平被上拉。
- 一种是只要有一个设备拉低,总线电平被拉低。
- 如果两台主机同时发送数据,因为0的驱动力更强,总线会被拉成0,所以第一个发送0的主机就会仲裁胜出。
8月21日花火面试问题
具体是哪些项目
这个无线通讯用的什么
ec800m联网多少s之内可以连上去
- 4g模块上电+初始化:约为1-2秒
- 搜索基站+注册:约3-5秒
- 拨号获取IP:约1-3秒
- 连接自己的服务器加端口,大概1-2秒
- 综合看,6-12秒内可以完成联网
- 如果信号弱或基站拥堵,可能时间会稍微延长
- 一般会设置一个多少秒超时,或者重连机制,避免模块卡死
4g模块和基站注册并没有入网,入网真正是在哪一步
用到了mqtt吗
底层和上位机进行通讯的两个关键参数是什么
adc采样,中值滤波和卡尔曼滤波
- adc采样原理:电压信号通过输入通道,内部采样电容充电,根据adc分辨率,模拟数字转换,然后存取寄存器或DMA缓冲区。
- 种植滤波是把一堆数据排队,去中间的那个值,保证偶然噪声不影响整体结果
- 卡尔曼滤波是采用猜测的方式,根据上一次的位置预测现在的值,再结合实际测量,给出一个更可靠的结果。
电机驱动和算法
spi怎么结合dma使用
- spi是高速串行通信协议,主设备通过主输出从输入、主输入从输出、时钟、片选四根信号线与从设备进行通信
- dma是直接内存访问控制器,cpu不参与数据搬运,数据从外设寄存器直接写入内存或从内存写入外设。
- 结合使用:数据通过spi总线传输时,有dma自动搬运数据到内存或从内存发送,cpu不需要一个字节一个字节去读写,提高效率,尤其适合大数据量或高速采集。
- 使用流程:配置spi,设置主从模式、时钟极性、数据长度等;配置dma,指定源地址位spi数据寄存器,指定目的地址位内存缓冲区,设置数据长度和传输方向,选择触发事件;启动dma,让dma自动搬运数据;dma触发spi数据发送和接收;最后传输完成,Dma会通知cpu处理数据,触发DMA传输完成中断。
使用国产mcu有没有遇到哪些坑
- 一般会遇得到手册不够详细、库函数不够完整、外设时序特殊、工具链兼容性差等问题
- 通常会先验证基础功能,必要时直接操作寄存器,写自己的封装,配合逻辑分析仪和示波器调试,保证项目稳定。
你以后的规划是偏向于软件还是软硬件一起
你软件风格是怎么样的,一般情况下,各个模块衔接这块是基于状态显示的还是直接用全局变量互相调用的这种方式
freeRTOS任务消息处理这一块要注意什么
- freeRTOS提供了多种任务见通信机制
- 队列:任务间传递数据/消息
- 消息缓冲区:类似队列,但支持可变长度消息
- 事件组:传递事件标志位
- 信号量/互斥量:同步任务或保护资源
- 任务消息处理的本质就是,一个任务发消息,另一个任务接收消息,然后根据消息做响应。目的是保证任务之间安全、顺序和实时的传递数据,同时要考虑队列容量,阻塞策略,优先级和数据一致性等。
什么是时间片轮询
- cpu的执行速度很快,优先级相同的任务,cpu会先在任务1执行一部分代码,然后切换到任务2执行一部分代码
- 这个切换的速度很快,看着就像两个任务同时在执行
- 但是实际上cpu在一个时间片段内,只能执行一个任务
- 只是不断的以非常快的速度在多个任务之间轮询
- 这个过程就叫时间片轮询
什么是抢占任务
- 高优先级任务强行打断低优先级任务,强行插进来,它先运行,它运行完了才能运行其他低等级优先级任务
什么是二值信号量
- 二值信号量是一种freeRTOS提供的信号量机制,它的取值只能是0或1
- 本质上,它是一个任务间同步工具,相当于一个开关标志位
- 一般用在任务之间的同步,比如任务a完成了某个动作,需要通知任务b去处理
- 也用在中断和任务同步,常用在中断里释放信号量,唤醒任务去处理耗时操作
什么是计数信号量
- 计数信号量是一种FreeRTOS提供的信号量机制,它的取值范围是0到一个最大值
- 它相当于一个可递增/递减的计数器,用来记录有多少个可用资源,或者有多少次事件还没被处理
- 一般用在资源管理上,比如有5个相同的硬件资源,可以用一个计数信号量初始值=5,每次占用资源Take(),释放资源Give(),这样同时最多只能有5个任务使用资源,超过的任务会阻塞。
- 也用在事件计数上,比如中断发生多次,每次中断Give()一次信号量,任务每次Take()就处理一次事件,如果中断发生的比任务处理的快,信号量的计数值就会累加,不会丢事件。
舞台灯光控制的协议,也是类似modbus协议,但是它是没有校验,它是等长的一般是128字节,每一段代表一些功能,关键是不带校验机制,要怎么去容错,保证信号稳定稳定
DMA熟悉不
- DMA是直接内存访问,是一种独立于cpu的数据搬运机制,可以在外设和内存,内存和内存之间搬运数据,而不需要cpu的读写。常用于高速数据采集,串口/adc/存储器传输等场景。
- cpu单独搬运数据效率低,尤其是大数据量或高采样率场景,dma自动搬数据,可以节省cpu时间,提高系统实时性。
- DMA使用流程:
- 配置DMA通道:设置源地址,可以是外设寄存器或内存,设置目的地址,可以是内存或外设地址,设计中数据长度,设置数据宽度为8位或16位或32位,设置传输方向为读或写,设置触发事件位外设请求或软件触发。
- 配置外设:让外设产生DMA请求,例如SPI、uart、adc发送或接收数据
- 启动dma:DMA自动搬运数据,无需CPU干预
- 处理完成中断:DMA搬运数据完成后会触发DMA的传输完成中断,让CPU处理数据。
- 选择循环模式:对连续采集数据可用循环模式,避免频繁启动DMA。
- 注意事项: 缓冲区对齐,DMA要求内存地址按数据宽度对齐。还需要防止数据溢出。配置终端优先级和循环模式等。
摇头的用步进电机,不摇头的普通交流电机,步进电机的粗分和细分有了解过吗,平常移动1.2度,细分0.6度,都是靠软件去实现的,光纤熔接机用到的步进电机是多少度的,每一步步进的角度是多少度,电机控制这块熟悉吗,用的步进电机带了反馈没有
- 步进电机是一种数字脉冲驱动的电机,控制器每发一个脉冲,电机就转动一个步进角度,适合精确位置控制
- 交流电机是通过交流电驱动的电机,通电就能转,转速和电网频率相关,适合连续选择。
- 步进电机的粗分(全步/半步):指步进电机按照最基本的步距角来走,一次激励电机线圈就走一个完整的角度,叫全步;如果通过特殊驱动让它走半个角度,就叫半步。粗分精度较低,速度较高。
- 步进电机的细分(微步):通过控制电机各相电流的正弦/余弦波形,让电机的转子停在两个步之间,实现更小的步距角。比如原本是1.8度每步,通过16细分,可以变成0.1125度每步。细分精度较高,但实际受电机机械精度和负载的影响,也受mcu的输出能力的影响。
- 步进电机的角度值,电机轴相对于参考点的实际旋转角度,比如已经转了90度或者180度
- 步进电机的步进角度,指的是电机每走一步转子旋转的最小角度,比如常见的1.8度每步的电机,也有0.9度每步的电机。电机的总角度=步数*步进角度
- 带反馈的步进电机,一般在电机或者轴上加了位置传感器或者编码器,会实时检测电机转到哪里。控制器会把检测到的位置和目标位置做比较,如果发现偏差,就及时补偿脉冲或调整电流,避免丢步。
光信号接收用的是什么
平均值滤波,你采样多少次,还能做到50ms,1024个值去算,不是滞后很严重吗
gd32的ad转换周期要多久,采样1024次,50ms也做不到吧
- adc时钟可以开到最大,14Mhz
- 采样周期可以设置最小的1.5,单位转换时间只需要1.4us
- 数据传输配置可以设置为DMA
- 50ms可以采样3w多次
实际中很少用平均值滤波这种,中位数滤波和卡尔曼滤波了解不?
写一个软件框架,串口加dma收发数据,然后是ad采集,用滤波算法处理后,打印出来,然后根据结果控制led灯
串口如何结合DMA使用
- 串口通常可以用中断方式接收和发送数据
- 如果数据量大或者连续采集,单靠中断cpu会频繁打断任务,效率就很低
- dma可以让数据直接在外设和内存之间搬运,cpu不参与,就可以大幅度提高效率
- 首先配置dma,设置数据源为串口数据寄存器,设置目的地位内存缓冲区,设置每次要接收和发送的数据长度
- 然后配置串口,允许dma接收和发送功能,打开接收和发送使能
- 最后进行数据传输,串口接收到数据,dma自动搬运到内存,dma完成搬运后,可以触发中断通知cpu处理数据
adc是左对齐还是右对齐
- mcu的adc通常是12位的
- adc把模拟电压转换成数字值后,要存到寄存器
- 寄存器通常是16位的
- 12位adc值放在16位寄存器中,会有4位空缺,需要补0
- 常用的是右对齐,高4位补0,这样的好处是,读取寄存器直接就是adc的值,不需要移位
- 左对齐可以让adc与16位寄存器对齐,左对齐后保留了更多低精度位,但是使用时需要先移位
32位机有两种看门狗,独立看门狗和窗口看门狗
- 都可以防止mcu因软件异常或意外死循环而无法响应
- mcu定期刷新看门狗,否则看门狗计数完了就复位mcu
- 主要用来确保系统的可靠性和安全性
- 独立看门狗:独立与主时钟系统,由低速时钟驱动,只要在超时前刷新就可以,用来防止系统卡死,使用比较简单,一般用在系统级的监控
- 独立看门狗也有计数器,mcu程序正常运行时,需要定期刷新独立看门狗计数器,刷新后,计数器会被重置到初始值,计数器减到0,系统内就会复位,可以在任意时间重置计数器初始值。
- 窗口看门狗:依赖主系统时钟,具有刷新窗口概念,必须在规定窗口期刷新,否则会复位,用来防止系统卡死+检测任务执行你时间异常,使用比较复杂,需要计算刷新窗口,一般用在周期性任务的监控。
- 窗口看门狗的窗口意思为:窗口看门狗的计数器,从一个设置的初始值递减到最小值是一个时间段,窗口就是计数器允许刷新,也就是喂狗的时间段
- 独立看门狗和窗口看门狗的核心区别在于时钟来源和刷新机制。独立看门狗独立时钟,只要在超时时间内刷新就行,适合防止mcu司机,可靠性高。窗口看门狗刷新必须在规定窗口,既能防止死机,也能检测任务周期是否异常,适合实时控制任务。一般项目中,如果任务周期严格,我会选择窗口看门狗。如果只是确保mcu不死机,则使用独立看门狗。
RS485总线
- 是一种串行通信总线,一般单片机里通过串口连接485芯片,然后芯片的a,b线再以双绞线的方式连接到从机。
- 485是以差分信号的方式传输,抗干扰能力较强,通讯距离最远可以到1.2公里
- 距离较远时,信号干扰和衰减较大,一般会在总线的首尾两端增加终端电阻
- 如果是多台从机时,会在主机端a线加上拉电阻,b线加下拉电阻
- 一般485总线最多可以挂载128个从机,多从机时,会配合ModbusRTU或者自定义协议使用
- 需要在通信的数据帧里,有一个地址字段,这样对应从机收到了,才知道这条数据是发送给自己的
有线485通讯,级联台数可以128,实际可能64个都连不上,485推挽输出,标准是1.2公里,信号干扰和衰减较大,所以加上下拉,上下拉电阻阻值更具实际情况调整,
- RS485是差分总线,A/B线在空闲时会悬空,既不是0,也不是1
- 如果485总线的长度比较长,在受到电磁干扰的时候,接收端的比较器可能会抖动,误判成随机的1或0
- 所以需要在A线加680R到1k的上拉电阻,在B线加下拉680R到1k的下拉电阻
- 这样在空闲时,强制把总线偏置成一个固定电平,避免误触发
阻抗匹配,会信号衰减,就是上升沿下降沿会变平滑
- 485通信距离可以达到1.2公里,总线长了就容易产生反射,导致高点电平的上升沿和下降沿变平滑,有效高电平和低电平的时间就有可能会缩短
- 一般情况下会在总线的首端和尾端,加上一个120Ω的终端电阻,直接跨在AB线之间,用来洗手信号的能量,消除反射。
485通讯,数据丢帧怎么处理,怎么保证数据的准确性
- 常见情况下,如果使用了Modbus RTU协议,是有校验位的,当检验不通过是可以请求重发
- 如果是自定义协议,没有校验位的话,可以重复发送,将前后两次数据进行比对,完全一致再进行使用
- 或者提高通讯的波特率,快速发送接收,快速响应,在从机还未对接收的指令处理完时,用新指令去覆盖掉。