DM SerialControl Communication - PullRequest
       25

DM SerialControl Communication

0 голосов
/ 06 февраля 2019

Запуск этого скрипта в DM приводит к следующей ошибке при первом выполнении.Последующие выполнения завершаются неудачно в SPOpen (1,9600,1,0,8), что, я думаю, подразумевает, что последовательный порт открыт в этот момент, но первое выполнение говорит, что это не так.

Какая непредвиденная ошибка мешает связи с последовательным портом?

Run script error

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)

1 Ответ

0 голосов
/ 07 февраля 2019

В настоящий момент я не могу сам тестировать последовательные команды, и точный код сценария, конечно, зависит от того, что находится на другом конце последовательных соединений, то есть, что ожидается и что отправлено обратно.А также, какие таймауты / задержки следует ожидать и о которых следует заботиться.Тем не менее, я вижу две непосредственные проблемы с вашим скриптом:

  • Команда 'SPOpen ()' возвращает значение идентификатора.Этот идентификатор необходим в последующих командах, а не номер порта.
  • При каждом сбое сценария (т. Е. Сбрасывании и ошибке) команда закрытия порта никогда не выполняется и остается открытой (и, следовательно, заблокированной).Чтобы защититься от этого, вы можете использовать конструкцию 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.

...