查询流,串行输入Swi prolog

时间:2017-05-08 10:09:28

标签: arduino prolog swi-prolog

我有一个简单的arduino设置,读取电位器并将输出写入串行连接。

void setup() {
 // initialize serial communication
 Serial.begin(9600);
}

void loop() {
 // read the value of A0, divide by 4 and
 // send it as a byte over the serial connection
 Serial.write(analogRead(A0) / 4);
 delay(20);
}

我想有一个prolog程序在后台监视这个流。我希望它记录某些事件,但我也可以随时查询流。

我真的不知道从哪里开始设置它。我如何实际读取流,然后我如何有两个进程/线程(不知道该怎么称呼它们)。一个进程监视流,第二个进程运行顶级,所以我可以查询动态数据库?

我想象的是:

:-dynamic currentvalue/1.

startthread1 :-
 loop.

loop :- read_serial(X),
    check(X),
    retractall(currentvalue(_)),
    assertz(currentvalue(X)),
    loop.

check(X):-
  X>100,
  get_time(Time),
  write_file(Time,X).
check(_).

*我省略了write_file的def

我想我会查询:

?- thread_create(startthread1, Id, [alias(serial_mon)]).

然后我仍然可以通过顶层查询`currentvalue / 1'我想什么时候?

这会有用吗?我如何定义read_serial/1。 ?另外我如何停止我命名为serial_mon的线程?

更新

我已将循环代码更改为以下内容:

void loop() {
 // read the value of A0, divide by 4 and
 // send it as a byte over the serial connection
 Serial.print(analogRead(A0) / 4);
 Serial.print('.');
 delay(100);
}

如果我查看串行监视器,我现在得到如下输出:

205.205.205.205. etc

我认为我应该能够通过read / 2阅读?

如果我的序言很简单:

go(File):-
 open(File,read,Stream,[]),
 read(Stream,X),
 writeln(X),
 close(Stream).

我查询:

?-go('/dev/ttyACM0').

我没有输出。我做错了什么?

0 个答案:

没有答案