你好
我在这里寻求一点帮助。我有一个CR1000数据记录器,运行一个程序,在com1(2个控制线输入)上接收RS-232数据。RS232数据是一个36或24字节的消息,起始字符为*,结束字符为LF(换行)。
我尝试过使用SerialInRecord,并将同步字符设置为42,将终止字符设置为10。我将字节数设置为0,所以它应该会拾取整个字符串。我发现这是行不通的。除非我将字节数设置为一个设定值,否则我无法通过数据字符串。
这似乎还可以,因为我正在把绳子穿过。但是有人知道SerialInRecord在找到字符串时是否会清除缓冲区吗?这些消息大约是每秒7条,看起来我只处理了1/4的消息。所以我想知道缓冲区是否被清空了。
我正在以9600波特率运行RS-232,所以速度不是很快。有人对如何传递我所有的信息有什么建议吗?
谢谢你的帮助,
海伦
你好Helene,
缓冲区是一个“缓冲区”;环形缓冲器”;。如果NumBytes设置为0,则缓冲区大小将为SerialOpen缓冲区的大小。此外,如果程序在管道模式下编译,缓冲区将乘以扫描缓冲区选项。
缓冲区需要至少设置为扫描期间可以进入的字节数,再加上至少一个额外的字节。如果您没有额外的字节,则可能存在数据记录器不知道缓冲区中已接收到任何新数据的情况。
自从该指令首次在操作系统中实现以来,它有一些改进,所以如果您仍然有问题,请确保加载了最新的操作系统(可以从CSI网站下载)。
当做
Dana公司
我在使用SerialIn命令时也遇到了类似的问题。你能详细介绍一下如何指定终止字符或字符串吗?我的字符串以CRLF结尾,所以我想指定LF(10??)或CRLF(1310??)。请仔细检查一下这个命令的语义,因为它似乎没有做我需要的事情。
嗨,Buck,
通常,字符串的末尾以CR结尾,然后以LF结尾。使用SerialInRecord,您希望获取CR之前的字符,因此命令中的EndWord应该是&H0D(Hex)或“”;13〃处;。(我总是使用十六进制,OD表示CR,OA表示LF)。
下面是一个我用俯仰和滚转罗盘读取串行字符串的例子:
这是字符串的样子:
$OHPR,149.5,0.0,-0.1,30.3*10美元
字符串是可变长度的,所以我从使用“$";作为BeginWord。这允许我将NBytes保留为零,并让命令计算长度。我们剩下的是OHPR,149.5,0.0,-0.1,30.3*10,在可变指南针$中。
然后,我使用SplitStr将字符串分解为变量组件。
公共指南针$As String*50
公共NBytesCom3
公共CompArray(4)
Alias CompArray(1)=指南针
Alias CompArray(2)=间距
Alias CompArray(3)=滚动
别名CompArray(4)=CompTmp
开始进度
串行打开(Com319200,3,0,50)
扫描(1,秒,0,0)
串行输入记录(Com3,compass$,&H24,0,&H0D,NBytesCom3,01)
SplitStr(CompArray(),指南针$,“&”;,4,4)
结束程序
希望这能有所帮助。
当做
岛民
另一个提示:
确保在最后一个名为“”的参数中得到正确的值;加载NaN”;。如果选择选项00或01,记录器将跳过其缓冲区中最旧的数据,并返回其接收到的最后一条完整记录。下一次,它会在读取的最后一条记录的末尾开始寻找下一条记录。
如果你调用指令的频率低于传感器输出数据的频率,并且你想接收发送的每一条消息,你需要使用选项10或11和循环结构,比如:
i=1
执行串行输入记录(Com1,串行输入目的地(i),37,0,&H0D0A,字节返回,11)
i=i+1
循环直到Nbytesreturn=0
它将一次从缓冲区中读出每个记录,并将其读入一个值数组,直到并包括输入缓冲区中的最后一个完整记录。最后一次nbytesreseturn将为零,dest将保持NaN。
关于serialin,输入终止字符的方式可能过于灵活,也许我们需要更多的例子。
如果您只有一个终止字符,您可以输入is作为数字,例如10表示LF,如果您想要两个或多个字符,则参数必须包含一个可以预先声明的字符串,例如。
Const-termstr=chr(13)+chr(10)'它也可以是一个变量
或者,您可以将chr(13)+chr(10)放在serialin指令中的参数位置。字符串的长度可以超过两个字符BTW。
出于某种原因,我无法解释这与在serialinrecord中输入开始和结束字符的方式不同,在serialin record中需要一个长数字(可以用十六进制输入),并且最多可以使用两个字符。
安德鲁-
当我尝试你推荐的循环时:
i=1
i=i+1
循环直到Nbytesreturn=0
编译器抱怨我在条件语句l中非法使用SerialInRecord()。请帮忙。。。
这是编译器的一个小问题,因为如果它看到有条件地使用serialinrecord,它应该真正迫使程序进入序列模式(我会报告这一点)。如果您在程序中包含sequencialmode命令,那么它应该是可以的。
仅供参考:serialinRecorded被设计为能够以流水线模式运行,以使记录器能够将串行数据与应用程序中的其他测量(如Eddy Covariance测量)同步。
流水线模式的一个特点是,对于每次扫描,它应该以每次扫描相同的次数操作每个测量指令,这样就可以按照流水线操作所需的严格控制的顺序进行调度——这就是为什么它不能处理测量的条件调用或其他一些特殊指令的原因。
顺便说一句,你需要在Do之后的换行符上输入Serialinrecord,不幸的是,这个论坛编辑器会重新格式化你键入的大部分内容。
安德鲁-
我越来越接近了,但当我将编译后的程序发送到CR1000时仍然存在问题。编译器表示没有匹配或错位(在以下每个表达式中:
'83是ascii S(传感器数据)的十进制表示
串行输入记录(Com1、SensorStr、83,0和H0D0A、NbytesRe、11)
'67是ascii C(当前数据)的十进制表示形式
做
串行输入记录(Com1,CurrentStr(ix,0),67,0,&H0D0A,NbytesRe,11)
ix=ix+1
循环直到Nbytesret=0
我在这两种情况下都看不到;请告知。。。
美元
你可能需要把83或67放在引号里“;83〃处;。
不需要报价。
如果没有看到完整的程序,很难调试最后的问题。我所能告诉你的是,在第二个例子中,你引用了一个二维数组,第二个索引为零。
在CRBasic中(和大多数其他基础一样),数组索引从1开始。
如何在DIM或Public语句中声明字符串变量?
安德鲁-
声明如下:
公共传感器字符串*100
Public CurrentStr(20100)为字符串
还尝试了Dim而不是Public,结果相同。谢谢你的帮助。
我想你真的想要:
公共传感器字符串*100
Public CurrentStr(20)为字符串*100
仅供参考:
Public CurrentStr(20100)为字符串
将定义一个默认长度为16字节(16个可用加上一个终止符)的二维字符串数组。
安德鲁-
我尝试了一下,但当我下载到CR1000时仍然遇到了同样的问题。
如果你给我你的电子邮件地址,我可以把程序发给你。
谢谢。
发送到
安德鲁·多特·桑福德在坎贝尔西多特·科多特·英国
将显而易见的改变为适合