1

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

一个示例如下:

383137323736

如您所见,这转化为

817276

这是我在青少年一侧刷过的卡片的一部分。

我现在的问题是让这些数据以 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.

有人可以帮忙吗?不太确定下一步该去哪里。

4

2 回答 2

0

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

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

而不是hex你可以使用to_i(16).

两个十六进制数字是 ASCII 中数字的值。unpackusingH不会做你想做的事。相反,它会像这样使用:

'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[]因为您将立即覆盖其[]值。

于 2012-11-23T21:13:00.880 回答
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 的方法,但也修改了我的 while 外观以使用 sp.read 而不是 sp.gets。

于 2012-11-25T05:10:47.283 回答