1

一連の 16 進データを送信するようにセットアップされた Teensy があります。

これのサンプルは次のとおりです。

383137323736

ご覧のとおり、これは次のように変換されます

817276

これは、十代の側でスワイプしたカードの一部です。

私の問題は、このデータをルビーのコンソールに表示することです。これまでに試したことはすべて、空の文字列を出力するか、まったく出力しません。

配列サイズをチェックするたびに、シリアル回線を介して 16 進数で 1 セットの数字が送信されているため、正しい 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* を使用して、16 進数のセット全体を元の数字に変換しています。Ruby doc によると、unpack は、H の末尾に * を付けて、数値のセット全体を実行する必要があります。

誰でもこれで手を貸してもらえますか? 次にどこに行くべきかよくわかりません。

4

2 に答える 2

0

まず、数字の 16 進値の文字列を変換する方法は次のとおりです。

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

代わりにhexを使用できますto_i(16)

2 桁の 16 進数は、ASCII の数値の値です。unpackを使用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する[]必要はありません。[]

于 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

以前からの変更点は、最初に 16 進数を ASCII にパックする Tim Man の方法を使用していましたが、sp.gets の代わりに sp.read を使用するように while look を変更しました。

于 2012-11-25T05:10:47.283 に答える