免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3195 | 回复: 9
打印 上一主题 下一主题

PERL COM口编程的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-05 22:43 |只看该作者 |倒序浏览
各位大大,PERL新手,有个关于串口的问题.使用Hardware:ortScanner模块
问题是这样的,现在我需要写一个脚本,需要把数据以16进制形式发送到串口设备上.但是我在使用Hardware:ortScanner模块时.发现了往串口发送的数据都不是我所指定的HEX代码.请问有什么办法解决么?
还有,能不能提供一下关于WIN32::SERIALPORT或者是DEVICE::SERIALPORT的例子或者是教程.多谢各位了.

  1. use Hardware::PortScanner();
  2. my $com_port = Hardware::PortScanner->new(); #新建对象

  3. $com_port->scan_ports(       
  4.         COM=>1,BAUD=>9600,SETTING=>'8N1',
  5.         TEST_STRING=>0x10.0x04.0x01."\n",         #需要发送的测试代码
  6.         VALID_REPLY_RE=>'^12',);

  7. foreach ($com_port->scan_log)
  8. {
  9.         print "$_\n";
  10. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-01-05 23:38 |只看该作者
自己顶自己...自己坐沙发.

论坛徽章:
0
3 [报告]
发表于 2010-01-06 22:37 |只看该作者
自己继续顶....

论坛徽章:
0
4 [报告]
发表于 2010-01-07 11:13 |只看该作者

回复 #1 tmfc865 的帖子

不了解com口编程这块

  
     TEST_STRING=>0x10.0x04.0x01."\n",         #需要发送的测试代码


这行确定没问题?能简单解释下嘛?.表示字符串连接

TEST_STRING - A string that will produce a response from the device that can be matched against a regular expression (VALID_REPLY_RE below) to confirm the device in desired has been found. This string must include any command terminators (newlines, carriage returns, etc) that are necessary to get the device to recognize the command. Often, a version request command works well as this string.

[ 本帖最后由 mwm5 于 2010-1-7 11:25 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2010-01-07 11:28 |只看该作者

回复 #1 tmfc865 的帖子

我想这肯定不是你想要的~
#!/usr/bin/perl
use warnings;
use strict;

my $TEST_STRIN=0x10.0x04.0x01."\n";
print $TEST_STRIN,"\n";
1641

论坛徽章:
0
6 [报告]
发表于 2010-01-07 11:30 |只看该作者

回复 #1 tmfc865 的帖子

PerlFAQ
How do I convert from decimal to hexadecimal

Using sprintf:
$hex = sprintf("%X", 3735928559); # upper case A-F
$hex = sprintf("%x", 3735928559); # lower case a-f

Using unpack:
$hex = unpack("H*", pack("N", 3735928559));

Using Bit::Vector:
use Bit::Vector;
$vec = Bit::Vector->new_Dec(32, -559038737);
$hex = $vec->to_Hex();

And Bit::Vector supports odd bit counts:
use Bit::Vector;
$vec = Bit::Vector->new_Dec(33, 3735928559);
$vec->Resize(32); # suppress leading 0 if unwanted
$hex = $vec->to_Hex();

[ 本帖最后由 mwm5 于 2010-1-7 11:32 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2010-01-07 11:32 |只看该作者

回复 #1 tmfc865 的帖子

如果你是说要发一个0x100x040x01\n
这样的串的话,应该就很简单了。。
直接用"0x100x040x01\n"就好了!

论坛徽章:
0
8 [报告]
发表于 2010-01-07 11:36 |只看该作者

回复 #1 tmfc865 的帖子

perldoc其实都是很好的教程了。。不了解你那块。。。
但是大概看了你提到的几个模块

SYNOPSIS或者EXAMPLE部分都有很好的模板或者例子啊~

http://search.cpan.org/dist/Devi ... rialPort.pm#EXAMPLE

论坛徽章:
0
9 [报告]
发表于 2010-01-07 15:24 |只看该作者
刚刚有思路了.等我写好就发发代码上来,给大家研究研究.刚试过了

  1. sysopen (FH,"COM1",066) || die "CANNOT OPEN THE COM PORT"; #打开串口.

  2. print FH 0x10.0x40.0x01; #写入数据
  3. close (FH); #关闭
复制代码


这句打开的话就可以直接使用COM串口,但是,串口配置是根据系统默认值来进行数据通信.
看了两天CPAN文档和PERLDOC,发现PERL对硬件(特别是COM口)的描述文档很少,但是对于功能来说..控制串口硬件这块有很多方法可以实现,就如果以最简单就是sysopen和fcntl,其次就是Device::SerialPort模块,但是这个模块的功能实在太多,而且文档比较难理解(因为我E文差).
正在研究还有一个问题就是,我所发送的数据使用16进制的,但是用捕捉串口数据,发现我发送的数据都会被狠狠的分开.也就是说我发送0x10,捕捉程序会变成31 34这样的数据.设备是不认这个命令的.现在有个解决方法,不知道能否解决,cpan上的Device::SerialPort里面有个方法.

  1. use strict;
  2. use Device::SerialPort;
  3. my $port = Device::SerialPort->new("COM1");
  4. $port->baudrate(9600);
  5. $port->parity('none');
  6. $port->databits(8);
  7. $port->stopbits(1);
  8. $port->datatype('raw'); #就是这个,数据变成RAW方式发送到COM口上.
复制代码


就是上面这段代码是典型的Device::SerialPort模块的引用.各位高人能够一起研究研究.

[ 本帖最后由 tmfc865 于 2010-1-7 15:25 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2010-01-08 17:18 |只看该作者
贴一下COM口数据发送代码.总算研究出来了.接下来就是读取COM口返回数据了.

  1. sysopen (FH,"COM1",066) || die "CANNOT OPEN COM PORT"; #打开串口
  2. FH->autoflush(1);
  3. print FH chr(16).chr(04).chr(01); #数据发送.使用chr函数进行转换.转换出来的数据是原始的RAW方式.串口抓数据是一样的.不会打散.
  4. close FH;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP