StreamDevice

Part1 Try to use StreamDevice

写作时间:2020/04/08 系统环境 Ubuntu 19.04

参考的教程

Step1 make a ioc

首先我们使用以下两条命令创建一个名叫first 的ioc的实例:
这个和创建所有的ioc实例是一样的。

makeBaseApp.pl -t ioc first(可以随便取名字)
makeBaseApp.pl -t ioc -i first

然后修改firstApp/src/Makefile文件
在里面添加如下的内容:

first_DBD += base.dbd
first_DBD += stream.dbd
first_DBD += asyn.dbd
first_DBD += drvAsynSerialPort.dbd

first_LIBS += stream
first_LIBS += asyn

然后修改configure/RELEASE文件内容,在里面添加:

ASYN = Asyn模块的路径
STREAM = StreamDevice模块的路径
如果要用Sequencer的话就加这一行,我这里不需要 SNCSEQ =

然后make即可。

Step2 define database and protocol

按照教程里面的例子,我们定义一个string input的record。阅读一下stringin_record文档,再看这个record 的定义 :

直接按照教程里面的示例定义一个protocol文件:

Step3 st.cmd

修改启动脚本里面的内容,添加如下的内容,指定端口的波特率、数据位、奇偶校验等,然后加载定义的数据库文件
opentwocom

运行起来,我们可以看到我们刚刚定义的record
modifyrecord

Part2 StreamDevice文档

官方Streamevice文档
一定要去看这个文档的内容,更加有助于你理解该怎么使用StreamDevice
我下面只把我看完之后觉得有帮助的,重要的东西稍微整理一下

协议文件 protocol

一个协议文件用于一个设备类型
一个protocol文件包含很多条protocols和一些变量(variables)
协议文件一般由record的INP或者OUT field引用
协议文件必须存在放STREAM_PROTOCOL_PATH所定义的文件夹下面
一条协议和一个函数很像,一个唯一的名字和包括的协议体,
协议体中可以包含命令(commands)以及变量赋值

协议的中的命令

协议中的命令可以有如下:

  • out

  • in

  • wait

  • event

  • exec

  • disconnect

  • connect
    我们先了解两个 out就是向该设备写一个字符串,in就是读入一个字符串,然后按照一定的格式解析,比如按照整数来解析,这里的解析方式类似与c语言中printf和scanf。

Record Processing

record被process的时候,protocol is scheduled to start,record保持为active(PACT=1),然后另外一个线程运行protocol
也就是说,protocol在Record Process的时候执行。

Part3 测试我们之前创建的ioc

我们先创建两个虚拟的串口用来测试,打开一个新的终端,输入

socat -d -d PTY PTY

命令执行之后显示的结果,表明创建的两个虚拟串口:一个是/dev/pts/1,另一个是/dev/pts/2 (备注:每次创建的名字可能不一样)
modifyrecord
然后我们重新打开两个终端,用串口调试工具minicom打开这两个虚拟串口,命令分别为:

minicom -D /dev/pts/1
minicom -D /dev/pts/2

test
根据我们前面Part2的知识并结合我们在Part1中的相关定义我们可以知道: 要想看到protocol执行效果,首先record需要被process。但是我们之前的record没有定义SCAN这个field,所以我们要修改我们的record定义 。如图所是,修改之后testnew.proto文件中的ReadConfiguration会每2s钟在设备stream1上执行一次。 test
再根据st.cmd中的这个地方,我们知道,设备stream1对应的串口是/dev/pts/1
test
然后重新打开一个终端,启动我们的ioc,然后我们看到,/dev/pts/2的界面上不断的出现字符"S"。(可以想想为什么?答案在最后)
test
因为ioc运行在/dev/pts/1上,协议的命令是

out "S";
in "!%s"

说明每当我们定义的record testStreamDevice process的时候,就会执行这个协议,向/dev/pts/1写一个字符"S",/dev/pts/1就会发送出去一个字符S,由socat创建出来的两个串口 /dev/pts/1和/dev/pts/2,他们其实是连接在一起的,相当于是一个通道。由/dev/pts/1发送的内容会由/dev/pts/2接受到并且显示在终端上。所以每2s就会在/dev/pts/2上打印出一个S出来。


本文章使用limfx的vsocde插件快速发布