我没有在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")
。基本上单引号在其他单引号或双引号之前将它们转换为文字字符。
首先,让我们完成拆分线:
'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
的所有操作;线条是线条,并且不是固定长度。 (我想知道我们是否可以直接检索字符串而不通过字节列表进行转换;这样可以提高效率。但这是完全可以工作的次要因素。)