面试真题 | 浙江大华

大华一面 嵌入式 主要是问的项目相关 标准的十五分钟 电话面 这个面试官主要问项目,我同门面的全问八股,可能面试官不一样吧

@[toc]

话说很多硬件终端、军工研究所都很喜欢考通信协议相关的知识。

往期内容:ARM/Linux嵌入式面经z专栏

UART串口通信的波特率,常用波特率有哪些

UART(Universal Asynchronous Receiver / Transmitter)是一种异步数据传输技术,它使用特定的波特率来传输数据。UART波特率是指每秒传输的数据位数,也称为波特率或传输速率。

UART波特率有多种,其中最常用的是2400、4800、9600、19200、38400、57600、115200。

串口通信校验方式是什么,有什么区别

利用串口传输数据时,近距离传输还好,远距离传输由于线路长度影响,可能会使信号在传输过程中出现不可预知的错误,为了达到通信的稳定性,在远距离通信时一般要引入一种校验方式来去除干扰。

这里主要介绍几种常见的校验方式,也是我们串口通讯板子上需要添加的几种校验方式。

即奇校验ODD,偶校验EVEN,累加和校验,CRC循环码冗余码校验

方便简单的奇偶校验

奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。

奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。

即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。

以发送字符:10101010为例

偶校验(even parity)

让传输的数据(包含校验位)中1的个数为偶数。

即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。

还是以发送字符:10101010为例

数据和校验位发送给接受方后,接收方再次对数据中1的个数进行计算,如果为奇数则校验通过,表示此次传输过程未发生错误。如果不是奇数,则表示有错误发生,此时接收方可以向发送方发送请求,要求重新发送一遍数据。

优缺点:

  • 奇偶校验的检错率只有50%,因为只有奇数个数据位发生变化能检测到,如果偶数个数据位发生变化则无能为力了╮(╯﹏╰)╭
  • 奇偶校验每传输一个字节都需要加一位校验位,对传输效率影响很大。
  • 奇偶校验只能发现错误,但不能纠正错误,也就是说它只能告诉你出错了,但不能告诉你怎么出错了,一旦发现错误,只好重发。
  • 虽然奇偶校验有很多缺点,但因为其使用起来十分简单,故目前仍被广泛使用。

应用:

如何用编程确定一个字节中“1”个数的奇偶性?我们可以利用二进制数相加的特点:

0+0=0、1+0=1、1+1=0

可以看出,如果我们将一个字节的所有位相加

  • 有奇数个“1”的字节的和为1 +有偶数个“1”的字节的和为0 由此即可通过编程完成判断。实际应用中,实现方法很多,但这是相对简单的一种,这里不再赘述。

累加和校验

所谓的累加和校验有很多种,最常见的一种是在每次通信数据包最后都加一个字节的校验数据,这个校验字节里的数据是通信数据包里所有数据的不进位累加和。例如:

接收方接收到数据后同样对一个数据包的数据进行不进位累加和计算,如果累加出的结果与校验位相同的话就认为传输的数据没有错误。

优缺点:

  • 实现起来方便简单,被广泛运用。
  • 检错率一般,例如一个字节多1,一个字节少1,则会出现误判。
  • 和奇偶校验一样,只能发现错误,但不能纠正错误。

另外,累加和校验的数据传输格式可以表示为:通讯数据+校验数据。这与我们之后要说的CRC循环冗余码校验是相同的。

虽然奇偶校验和累加和校验使用方便,应用广泛,但由于其存在许多缺点,在一些使用场合下很难满足要求,于是就有了更稳定更强大的校验方式,它就是……CRC循环冗余码校验!

CRC循环冗余码校验

  • CRC 即 Cyclic Redundancy Check 的缩写
  • CRC 循环冗余校验属于检错码,只能检测出现了错误,但无法纠正错误。
  • 与CRC循环冗余校验类似的,还有奇/偶校验,但是 CRC 漏检率更低,因此在实际应用中更为重要

