rsc3/doc-schelp/HelpSource/Classes/SerialPort.schelp

182 lines
3.7 KiB
Text

class:: SerialPort
summary:: serial port interface
categories:: External Control
ClassMethods::
private::initClass
method::new
opening the port.
argument::port
device path or index.
argument::baudrate
baudrate [4800..230400]
argument::databits
5 | 6 | 7 | 8
argument::stopbit
true | false
argument::parity
nil | 'even' | 'odd'
argument::crtscts
hardware flow control (true | false)
argument::xonxoff
software flow control (true | false)
argument::exclusive
open the device exclusively (true | false)
method::devices
returns an array of available device.
code::
SerialPort.devices;
::
method::listDevices
prints to postbuffer
code::
SerialPort.listDevices;
::
method::devicePattern
change device selection
code::
SerialPort.devicePattern = "/dev/ttyUSB*"; // Linux usb serial
SerialPort.devices;
SerialPort.devicePattern = nil;
SerialPort.devices;
::
method::closeAll
close all ports.
InstanceMethods::
private::initSerialPort, prOpen, prClose, primCleanup, prCleanup, prPut, prDataAvailable, prDoneAction
method::next
Read a byte from the device. Non-blocking read.
method::read
Read a byte from the device. Blocking read.
method::rxErrors
Rx errors since last query.
method::put
Write a byte to the device. Always blocks.
method::putAll
Write multiple bytes to the device. Collection may be link::Classes/Int8Array:: or link::Classes/String::.
method::doneAction
A link::Classes/Function:: which will be evaluated if the port gets closed (maybe unexpectedly so, due to hardware failure or accidental disconnection). This allows you to for example to make a backup solution and activate it (like using fake input data for your algorithm, or trying to reopen the device). By default it will post a message to the post window.
method::close
close the port.
Examples::
code::
(
p = SerialPort(
"/dev/tty.usbserial-181",
baudrate: 9600,
crtscts: true);
)
// read a byte from the device
p.next; // doesn't block
fork{p.read.postln}; // may suspend thisThread - should be called within a routine
// write a byte to the device
fork{p.put(42)}; // may suspend thisThread - should be called within a routine
// write multiple bytes to the device
p.putAll("whaddayawant");
p.putAll(Int8Array[13, 10]);
p.doneAction = { "my serial port got closed".postln; }
p.close; // close the port
SerialPort.closeAll; // close all ports
::
subsection::Arduino write example
First load the sketch Examples/Communication/Dimmer. See http://www.arduino.cc/en/Tutorial/Dimmer
note::
Always make sure the serial monitor is closed in the Arduino application before opening the port in SuperCollider.
::
code::
(
p = SerialPort(
"/dev/tty.usbserial-A800crTT", //edit to match your port. SerialPort.listDevices
baudrate: 9600, //check that baudrate is the same as in arduino sketch
crtscts: true);
)
//send serial data - slow pulsating
(
r= Routine({
inf.do{|i|
p.put(i.fold(0, 100).linexp(0, 100, 1, 255).asInteger.postln);
0.02.wait;
};
}).play;
)
r.stop;
p.close;
::
subsection::Arduino read example
First load the sketch Examples/Communication/Graph. See http://www.arduino.cc/en/Tutorial/Graph
note::
Always make sure the serial monitor is closed in the Arduino application before opening the port in SuperCollider.
::
code::
(
p = SerialPort(
"/dev/tty.usbserial-A800crTT", //edit to match your port. SerialPort.listDevices
baudrate: 9600, //check that baudrate is the same as in arduino sketch
crtscts: true);
)
//read 10bit serial data sent from Arduino's Serial.println
(
r= Routine({
var byte, str, res;
99999.do{|i|
if(p.read==10, {
str = "";
while({byte = p.read; byte !=13 }, {
str= str++byte.asAscii;
});
res= str.asInteger;
("read value:"+res).postln;
});
};
}).play;
)
r.stop;
p.close;
::