无论是C++还是C都利用分层思想设计队列,这里拿C++的modbus为例来说明:

一 队列类:

  设计好以下接口:队列元素的单个添加、读取;多个元素的添加和读取、队列的初始化(开始地址、队列大小、元素个数、头尾指针)、队列的清空。

二 串口类:根据市哪个串口定义不同的串口的硬件类,这里以Class Uart1为例:

  串口类中定义静态的队列指针:发送队列指针、接收队列指针、预处理队列指针,刚开始将其置空,在初始化函数中其值接收来自更上层的队列地址,这样串口的队列指针就和上层队列所绑定的缓冲区统一起来。

       接收中断:如果是一般接收中断,就将每个串口接收的字符放到队列指针所指向的队列中;如果是空闲中断则通过内存拷贝函数将串口接收缓冲区的内容都拷贝到接收队列指针指向的队列中。同时设计输出队列的元素个数和指定书目数据的函数

       发送:发送设计成2个队列的数组轮替发送,接口为数据开始地址的指针和长度,判断哪个队列空闲就将其添加进去(入口队列地址指向队列数组中的某一个)。根据发送是否用中断分两种情况:

     轮训发送:查看哪个队列有数据就一直将该队列中的数据全部发完为止,并给出发送完成标志(队列1忙、队列1发送完成、队列1空闲)。

                中断发送:类似,只不过是先启动一个发送,然后在中断中不断重复数据,发送完成给标志。

三 上层应用modbus:

  包含三个队列对象和串口对象以及三个静态缓冲区。初始化时:1 将队列初始化(绑定缓冲区)2 串口初始化:将该队列地址传递到串口的静态队列指针中。

       数据发:调用串口对象的发送;

       数据接收处理:当判断接收队列元素的个数达到要求时就预处理将头尾和校验验证过的数据交给预处理队列指针,清空接收队列;将预处理队列中的数据根据不同的命令类型进行操作,然后清空预处理队列。

四 关于是否将队列设计成环形收发:

  如果讲队列数组设计的大一些,只要能避免队列中接收来不会因不及处理数据就被新添加的覆盖掉就可以设计成环形的。