จากตัวอย่างใน 07. serial write 1 ใช้คำสั่ง Serial.write(byte); จะทำได้เฉพาะเลขจำนวนเต็ม จาก 0 - 255 เท่านั้น ถ้าต้องการส่ง เลขจำนวนเต็มที่มีทั้งค่าบวกและ ลบ ทำได้ 2 วิธีดังนี้
1. ทำเป็น String แล้วค่อยส่ง ดูได้จาก ตัวอย่างใน Processing 08. serial to graph 2
2. ใช้คำสั่ง Serial.write(byte); แต่ปรับค่าให้เป็นเลขจำนวนเต็มบวกเสียก่อน ตัวอย่างโปรแกรมนี้จะทำการคำนวนค่า Sine wave ที่มีขนาด (Amplitude) เป็นสูงสุด 100 และ ต่ำสุด -100
/* RS232 print data*/
int val = 0;
float amplitude = 100;
float angle = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
val = (int)(100+amplitude*sin(3.14159265*angle/180.0)); //+100 ใช้เพื่อปรับค่า - 100 ให้เป็น 0
Serial.write(val); //send number
//Serial.println(val);
angle++;
if(angle>=360) angle=0;
delay(100);
}
สำหรับโปรแกรม Processing ที่ใช้รับข้อมูลเป็นดังนี้
โปรแกรมนี้มีความแตกต่างคือ
1. การเขียนกราฟจะทำเมื่อมีข้อมูลใหม่เข้ามา
2. ทำเป็นฟังก์ชั่นย่อยๆ
import processing.serial.*;
Serial myPort; // กำหนดตัวแปรสำหรับพอร์ทอนุกรม
float[] vals;
int zero_line;
void setup()
{
size(400,300); // ขนาดหน้าต่างแสดงผล
smooth();
println(Serial.list()); // แสดงพอร์ทที่มีอยู่
myPort = new Serial(this, Serial.list()[1], 9600); // เรียกใช้พอร์ทหมายเลข [1]
vals = new float[width]; // An array for store data, array size = width of windows (400)
zero_line = height/2; //Location for vals = 0;
for (int i = 0; i < vals.length; i++)
{
vals[i] = 0; //initial value
}
}
void draw() {
// Add a new value
while (myPort.available() > 0)
{
get_data();
background(255);
draw_line();
}
}
void get_data()
{
// Slide everything down in the array
for (int i = 0; i < vals.length-1; i++) {
vals[i] = vals[i+1];
}
int inByte = myPort.read(); //อ่านข้อมูลจากพอร์ทอนุกรม
println(inByte);
vals[vals.length-1] = inByte-100; //-100 ใส่เพื่อปรับให้เป็นค่าเดิมก่อนที่จะส่งมา
}
void draw_line()
{
// Draw lines connecting all points
for (int i = 0; i < vals.length-1; i++)
{
stroke(0);
strokeWeight(1);
line(i,zero_line -vals[i],i+1,zero_line -vals[i+1]);
}
}
ผลการทำงาน