I used a code here to detect on which port the Arduino is connected. However, I cannot run this code: mySerial = new Serial(this, detected_port, 9600);
as it says Error opening serial port COM#: Port not found
. How do I set mySerial
?
at first i would make sure that your environment to test that ?old? code is working.
-
did you run a manually coded port on that connected arduino?
-
did you enable the usual
//println(Serial.list());
again, to see at the console what’s up.
a short test here gives the idea that that code is running
( win7 / 64bit // processing 3.5.3 / Arduino Leonardo /)
but can not be verified as it does not do much and has very poor feedback.
( like for the button operation can not see if working or not )
but i did not see here the ERROR you mentioned.
I tried writing mySerial = new Serial (this, detected_port, 9600)
in the draw()
event as it should always update the serial port to which it reads. It shows that error. Can you show me your code?
Edit: I linked a different hyperlink. This is the code I used, not the previous one.
i used the copy from that website,
but i not understand your test?
did you try to execute that mentioned line
from inside draw() ?
60 times per sec ?
if it is open it can be opened again i suppose??
Please check my edit, I linked a different page, sorry.
no, i will not check,
i asked you to first
- print the COM ports
- make a standard serial connection ( manually /hard coded/ selected port index )
- and use your arduino ( like print all lines the arduino is sending… )
after that can try that “enhanced” graphic port operation idea.
So, I’ll use the enhanced graphic port solution. Since the aforementioned solutions don’t work anyway.
i not understand the logic in your last post,
- if the print / select manually a port / declare the serial connection / use it to get the info arduino is sending /
does NOT work, the graphic operation can also not work??
my argumentation is that you need to make sure that arduino / usb connection / library…
all works as should,
and the graphic port select can only be the second step.
Apparently, I cannot place the mySerial = new Serial(this, COM#, 9600);
in the draw()
event as it becomes an error, even hard-coding it. Maybe it only works in setup()
?
you can not execute it more than one time, and no way 60 times per second…
( but that all has nothing to do with the operation code … )
so please go back to the simplest example for a arduino connection
and start from there.
https://processing.org/reference/libraries/serial/index.html
But is there an event that I can call whenever an Arduino connects via USB or when it disconnects?
you can use the example you linked above, but you have to put
mySerial = new Serial(this, detected_port, 9600);
inside the if-statement at the end of the code, and not separate in the draw() loop.
the last if-statement will only run if a new device actually has been found.
actually, another addition you need is a check if you’ve already initialised the com-device (Arduino).
you can do this by changing
if (device_detected) {
text("Device detected:", 20, 110);
textFont(fnt, 18);
text(detected_port, 20, 150);
}
to
if (device_detected && ser_port /*(or MySerial)*/ == null) {
text("Device detected:", 20, 110);
textFont(fnt, 18);
text(detected_port, 20, 150);
Ser_port /*or MySerial*/= new Serial(this,detected_port,9600);
}
Even with this code, the error still appears.
if ((Serial.list().length > num_ports) && !device_detected)
{
device_detected = true;
boolean str_match = false;
if (num_ports == 0) {detected_port = Serial.list()[0];}
else
{
for (int i = 0; i < Serial.list().length; i++)
{
for (int j = 0; j < num_ports; j++)
{
if (Serial.list()[i].equals(port_list[j])) {break;}
if (j == (num_ports - 1))
{
str_match = true;
detected_port = Serial.list()[i];
}
}
}
}
mySerial = new Serial(this, detected_port, 9600);
}
else if ((Serial.list().length == 0)){device_detected = false;}
can you please post all the code you’re using right now?
/*--------------------------------------------------------------
Program: port_find
Description:
Date: 1 November 2012
Author: W.A. Smith, http://startingelectronics.org
--------------------------------------------------------------*/
import processing.serial.*;
Serial ser_port; // for serial port
PFont fnt; // for font
int num_ports;
boolean device_detected = false;
String[] port_list;
String detected_port = "";
void setup() {
size(400, 200); // size of application window
background(0); // black background
fnt = createFont("Arial", 16, true); // font displayed in window
println(Serial.list());
// get the number of detected serial ports
num_ports = Serial.list().length;
// save the current list of serial ports
port_list = new String[num_ports];
for (int i = 0; i < num_ports; i++) {
port_list[i] = Serial.list()[i];
}
}
void draw()
{
background(0);
// display instructions to user
textFont(fnt, 14);
text("1. Arduino or serial device must be unplugged.", 20, 30);
text(" (unplug device and restart this application if not)", 20, 50);
text("2. Plug the Arduino or serial device into a USB port.", 20, 80);
// see if Arduino or serial device was plugged in
if ((Serial.list().length > num_ports) && !device_detected) {
device_detected = true;
// determine which port the device was plugge into
boolean str_match = false;
if (num_ports == 0) {
detected_port = Serial.list()[0];
}
else {
// go through the current port list
for (int i = 0; i < Serial.list().length; i++) {
// go through the saved port list
for (int j = 0; j < num_ports; j++) {
if (Serial.list()[i].equals(port_list[j])) {
break;
}
if (j == (num_ports - 1)) {
str_match = true;
detected_port = Serial.list()[i];
}
}
}
}
ser_port = new Serial(this, detected_port, 9600);
}
// calculate and display serial port name
if (device_detected && ser_port == null) {
text("Device detected:", 20, 110);
textFont(fnt, 18);
text(detected_port, 20, 150);
ser_port = new Serial(this, detected_port, 9600);
}
}
why did you put
in there twice?
the one in line 66 is causing the problem and is unnecessary.
Oh my bad. But when I commented that out, it errors the second ser_port = new Serial(this, detected_port, 9600);
.
hm, that’s weird. I don’t have that problem…
are you sure you can properly connect to the Arduino normally?
like @kll said, at least try the simplest Arduino connection first.
as a clarification, this is now the code’s using that works:
/*--------------------------------------------------------------
Program: port_find
Description:
Date: 1 November 2012
Author: W.A. Smith, http://startingelectronics.org
--------------------------------------------------------------*/
import processing.serial.*;
Serial ser_port; // for serial port
PFont fnt; // for font
int num_ports;
boolean device_detected = false;
String[] port_list;
String detected_port = "";
boolean connected = false;
void setup() {
size(400, 200); // size of application window
background(0); // black background
fnt = createFont("Arial", 16, true); // font displayed in window
println(Serial.list());
// get the number of detected serial ports
num_ports = Serial.list().length;
// save the current list of serial ports
port_list = new String[num_ports];
for (int i = 0; i < num_ports; i++) {
port_list[i] = Serial.list()[i];
}
}
void draw()
{
background(0);
// display instructions to user
textFont(fnt, 14);
text("1. Arduino or serial device must be unplugged.", 20, 30);
text(" (unplug device and restart this application if not)", 20, 50);
text("2. Plug the Arduino or serial device into a USB port.", 20, 80);
// see if Arduino or serial device was plugged in
if ((Serial.list().length > num_ports) && !device_detected) {
device_detected = true;
// determine which port the device was plugge into
boolean str_match = false;
if (num_ports == 0) {
detected_port = Serial.list()[0];
} else {
// go through the current port list
for (int i = 0; i < Serial.list().length; i++) {
// go through the saved port list
for (int j = 0; j < num_ports; j++) {
if (Serial.list()[i].equals(port_list[j])) {
break;
} else {
str_match = true;
detected_port = Serial.list()[i];
}
}
}
}
}
// calculate and display serial port name
if (device_detected && ser_port == null) {
ser_port = new Serial(this, detected_port, 9600);
connected = true;
}
if (connected) {
text("Device detected:", 20, 110);
textFont(fnt, 18);
text(detected_port, 20, 150);
}
}
like the example says, start the sketch, then connect the Arduino (not the other way around).