Chinaunix

标题: 请哥哥姐姐帮忙看看一段小程序!(已解决) [打印本页]

作者: ykredrum    时间: 2010-02-09 23:50
标题: 请哥哥姐姐帮忙看看一段小程序!(已解决)
本帖最后由 ykredrum 于 2010-03-13 23:00 编辑

想用个小程序,由电脑控制手机发短信,以前在论坛上找到过例子,稍微改了下

手机:Nokia 6300

——————————————————————————————————————————————
代码如下:

use strict;
use Device::Gsm;


my $pin  = '0000';
my $gsm = new Device::Gsm( port => 'COM4', pin => $pin,log => 'file,send.log' );

die "cannot create Device::Gsm object!" unless $gsm;

$gsm->connect( baudrate => 19200 ) or die "cannot connect to GSM device on [COM4\]\n";

$gsm->register() or die "cannot register on GSM network: check pin and/or network signal!";

print "\nok! connected and registered to network.\n";


my $lOk = $gsm->send_sms(
           content => 'hello world' ,
           recipient => 'xxxxxxxxx',  #接收短息的手机号码
           status_report=>1,

        );
if($lOk){
   print "successful!/n";
}else{
   print "failed!/n";
}

————————————————————————————————————————————

程序运行后出现错误,具体如下:

E:\>perl yk.pl
Missing REQUIRED setting for BAUD at D:/strawberry/perl/site/lib/Device/Modem.pm
line 506
write_settings failed, closing port at D:/strawberry/perl/site/lib/Device/Modem.
pm line 506
Missing REQUIRED setting for BAUD at D:/strawberry/perl/site/lib/Device/Modem.pm
line 506
write_settings failed, closing port at D:/strawberry/perl/site/lib/Device/Modem.
pm line 506
cannot register on GSM network: check pin and/or network signal! at yk.pl line 1
4.

————————————————————————————————————————————

以前用天语的手机发送成功过,手机换了后就出现错误了
不知道怎么回事我设置了  baudrate => 19200
错误一直说我没有设置。
请哥哥姐姐帮帮忙!谢谢了先
作者: climby    时间: 2010-02-10 10:28
有可能是bautrate不正确导致的,你可以尝试一下不同的bautrate,   有些用的是9600, 不同型号的手机这个参数有差别的。
另外,你可以使用超级终端连一下你的手机,看看设什么bautrate能连上
作者: ykredrum    时间: 2010-02-10 18:00
感谢哈!我试试再说!
谢谢
作者: ykredrum    时间: 2010-02-10 23:34
非常奇怪,用了超级终端,发at返回ok,但是部分at+的命令不能用,返回error。于是想去下个serial monitor监测下,但是要收费,然后就下了个PortMon!运行PortMon,接着运行上面的脚本,结果原来要出错的,现在变成成功了,我一个字符都没有改过。郁闷,把PortMon关了,在运行脚本也成功了。
茫然中……不知道怎么回事
有没有高手知道!额滴神呐
作者: ykredrum    时间: 2010-02-12 01:08
找到出错的地方了
重启电脑,然后电脑和手机都开蓝牙,然后连接好,运行脚本,出现开始的错误,
然后运行超级终端,输入命令at,终端返回ok,接着关闭超级终端,再运行脚本,
脚本运行成功,能发短信!
没有弄明白怎么回事,为什么要想运行一次超级终端,脚本才能正确运行?
有没有哥哥姐姐知道呀,怎么解决这个问题啊,不可能每次都要运行一次这个超级终端吧
好麻烦哟
先感谢了!
作者: DQP    时间: 2010-02-12 01:53
这么晚还在。。
不懂。 等着看结果
换一个手机呢?
作者: wfnh    时间: 2010-02-12 21:28
不懂这东西
作者: ykredrum    时间: 2010-02-13 09:19
感谢关注
虽然现在仍然没有解决。郁闷啊
搞不懂,
希望继续关注!
作者: flw    时间: 2010-02-13 10:59
大过年的,能不能整点儿别的啊。
作者: ykredrum    时间: 2010-02-15 22:44
……
不懂的问一下大家,也算学习下吧
其他又不会。
希望版主不要嫌弃
作者: ykredrum    时间: 2010-02-28 11:58
找到出错的地方了
问题出在模块 win32::serialport,就是baudrate不能设置
用了个下面一段代码检查

use Win32::SerialPort;
my $Serial = new Win32::SerialPort('COM4') or die "Serial port died";
$Serial->baudrate(19200);
$Serial->parity('none');
$Serial->databits(;
$Serial->stopbits(1);
$Serial->handshake('none');
$Serial->buffers(4096, 4096);
$Serial->error_msg(1);
$Serial->user_msg(1);
print "baud rate: ", join(" ", $Serial->baudrate), "\n";
$Serial->write_settings || die "Failed to write settings";

程序结果出现上面同样的错误提示,显示baudrate是1200,$Serial->baudrate(19200);这句似乎没有效果。
解决办法,代码如下:

use Win32::SerialPort;
my $Serial = new Win32::SerialPort('COM4') or die "Serial port died";
$Serial->{"_L_BAUD"}{19200} = 19200;
$Serial->baudrate(19200);
$Serial->parity('none');
$Serial->databits(;
$Serial->stopbits(1);
$Serial->handshake('none');
$Serial->buffers(4096, 4096);
$Serial->error_msg(1);
$Serial->user_msg(1);
$Serial->write_settings || die "Failed to write settings";
添加红色的代码,就能成功运行

问题:
为什么模块的这个方法不能正确设置属性呢?原因是什么啊?
请大哥大姐们帮忙!谢谢
作者: beyondfly    时间: 2010-03-03 00:58
LZ用什么接口连接手机的
作者: ykredrum    时间: 2010-03-03 01:16
用蓝牙连接的

郁闷啊,好不容易把模块里面改了一下可以用了
但是只能发短信,很多at命令不支持,返回error,看来更多功能不能用了,
换了个三星的手机,大部分命令都支持,可惜是别人的手机,自己的不支持。

随便说一句,可以发中文的短信,坛子里有人改过的模块,好像现在那个链接不能用了
需要的说声,我可以把那个强人改过的模块传上来
作者: ykredrum    时间: 2010-03-13 22:59
最终解决办法,修改模块CommPort.pm,
将第791行的  $self->{"_L_BAUD"}= {};
改成
$self->{"_L_BAUD"}= {19200 => 19200};
就可以了!
作者: Pro_sky    时间: 2010-03-14 19:09
恩,不错,下次自己写类似程序的时候,可能也会碰到类似问题哦




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2