В настоящий момент я не могу сам тестировать последовательные команды, и точный код сценария, конечно, зависит от того, что находится на другом конце последовательных соединений, то есть, что ожидается и что отправлено обратно.А также, какие таймауты / задержки следует ожидать и о которых следует заботиться.Тем не менее, я вижу две непосредственные проблемы с вашим скриптом:
- Команда '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.