Kar*_*tle 7 ruby serial-port arduino
我正在尝试通过串口发送一个整数到我的Ardunio.然后芯片将在LED上显示二进制数字.但是,我在尝试通过串行端口将数据作为一个字节发送时遇到了很多麻烦,只要我可以调试以下代码将其作为ASC char值发送.
谁能指出我正确的方向或发现错误?我真的很感激.我已经把头发拉了很长时间.
红宝石
require 'rubygems'
require 'serialport' # use Kernel::require on windows, works better.
#params for serial port
port_str = "/dev/tty.usbserial-A700dZt3" #may be different for you
baud_rate = 9600
data_bits = 8
stop_bits = 1
parity = SerialPort::NONE
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
i = 15
#just write forever
while true do
sp.write(i.to_s(2))
sleep 10
end
Run Code Online (Sandbox Code Playgroud)
Arduino的
int ledPin = 10;
int ledPin1 = 11;
int ledPin2 = 12;
int ledPin3 = 13;
byte incomingByte; // for incoming serial data
void setup() {
pinMode(ledPin, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin1, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin2, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin3, OUTPUT); // initialize the LED pin as an output:
Serial.begin(9600);
Serial.println("I am online");
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.println(incomingByte, DEC);
int value = (incomingByte, DEC) % 16;
digitalWrite(ledPin, (value >> 0) % 2);
digitalWrite(ledPin1, (value >> 1) % 2);
digitalWrite(ledPin2, (value >> 2) % 2);
digitalWrite(ledPin3, (value >> 3) % 2); // MSB
}
}
Run Code Online (Sandbox Code Playgroud)
我猜你正在尝试写入值15,以便立即点亮所有LED.但是,15.to_s(2)是"1111".字符"1"的ASCII值为49,因此,一旦您快速连续写入49次,则不要写入15.
因此,您正在寻找的写命令可能是sp.putc(i).这只会写入一个具有给定二进制值的字符(= Arduino的机器可读),而不是以二进制表示的值的ASCII字符串表示形式(=人类可读).
因此,保持其他所有内容相同,将whileRuby代码中的循环替换为:
loop do
sp.putc(i)
puts 'Wrote: %d = %bb' % [ i, i ]
i = (i == 15) ? 0 : (i + 1)
sleep(10)
end
Run Code Online (Sandbox Code Playgroud)
如果您希望阅读Arduino的回复,您可以使用例如sp.gets获取一行文本,例如尝试放入puts 'Arduino replied: ' + sp.gets循环之前sleep(以及循环之前puts sp.gets读取首次建立连接时发送的"我在线") .
编辑:我刚刚发现你的代码中的另一个问题,在Arduino方面:value = (incomingByte, DEC) % 16;总是得到值10因为(incomingByte, DEC)有值DEC(即10).你应该使用value = incomingByte % 16;.或者完全废除value并修改incomingByte自己,例如incomingByte %= 16;.