【问题标题】:Use perl to send AT commands to modem使用 perl 向调制解调器发送 AT 命令
【发布时间】:2013-11-22 18:16:03
【问题描述】:

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

如果我将类似“ATZ\r”的简单命令写入调制解调器并等待响应,我会收到非常奇怪的数据,例如“\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);
    }

我是否遗漏了一些初始化或其他东西来解决这个问题?

问候 克劳斯

【问题讨论】:

    标签: linux perl serial-port modem


    【解决方案1】:

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

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

    【讨论】:

    • 尝试使用 一次在线阅读,但遗憾的是这并没有改变接收到的数据。
    • 您可以尝试使用终端仿真器(例如屏幕,请参阅cyberciti.biz/faq/unix-linux-apple-osx-bsd-screen-set-baud-rate)连接到设备,然后执行 ATZ 命令,看看响应是什么?我怀疑这可能不是 perl 问题,而是设备的输出可能与您的预期不同。或者,可能使用了错误的通信设置(波特率、奇偶校验、停止位等)。此测试将有助于隔离问题。
    【解决方案2】:

    这可能与截断有关。尝试将“+>”改为“+

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

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

    【讨论】:

    • 我的错误,“+
    【解决方案3】:

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

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

    使用带有以下参数的“stty”命令将我的串口设置为“预期”模式:

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

    也可以使用组合设置“raw”来正确设置所有这些参数。

    -

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多