发送方对原始数据追加校验码

  • 假设原始数据是:101001
  • 生成待追加的校验码,需要使用一个生成多项式,G(x)(收发双方事先约定),例如 G(x) = x3 + x2 + 1
  • 构造被除数:原始数据 + 生成多项式最高次项个0,即:101001000
  • 除数:除数实际上就是生成多项式的系数,G(x) 展开得到: G(x) = 1 * x3 + 1 * x2 + 0 * x1 + 1 * x0,即 1101
  • 两数相除得余数,并进行补位(补到与生成多项式最高次项一致),即得到校验码。但是,这里的除法跟常规除法并不相同
  • 常规除法在上下两行数进行运算时,使用的是减法运算,而这里使用的是异或

接收方对收到的数据进行校验

  • 继续接前文,假设收到的数据为 101001001

  • 接收方对该数据做除法,除数仍然是之前使用的多项式的系数 1101

  • 过程如下

  • 若余数为0,则表示未出错
  • 假设,接收方收到的数据出现了错误: 101101001,校验过程如下:

  • 余数不为0,则表示传输过程中出现了错误

结语

  • 计算CRC校验码时,用到的除法运算,内部使用的是异或运算而非减法运算

  • 计算出余数后,还要对其进行补位,才能得到最终使用的校验码

  • 在计算机网络中,数据链路层将数据封装成帧时,会在帧尾添加校验码,从而判断数据在传输过程中是否发生错误

  • 在实际使用CRC时,采用的生成多项式更为复杂,从而确保较低的漏检率

  • 另外,生成多项式的常数项必须是1

参考资料:

有校验位和无校验位的区别

iic收发数据的流程

IIC 即 inter-integrated-circuit,又称 I2C 一种总线结构,具体接受请度娘。

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

以下为mini2440的IIC设备:AT24C08

IIC遵从 主/从结构,通信由主机发起,并且由主机结束。

开始信号(s):当时钟信号处于高电平,向数据信号线发送下降沿。

结束信号(p):当时钟信号处于高电平,向数据信号线发送上升沿。

由于IIC总线上可能连有多个设备,因此我们应该在开始信号后进行设备选择,也就是发送地址信号,当设备收到符合自己地址的信号后会返回响应。

一般地址位宽为7位,而发送的数据位为8位,除了7位地址,剩下的一位为读写位。

如果为写,则在设备返回ack信号后,接着主机发送8位数据,当设备收到数据后,设备返回ack信号。

如果为读,则在设备返回ack信号后,接着设备返回8位数据,当主机接收到信号后,接下来的ack信号就由主机发送。

Data Transferred段周而复始,直到数据传输完成。

而在主机发送(R)或者接受(W)到ack信号后,会产生中断,我们可以在中断处理程序中对数据进行进一步处理,或者在中断处理程序内继续发送/接收数据。

当传输完成后,

       如果主机作为数据发送方,可以发送停止信号,终止IIC传输过程。

       如果主机作为数据接收方,可以不发送响应信号ack,终止传输过程。

寄存器配置:

根据芯片手册,IICCON用于初始化,其余用于数据传输的相关操作。

IICCON:  IIC控制寄存器

IICDS:  IIC数据移位寄存器

IICSTAT: IIC状态寄存器

IICADD: IIC地址寄存器

流程如下

主机发送流程:

主机接收流程:

设备发送流程:

设备接收流程:

另外,对于AT24C08,值得注意的是,该设备是先进行地址选择(非IIC设备的地址选择,而是AT24C08内部的地址选择),然后进行数据读

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

ARM/Linux嵌入式真题 文章被收录于专栏

让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!

全部评论
校招面试会简单一点,但是吧还是很基础
点赞 回复 分享
发布于 07-19 15:05 贵州
TrustZone_Hcoco
点赞 回复 分享
发布于 07-22 11:32 贵州
TrustZone
点赞 回复 分享
发布于 07-22 11:32 贵州

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
5
82
分享
牛客网
牛客企业服务