首页 > 解决方案 > 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)

标签: serial-portdm-script

解决方案


目前我自己无法测试串行命令,确切的脚本代码当然取决于串行连接另一端的内容,即预期的内容和发回的内容。还有什么超时/延迟需要被预期和照顾。但是,我可以看到您的脚本存在两个直接问题:

  • '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 循环中等待特定结果。


推荐阅读