2009-10-15 34 views
5

Tôi không rõ ràng về cách viết các mảng mã byte đơn giản với ruby, nhiều hơn như vậy Tôi hoàn toàn bối rối về cách sử dụng thư viện Ruby SerialPort, thành thật mà nói tôi có nó hoạt động khá tốt tuy nhiên tôi chỉ thành công trong việc gửi ASCII qua cổng nối tiếp.Viết Byte mảng để nối tiếp với Ruby

Ví dụ nó thực sự đơn giản để viết ASCII:

@sp = SerialPort.new "/dev/tty.usbserial-A6004cNN", 19200 
@sp.write "test" 

Mà rõ ràng viết test với thiết bị nối tiếp. Điều này hoạt động tốt và tôi đã có thể nhận được tất cả các kết quả mong đợi được gửi đến một bộ điều khiển vi mô (arduino) trong trường hợp này. Vấn đề là tôi cần phải viết ra mà các thiết bị nối tiếp sẽ đọc như sau:

{0x01,0x09,0x04,0x00, 'f',0xff,0xcc,0x33} 

Tôi đã cố gắng sử dụng str.unpack nhưng tôi vẫn không thể tạo ra các giá trị hex mong muốn đầu ra như byte như trên.

Trong Java nó là đơn giản sử dụng nó nối tiếp thư viện:

byte[] cmd = { 0x01,0x09,0x04,0x00, 'f',(byte)0xff,(byte)0xcc,(byte)0x33 }; 
serialPort.write(cmd); 

Làm thế nào tôi có thể sản lượng bytecode thích hợp để thiết bị nối tiếp của tôi với Ruby?

Trả lời

6
@sp.write [32.chr, 7.chr, 8.chr, 65.chr].to_s 
@sp.write ["\x01\x09\x04\x00", 'f', "\xff\xcc\x33"].to_s 

Nhưng chúng ta có thể vui chơi nhiều hơn thế (muhahaha ...)

class Array 
    def chr 
    self.map { |e| e.chr } 
    end 
end 

Vì vậy, sau đó:

>> [1,2,3,65,66,67].chr 
=> ["\001", "\002", "\003", "A", "B", "C"] 
>> [1,2,3,65,66,67].chr.to_s 
=> "\001\002\003ABC" 
+0

wow ... tuyệt vời. Tôi không nhận ra nó có thể đơn giản như thế. Cảm ơn! –

Các vấn đề liên quan