我有一个embedded式linux框与Perl 5.10和GSM调制解调器连接。 我写了一个简单的perl脚本来通过调制解调器设备文件(/ dev / ttyACM0)读/写AT命令。
如果我写一个类似“ATZ r”的simle命令到调制解调器并等待响应,我会收到很奇怪的数据,比如“ n n n n n n n n n n n nATZ n n n n …“,并且数据一直在进来。它几乎看起来像是响应与其他数据混淆了。
我希望像“ATZ nOK n”(如果启用回声)。
如果我用例如minicom手动发送“ATZ”命令一切都按预期工作。
在linux上启用stream量控制的串行通信 – 不良行为
如何在linux中创build虚拟io设备,将数据代理到真实设备?
select()似乎不适用于TTY
如何将windows COM端口输出redirect到文件?
windows 7中的串行端口输出缓冲区大小
这导致我认为这可能是某种perl缓冲问题,但这只是猜测。
我用perl打开设备(我的embedded式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串行端口上的写/输出缓冲区空间的数量?
自定义波特率
串行(UART)caching溢出高速
linux串口监听器和解释器?
C#激活蓝牙串口服务
我不认为你需要while循环。 这个代码应该发送ATZ命令,等待响应,然后打印响应:
open(FH,"+>","/dev/ttyACM0") or dIE "Failed to open com port $comport"; print FH ("ATZn"); $R = <FH>; print $R; close(FH);
这可能与截断有关。 尝试将“+>”更改为“+ <”。
或者它可能与缓冲有关,在open()之后尝试unbuffering输出:
select((select(FH),$| = 1)[0]);
感谢您的回答。 虽然不是我的问题的明确答案,但它确实使我走上了正轨。
正如mti2935所指出的,这确实不是一个perl问题,而只是一个简单的配置问题。
使用具有以下参数的“stty”命令将我的串行端口设置为“预期”模式:
-opost:禁用所有输出后处理
-crnl:不要把CR翻译成NL
-onlcr:不要把NL翻译成CR NL
-echo:不要回显输入(启用此回声,并在调制解调器本身回显给我双重回声,导致我的脚本奇怪的行为)
也可以使用组合设置“raw”以正确的方式设置所有这些参数。
–
总结以上是内存溢出为你收集整理的使用perl将AT命令发送到调制解调器全部内容,希望文章能够帮你解决使用perl将AT命令发送到调制解调器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)