使用perl将AT命令发送到调制解调器

时间:2013-11-20 11:23:34

标签: linux perl serial-port modem

我有一个嵌入式linux盒子,附带perl 5.10和GSM调制解调器。 我编写了一个简单的perl脚本来通过调制解调器设备文件(/ dev / ttyACM0)读/写AT命令。

如果我将一个类似“ATZ \ r”的simle命令写入调制解调器并等待响应,我会收到非常奇怪的数据,例如“\ n \ n \ nATZ \ n \ n0 \ n \ nOK \ n \ n \ n \ n \ nATZ \ n \ n \ n \ n ...“并且数据不断进入。看起来反应似乎与其他数据混淆。

我希望像“ATZ \ nOK \ n”这样的东西(如果启用了回声)。

如果我手动发送“ATZ”命令,例如minicom一切都按预期工作。

这让我觉得它可能是某种perl缓冲问题,但这只是猜测。

我在perl中打开设备就像这样(我的嵌入式linux perl安装上没有Device :: Serialport):



    open(FH, "+<", "/dev/ttyACM0") or die "Failed to open com port $comport";

并一次读取一个字节的响应:



    while(1) {
        my $response;
        read(FH, $response, 1);
        printf("hex response '0x%02X'\n", ord $response);
    }

我是否缺少一些初始化或其他东西才能做到这一点?

此致 克劳斯

3 个答案:

答案 0 :(得分:2)

我认为你不需要while循环。此代码应发送ATZ命令,等待响应,然后打印响应:

 open(FH, "+>", "/dev/ttyACM0") or die "Failed to open com port $comport";
 print FH ("ATZ\n");
 $R = <FH>;
 print $R;
 close(FH);

答案 1 :(得分:2)

这可能与截断有关。尝试更改“+&gt;”进入“+&lt;”。

或者它可能与缓冲有关,在open()之后尝试unbuffering输出:

select((select(FH), $| = 1)[0]);

答案 2 :(得分:0)

感谢您的回答。虽然不是我问题的明确答案,但它确实让我走上正轨。

正如mti2935所指出的,这确实不是一个perl问题,而只是一个配置问题。

使用&#34; stty&#34;带有以下参数的命令在&#34;期望&#34;中设置我的串口。模式:

  • -opost:禁用所有输出后处理
  • -crnl:不要将CR翻译为NL
  • -onlcr:不要将NL转换为CR NL
  • -echo:不要回显输入(启用此回声并且调制解调器本身的回声给了我双重回声,导致我的脚本出现异常行为)

也可以使用组合设置&#34; raw&#34;以正确的方式设置所有这些参数。

-