serial-port - DM 串行控制通信
问题描述
在 DM 中运行此脚本会在第一次执行期间导致以下错误。随后的执行在 SPOpen(1,9600,1,0,8) 上失败,我认为这意味着串行端口此时是打开的,但第一次执行表明它不是。
阻止与串行端口通信的意外错误是什么?
SPOpen(1,9600,1,0,8)
SPOpen( "COM1" )
SPSendString(1, "*IDN?" )
string message
number test
message = SPReceiveString(1,8,test)
Result("Acquisition "+message+" "+test+"\n")
SPClose(1)
解决方案
目前我自己无法测试串行命令,确切的脚本代码当然取决于串行连接另一端的内容,即预期的内容和发回的内容。还有什么超时/延迟需要被预期和照顾。但是,我可以看到您的脚本存在两个直接问题:
- 'SPOpen()' 命令返回一个 ID 值。您在后续命令中需要此 ID,而不是端口号。
- 每当脚本失败(即抛出和错误)时,关闭端口的命令永远不会执行并且它保持打开状态(因此被阻塞)。为防止出现这种情况,您可以使用“Try{}Catch{}”构造。
我希望您的脚本看起来更类似于以下内容:
number port = 666
number baud = 9600
number stop = 10
number parity = 0
number data = 8
number portID
try
{
portID = SPOpen( port, baud, stop, parity, data )
Result( "\n Port ("+port+") opened, Handle ID: " + portID )
Result( "\n Sending messge:" + message )
string message = "*IDN?"
SPSendString( portID, message )
Result( "\n messge send." )
// Wait for response
Result( "\n Waiting for response." )
sleep( 0.3 )
number pendingBytes = SPGetPendingBytes(portID)
Result( "\n Pending bytes:" + pendingBytes )
number maxLength = 50
number bytes_back
string reply
while( pendingBytes > 1 )
{
reply += SPReceiveString( portID, maxLength, bytes_back )
pendingBytes = SPGetPendingBytes(portID)
}
Result( "\n Reply:" + Reply )
}
catch
{
// Any thrown error end up here.
// Ensures the port will not remain open
Result( "ERROR OCCURRED.\n" )
break
}
SPClose( portID )
Result( "\n Port ("+port+") closed, using Handle ID: " + portID )
以上是未经测试的代码,肯定需要一些调整,但它应该可以帮助您入门。等待结果时您可能需要一些“延迟”,并且您可能希望在 while 循环中等待特定结果。
推荐阅读
- python - 在python中以特殊顺序合并两个列表
- c# - 如何使用 Win32_ComputerSystem 类转换支持的总内存
- javascript - 从 ReactJS 上传到 NodeJS 时,Req.file 未定义
- javascript - 我无法获取查询到 influxdb 的最新记录
- node.js - 如何从node.js打印变量到html
- css - 无法通过烧瓶中的 css 更改背景图像大小
- java - 即使在释放后如何使按钮保持选中状态?
- scheme - Scheme Lisp 3 × 3 矩阵的行列式
- c - C中的多态性和赋值运算符
- python - gpu 上的张量流很慢,还有更多问题