首页 > 解决方案 > 使用 Perl 操作树莓派的问题

问题描述

我正在尝试使用下面的 perl 代码来检测 Raspberry Pi 湿度传感器上的湿度,并在检测到湿度时采取行动(发送电子邮件)。该代码似乎确实成功地从传感器获得了准确的读数,但是它使我的程序因错误而崩溃:

cleaned up, exiting...

original error: Can't locate object method "tid" via package "threads" at /usr/share/perl/5.28/XSLoader.pm line 111.

这是我的代码:

use strict;
use warnings;
use RPi::DHT11;
use RPi::WiringPi;
use RPi::Const qw(:all);

my $pi = RPi::WiringPi->new;
my $pin = $pi->pin(21);
my $state = $pin->read;
$pi->cleanup;

if ($state == 0) {

    print "The sensor detected moisture.\n";
    # send an email
    my ($msg, $user, $pass) = build_message();

eval {

    print "Executing in eval.\n";

    my ($reply) = $msg->send('smtp','mail.rushlogistics.com',
                 AuthUser=>$user, AuthPass=>$pass);

    print "Reply was: " . $reply . "\n"; # only prints here if there was no problems

    };


} else {

    print "The sensor is dry.\n";


    }

在检查传感器之前在代码中早些时候发送消息可以正常工作。注释掉 my ($reply) = $msg->send 行也可以正常工作。我没有收到任何错误(当然也没有发送任何消息。)

如果我添加use threads;我会得到以下错误:

The sensor detected moisture.
Executing in eval.
MIME::Lite::SMTP>>> MIME::Lite::SMTP
MIME::Lite::SMTP>>>   Net::SMTP(3.11)
MIME::Lite::SMTP>>>     Net::Cmd(3.11)
MIME::Lite::SMTP>>>       Exporter(5.73)
MIME::Lite::SMTP>>>     IO::Socket::IP(0.39)
MIME::Lite::SMTP>>>       IO::Socket(1.39)
MIME::Lite::SMTP>>>         IO::Handle(1.39)
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 220 mail42c28.carrierzone.com ESMTP Bigfoot 1.0; Fri, 15 May 2020 21:37:11 +0000
MIME::Lite::SMTP=GLOB(0x24b01f8)>>> EHLO localhost.localdomain
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-mail42c28.carrierzone.com Hello 63-151-32-226.dia.static.qwest.net [63.151.32.226], pleased to meet you
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-ENHANCEDSTATUSCODES
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-8BITMIME
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-SIZE 52428800
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-DSN
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-AUTH LOGIN CRAM-MD5
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-STARTTLS
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250-DELIVERBY
MIME::Lite::SMTP=GLOB(0x24b01f8)<<< 250 HELP

cleaned up, exiting...

original error: SMTP auth() command failed: Invalid argument
mail42c28.carrierzone.com Hello 63-151-32-226.dia.static.qwest.net [63.151.32.226], pleased to meet you
ENHANCEDSTATUSCODES
8BITMIME
SIZE 52428800
DSN
AUTH LOGIN CRAM-MD5
STARTTLS
DELIVERBY
HELP

标签: perlraspberry-piraspberry-pi3

解决方案


推荐阅读