ruby串口使用十六进制数据

时间:2012-11-23 02:02:54

标签: ruby serial-port

我有一个设置为发送一组十六进制数据的Teensy。

以下是一个示例:

383137323736

你可以看到这转化为

817276

这是我在teensy方面挥动的卡的一部分。

我现在的问题是让这些数据显示在我的控制台上的ruby中。到目前为止我尝试的任何东西都输出一个空字符串或根本没有输出。

每当我检查数组大小时,它返回1是正确的,因为通过我的串行线路通过十六进制发送了一组数字。

我到目前为止的红宝石代码如下:

require 'serialport'
require 'rubygems'

sp=SerialPort.new "/dev/ttyAMA0", 9600
puts "HELLO"
while 1
        if sp.gets
                ar1 = []
                ar1 = sp.read.unpack('H*')

                puts ar1.length
        end
end
sp.close

所以我使用unpack函数和H *将整个十六进制数转换回原始数字。根据Ruby doc,unpack应该贯穿整个数字集,并在H的末尾使用*。

任何人都可以借这个吗?不确定下一步该去哪里。

2 个答案:

答案 0 :(得分:0)

首先,转换十六进制数字字符串的方法是:

'383137323736'.scan(/.{2}/).map{ |c| c.hex.chr }.join
=> "817276"

而不是hex,您可以使用to_i(16)

两位十六进制数字是ASCII中数字的值。使用unpack的{​​{1}}无法满足您的需求。相反,它会被用作:

H

你想要的是:

'817276'.unpack('H*')
=> "383137323736"

结合所有这些,而不是:

["383137323736"].pack('H*')
"817276"

使用:

ar1 = []
ar1 = sp.read.unpack('H*')

或类似的东西:

ar1 = sp.read.scan(/.{2}/).map{ |c| c.hex.chr }

如果你想要一个字符串。

由于您要立即覆盖其str = [sp.read].pack('H*') 值,因此无需将ar1预初始化为[]

答案 1 :(得分:0)

对我的初始代码进行微小修改是必要的,以使其完全有效。

如果有人正在寻找答案,我的最终代码如下:

require 'serialport'
require 'rubygems'

sp=SerialPort.new "/dev/ttyAMA0", 9600
puts "HELLO"
while sp.read

      sp.read_timeout = 50
      str1 = [sp.read].pack('H*')
      sp.write str1

end
sp.close

之前的变化是首先使用Tim Man的方法将十六进制打包为ASCII,但也修改了我看起来使用sp.read而不是sp.gets。