Serial port 读取串行端口的最新一行

Serial port 读取串行端口的最新一行,serial-port,tcl,serial-communication,scilab,Serial Port,Tcl,Serial Communication,Scilab,我从来没有用tcl写过任何代码,对串行通信也不是很熟悉,所以如果我的问题没有意义,请提前道歉 我正试图解决我想在SciLab中监听串行端口并像普通串行终端(例如Arduino的串行监视器)一样逐行打印更新的问题。具有一个readserial宏(): 其中TCL\u EvalStr解释TCL中的字符串。因此,我的问题是如何改变路线: binary scan [read "+h+" "+string(n)+"] cu* ttybuf binary scan

我从来没有用tcl写过任何代码,对串行通信也不是很熟悉,所以如果我的问题没有意义,请提前道歉

我正试图解决我想在SciLab中监听串行端口并像普通串行终端(例如Arduino的串行监视器)一样逐行打印更新的问题。具有一个
readserial
宏():

其中
TCL\u EvalStr
解释TCL中的字符串。因此,我的问题是如何改变路线:

binary scan [read "+h+" "+string(n)+"] cu* ttybuf
binary scan [read "+h+" "+string(n)+"] cu* ttybuf
所以它只返回串行端口上最新的非空行?如果您能告诉我这条线的用途,我也将不胜感激

p.S.1.到目前为止,我还没有尝试:

但我得到了错误信息:

错误:语法错误,意外字符串,应为“,”或)

在SciLab

p.S.2.定义新功能:

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

给定操作数的未定义操作

检查或定义函数%c_l_s是否重载

在SciLab终端

p.S.3.命令:

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

两者都会导致错误:

错误:检测到异类字符串,以“”开头,以“”结尾

在SciLab

p.S.4.我想如果我使用SciLab命令
TCL\u EvalFile
而不是
TCL\u EvalStr
我可以解决上面的问题。我只需要弄清楚如何将
h
传递给TCL脚本并读回
ttybuf

p.S.5.我通过使用大括号而不是双引号解决了SciLab字符串和
“\n”
之间的疯狂冲突:

 TCL_EvalStr("binary scan [lindex [split [read -nonewline "+h+"] {\n}] end] cu* ttybuf")
然而它仍然没有给我想要的


p.S.6.对于那些由于带引号或双引号的异构字符串而结束于此的人,正确的语法是
'this'“string”“在引号内”
。基本上,在其他单引号或双引号将它们转换为文字字符之前,先使用单引号。

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

binary scan [read "+h+" "+string(n)+"] cu* ttybuf
binary scan [read "+h+" "+string(n)+"] cu* ttybuf
这确实是:

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


现在,你想要使用面向行的阅读。Tcl的
read
命令不能做到这一点(即固定缓冲区或面向整个文件);您需要
获取
以进行面向行的阅读。(当从串行线读取时,您永远不需要整个面向文件的处理;它永远不会达到EOF。您可以使用非阻塞读取进行欺骗……但这相当复杂。)

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

我重新命名了它,并删除了
n
的所有操作;线是线,不是固定长度的。(我想知道我们是否可以直接检索字符串,而无需通过字节列表进行转换;这样效率会更高。但这是实现此功能的第二步。)

非常感谢。现在我得到的要么是空的要么是`,776`,这同样是不正确的。我所需要的是1。检查最后一个字符是否为
\n
2。如果前者正确,则在最后两个
\n
s之间读取。为了解决
“\n”
和SciLab字符串之间的冲突,我应该使用
TCL\u EvalFile
并在TCL脚本中运行该部分命令。再次感谢。我采纳了你的建议,解决了这个问题。你可能会看到结果。一些讨论
function buf=readserialline(h)
   TCL_EvalStr("binary scan [gets "+h+"] cu* ttybuf")
   buf=ascii(evstr(TCL_GetVar("ttybuf")));
endfunction