2012-04-15 26 views
5

Tôi đang sử dụng serialportgem để đọc từ cổng nối tiếp trong ứng dụng Ruby on Rails 3.2 của tôi. Cổng nối tiếp được sử dụng để ghi dữ liệu từ bảng Arduino. Đá quý được thêm vào Gemfile. Cổng được khởi tạo trong application.rb:Đọc từ cổng nối tiếp trong ứng dụng Ruby on Rails treo

config.serial_port = SerialPort.new "/devttyACM0", 9600 
config.serial_port.read_timeout = 100 

Sự cố xuất hiện khi tôi cố gắng đọc từ cổng này.

@sp = ProjectName::Application::config.serial_port 
@sp.read 

Ứng dụng treo cứng người chết. Tôi đã cố gắng để thực hiện đọc từ một phiên họp pry và mọi thứ đều OK. Nếu tôi đặt read_timeout thành 0, đọc từ pry cũng bị treo. Tôi đã cố gắng đặt read_timeout thành các giá trị lớn hơn mà không có kết quả. Tôi nên làm gì để nó hoạt động?

Cập nhật:

tôi đã cố gắng để thực hiện các hành động tương tự sử dụng sinatraframework. Nó cũng bị treo.

require "sinatra" 
require "serialport" 

get '/' do 
    read_data 
end 

helpers do 
    def read_data 
    sp = SerialPort.new "/dev/ttyACM0", 9600 
    sp.read_timeout = 1500 
    t = sp.read.match(/\d+(\n|\r)+/)[0].gsub!(/(\n|\r)*/,"") rescue nil 
    sp.close 
    t 
    end 
end 

Trả lời

0

Bạn có thể intereact với các thiết bị sử dụng một kịch bản đơn giản, như thế này:

require 'rubygems' 
require 'serialport' 
sp = SerialPort.new "/dev/ttyUSB0" 
sp.write "AT\r" 
while true do 
    printf("%c", sp.getc) 
end 

Trong trường hợp này tôi đã sử dụng một modem GSM. Có thể thiết bị của bạn đang chờ lệnh đầu tiên.

2

Đã xảy ra sự cố tương tự. Việc sửa chữa thực sự dễ dàng, vấn đề là ứng dụng đường ray của bạn liên tục đọc các giá trị mới từ cổng nối tiếp và miễn là đọc các đầu vào đó, nó không làm gì khác, vì vậy trang web của bạn sẽ không bao giờ được xây dựng thực sự.

Hãy thử nếu nó hoạt động nếu ví dụ bạn chỉ cần để cho nó đọc từ cổng nối tiếp một số lần cố định.

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