我有一个设置为发送一组十六进制数据的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的末尾使用*。
任何人都可以借这个吗?不确定下一步该去哪里。
答案 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。