读取串口的最新一行

问题描述 投票:0回答:1

我没有在tcl中编写任何代码,也没有在串口通信上写新手,所以如果我的问题没有意义,请提前抱歉。

我正在尝试解决this problem我想听一个串口并在SciLab中逐行打印更新,就像一个普通的串行终端(例如Arduino的串行监视器)。 Serial Communication Toolbox for Scilab有一个readserial宏(source on GitHub):

function buf=readserial(h,n)
   if ~exists("n","local") then
     N=serialstatus(h); n=N(1)
   end
   TCL_EvalStr("binary scan [read "+h+" "+string(n)+"] cu* ttybuf")
   buf=ascii(evstr(TCL_GetVar("ttybuf")));
endfunction

qazxsw poi在tcl中解释一个字符串。所以我的问题是我如何改变这条线:

TCL_EvalStr

所以它只返回串口上最新的非空行?我还要感谢你能否知道这条线的作用是什么?

P.S.1。到目前为止,我试过binary scan [read "+h+" "+string(n)+"] cu* ttybuf

here

但我收到错误信息:

错误:语法错误,意外字符串,期待“,”或)

在SciLab中。

P.S.2。定义新功能:

 TCL_EvalStr("binary scan [lindex [split [read -nonewline "+h+" "+string(n)+"] "\n"] end] cu* ttybuf")

导致错误消息:

给定操作数的未定义操作。

检查或定义函数%c_l_s以进行重载。

在SciLab终端。

P.S.3。命令:

function buf=readlnserial(h)
   TCL_EvalStr("binary scan [lindex [split [read -nonewline "+h+"] \"\n\"] end] cu* ttybuf")
   buf=ascii(evstr(TCL_GetVar("ttybuf")));
endfunction

要么

TCL_EvalStr('[split [read -nonewline '+h+'] "\n"]')

两者都导致错误:

错误:检测到异构字符串,以“结束”开头。

在SciLab中。

P.S.4。我想如果我使用SciLab命令TCL_EvalStr("[split [read -nonewline "+h+"] '\n']") 而不是TCL_EvalFile我可以解决上面的问题。我只需要弄清楚如何将TCL_EvalStr传递给tcl脚本并回读h

P.S.5。通过使用花括号而不是双引号,我能够解决SciLab字符串和ttybuf之间的疯狂冲突:

"\n"

但是它仍然没有给出我正在寻找的东西。

P.S.6。对于那些因为带引号或双引号的异构字符串而在这里结束的人,正确的语法是 TCL_EvalStr("binary scan [lindex [split [read -nonewline "+h+"] {\n}] end] cu* ttybuf") 。基本上单引号在其他单引号或双引号之前将它们转换为文字字符。

serial-port tcl serial-communication scilab
1个回答
1
投票

首先,让我们完成拆分线:

'this '"string'" is inside quotation'

这真的是这样的:

binary scan [read "+h+" "+string(n)+"] cu* ttybuf

其中binary scan [read CHANNEL NUM_BYTES] cu* ttybuf 实际上是您正在读取的Tcl通道的名称(可能应该处于二进制模式,但这超出了您所显示的代码的范围),而CHANNEL是要读取的字节数。然后将其处理为数字列表(写入Tcl变量NUM_BYTES),这些数字是读取的无符号字节。


现在,您想要使用面向行的阅读。好吧,Tcl的ttybuf命令不会这样做(这是固定缓冲区或整个文件导向);你需要read进行面向行的阅读。 (从串行线读取时,您永远不需要整个面向文件的处理;它永远不会达到EOF。您可以使用非阻塞读取进行欺骗......但这非常复杂。)

gets命令将返回从通道读取的下一行,并删除行尾标记。我们仍然可以将它与二进制通道一起使用(这有点奇怪,但并非不可能),这意味着我们可以这样做:

gets

将其转换回您所拥有的所有包装器:

binary scan [gets CHANNEL] cu* ttybuf

我改名了,我删除了function buf=readserialline(h) TCL_EvalStr("binary scan [gets "+h+"] cu* ttybuf") buf=ascii(evstr(TCL_GetVar("ttybuf"))); endfunction 的所有操作;线条是线条,并且不是固定长度。 (我想知道我们是否可以直接检索字符串而不通过字节列表进行转换;这样可以提高效率。但这是完全可以工作的次要因素。)

© www.soinside.com 2019 - 2024. All rights reserved.