[TOC]
驱动模块类
串口驱动
Linux把每个串行端口都看做是一个字符设备
串口初始化 、打开串口、串口写操作、串口读操作
串口驱动程序设计详解---串口初始化 上
串口驱动程序设计详解---串口初始化 下
CAN驱动
CAN模块
总线协议规定了5种帧,分别是数据帧、遥控帧(远程帧)、错误帧、过载帧以及帧间隔
数据帧的7位域:帧起始(Start of )、仲裁域(Arbitration Field)、控制域(Control Field)、数据域(DataField)、CRC域(CRC Field)、应答域(ACK Field)和帧结尾(End of )
特点:
传输距离远(最远10Km),传输速率快(最高1MHz bps)
自动检测报文发送成功与否,可硬件自动重发
电压值:
0--显性--CANH对地3.5V,CANL 1.5V
1--隐性--CANH对地2.5V,CANL 2.5V
120欧的终端电阻是可以过滤掉总线通过程中的自激振荡
1 寄存器初始化配置顺序
(1)进入复位模式,进行配置 (2)配置时钟分频寄存器,决定Peil模式还是Basic模式。 (3)配置总线定时寄存器,确定波特率。 (4)配置中断使能寄存器,决定使用那几个中断 (5)配置输出控制寄存器 (6)配置验收码和屏蔽码,决定接收哪一类节点的数据 (7)退出复位模式,进入正常工作模式。
2 发送数据顺序 (1)查询状态寄存器,判断是否正在接收,是否正在发送,是否数据缓冲区被锁。 (2)配置发送缓冲区。 (3)配置命令寄存器,启动发送。
3 接收数据顺序 (1)采用中断接收,关CPU中断。 (2)判断是不是接收中断。 (3)判断是远程帧还是数据帧 (4)读取数据 (5)开中断
CAN软-硬件要则
串口通信
串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。长度可达1200米,电压一般为5V
主要接线为Tx、Rx和地线
串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据
串口通信最重要的参数是比特率、数据位、停止位和奇偶校验:
a,比特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,就是指比特率,例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的比特率为14400,28800和36600。比特率可以远远大于这些值,但是波特率和距离成反比。高比特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0127(7位)。扩展的ASCII码是0255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语"包"指任何通信的情况。
c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
QT程序类
信号与槽机制
元对象编译器 moc对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字以及指向这些函数的指针
当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号 - 槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。
槽是普通的 C++成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。槽的存取权限决定了谁能够与其相关联。同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用
MVC框架
是模型(model)-视图(view)-控制器(controller)的缩写
Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分
View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分
Controller(控制器)处理输入(写入数据库记录)。是应用程序中处理用户交互的部分
其他
堆和栈的区别
1.程序的内存分配
栈(stack):有编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等;
堆(heap):一般有程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放(?这个可能针对Java那样的有回收机制的语言而说的,对于c/c++,这样的必须要手动释放开辟的堆内存),稍有不慎会引起内存泄漏。
2.申请后系统的响应
栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:在记录空闲内存地址的链表中寻找一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统会在这块内存空间的首地址出记录本次分配空间的大小,这样代码中的delete 才能正确释放本内存空间。系统会将多余的那部分重新空闲链表中。
3、申请大小限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
4、分配效率
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
5、存储内容
栈:在栈中,第一个进栈的是主函数下一条指令的地址,然后是函数的各个参数,在大多数编译器中,参数是由右往左入栈,然后是函数中的局部变量。注意,静态变量不入栈。出栈则刚好顺序相反。
堆:一般在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。
可重入函数
可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价(如果必须访问全局变量,记住利用互斥信号量来保护全局变量),不能使用静态局部变量
满足下列条件的函数多数是不可重入的:
1)函数体内使用了静态的数据结构;
2)函数体内调用了malloc()或者free()函数;
3)函数体内调用了标准I/O函数;
4)调用其它任何不可重入的函数
TCP的底层实现
TCP/IP协议族
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
1.SYN包:请求建立连接的数据包
2.ACK包:回应数据包,表示接收到了对方的某个数据包
3.PSH包:正常数据包
4.FIN包:通讯结束包
5.RST包: 重置连接
三次握手”或者说“SYN,SYN/ACK,ACK”
关闭连接(四次分手):
1.一端主动关闭连接。向另一端发送FIN包。
2.接收到FIN包的另一端回应一个ACK数据包。
3.另一端发送一个FIN包。
4.接收到FIN包的原发送方发送ACK对它进行确认。