RPi :: WiringPi очень чувствителен к произвольно сдуваемым контактам и другим устройствам. Все они зарегистрированы внутри компании, чтобы избежать неприятностей. Я написал это с менталитетом, ориентированным на безопасность.
Например, в него встроены проверки, так что, если вы попытаетесь запустить второй скрипт, используя тот же номер пин-кода, все закончится неудачей. Вы действительно не хотите отключать и изменять режим вывода, если этот вывод используется для чего-либо сценарием далеко. Вы видите эту ошибку, потому что вы пытаетесь повторно использовать уже используемый пин-код в том же скрипте.
Кроме того, если у вас есть RPi::Pin
объект как $pin
, вы не можете просто произвольно установить его на 0
, так как теперь вы удалили все функциональные возможности и данные объекта. Объект является объектом типа RPi::Pin
. Изменение его на 0
устанавливает его как целое число.
Когда объект $wpi
выходит из области видимости или вызывается clean()
, он сбрасывает все используемые контакты к их настройкам по умолчанию, как они были при вызове сценария и отменяли его регистрацию для повторного использования.
Неразумно просто уничтожать объект булавки, потому что тогда вы не знаете, в каком состоянии он остался. Если вы хотите повторно -используйте булавку:
$wpi->unregister_pin($pin);
$pin = $wpi->pin($pin_number);
Однако unregister_pin()
, хотя и оставленный publi c, является скорее внутренней вещью. Вместо того, чтобы удалять пин-код и повторно инициализировать его, гораздо лучше просто изменить режим или другие параметры на активном пин-коде. По сути, булавка - это то, что почти всегда используется для полного запуска приложения, а не то, что генерируется и уничтожается много раз за один запуск.
Еще лучше, для модульного тестирования я делю вещи на маленькие область применения:
my $pin = 18;
{ # test 1
my $wpi = RPi::WiringPi->new;
my $pin = $wpi->pin($num);
$pin->mode(OUTPUT);
is $pin->mode, OUTPUT, "pin mode is output for pin $num";
# end of scope; everything will be properly cleaned up and destroyed
}
{ # test 2
my $wpi = RPi::WiringPi->new;
my $pin = $wpi->pin($num);
is $pin->mode, INPUT, "pin mode is input for pin $num";
}