Loading...
Pages: [1]   Go Down
Author Topic: SoftwareSerial e libreire custom  (Read 235 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti sono Davide e ormai sono completamente perso per Arduino e sto cercando di utilizzarla in un livello più "profondo", ossia scrivendo di mia mano le librerie. Avendo programmato in quasi tutto fuori che C++ sto trovando qualche difficoltà.

Sto scrivendo una semplice libreria per l'invio di segnali MIDI attraverso una SoftwareSerial, che però non invia! Modificando la libreria per l'invio sulla seriale classica non ci sono problemi, quindi i dati vengono inviati in modo corretto. L'unico problema è nella inizializzazione della libreria, spero possiate aiutarmi!

Code: (SoftMIDI.h)
#ifndef SOFTMIDI_H
#define SOFTMIDI_H


#define SERIAL_NAME SoftSer
#define MIDI_BAUDRATE 31520

#include <WProgram.h>
#include "SoftwareSerial.h"

class SoftMIDI
{
public:

SoftMIDI(uint8_t rx, uint8_t tx);
~SoftMIDI();

void begin();
void SendNote(uint8_t pitch, uint8_t velocity, uint8_t channel);

private:

SoftwareSerial SERIAL_NAME;
};

#endif

Code: (SoftMIDI.cpp)
#include "Arduino.h"
#include "SoftMIDI.h"

SoftMIDI::SoftMIDI(uint8_t rx, uint8_t tx):SERIAL_NAME(rx, tx)
{

}

SoftMIDI::~SoftMIDI() {}

void SoftMIDI::begin()
{
SERIAL_NAME.begin(MIDI_BAUDRATE);
}

void SoftMIDI::SendNote(uint8_t cmd, uint8_t pitch, uint8_t velocity)
{
SERIAL_NAME.write(cmd);
SERIAL_NAME.write(pitch);
SERIAL_NAME.write(velocity);
}

Code: (SoftwareMIDI.ino)
#include <SoftMIDI.h>

SoftMIDI soft(2, 3);

void setup()
{
  soft.begin();
}

void loop()
{
  soft.SendNote(0x90, 0x45, map(analogRead(A0), 0, 1023, 0, 127)); 
  delay(10);
}

Premetto che compila e carica correttamente, nella stessa cartella della libreria ci sono i file SoftwareSerial.h e SoftwareSerial.cpp assolutamente non modificati.
Logged

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16517
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non conosco la libreria SoftMIDI. Non è che è incompatibile con la SoftwareSerial? Come opera?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La libreria SoftMIDI è quella che sto scrivendo io!  smiley-grin

Utilizza la SoftwareSerial invece che la seriale normale (vedi qui). Il problema è che da SoftwareSerial non invia nulla, almeno, non rilevo che invii nulla. Ho provato con uno sketch piano e funziona alla grande, però quando passo a scriverlo nella libreria non funfa. Ci potrebbe essere qualche errore nella inizializzazione della SoftwareSerial nella libreria?
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 17
Posts: 526
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prima di tutto nel file SoftMIDI.h ti conviene risolvere il problema delle varie versione di IDE:

Code:
...
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
...

poi, nello stesso file, devi inserire un puntatore alla classe SoftwareSerial, nella definizione della nuova classe: 

Code:
class SoftMIDI {

private:
SoftwareSerial *pSerial; // virtual serial port pointer
...

ed usare questo puntatore per richiamare le varie funzioni in SoftMIDI.cpp:

Code:
#include <SoftMIDI.h>

SoftMIDI::SoftMIDI()
{
}

SoftMIDI::~SoftMIDI()
{
}
 
void SoftMIDI::begin(uint8_t RxPin, uint8_t TxPin, uint32_t Baud)
{
pSerial = new SoftwareSerial(RxPin, TxPin); // create pointer to class instance
pSerial->begin(Baud); // initialize virtual serial port
}

void SoftMIDI::end()
{
pSerial->end(); // close virtual serial port
delete pSerial; // free memory allocated for virtual serial port
}

char SoftMIDI::read() {
return pSerial->read(); // generic read
}
 
void SoftMIDI::write(char Tx) {
pSerial->write(Tx); // generic write
}

void SoftMIDI::print(String Buffer) {
pSerial->print(Buffer); // generic print
}
Logged

Cagliari
Offline Offline
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nell'ultima versione della libreria MIDI (4.0) non riesco a capire se è già sopportata la softserial.  smiley-sweat
--> https://github.com/FortySevenEffects/arduino_midi_library/tree/master/src

Code:
#if MIDI_AUTO_INSTANCIATE
#   if MIDI_USE_SOFTWARE_SERIAL
#       ifndef FSE_AVR
#           include "../SoftwareSerial/SoftwareSerial.h"
            SoftwareSerial softSerialClass(MIDI_SOFTSERIAL_RX_PIN,
                                           MIDI_SOFTSERIAL_TX_PIN);
#       else
#           error Todo: implement SoftwareSerial for avr core.
#       endif
#       undef  MIDI_SERIAL_PORT
#       define MIDI_SERIAL_PORT softSerialClass
        MIDI_NAMESPACE::MidiInterface<SoftwareSerial> MIDI(MIDI_SERIAL_PORT);

#   else
#       ifdef FSE_AVR
#           include <hardware_Serial.h>
#       else
#           include "HardwareSerial.h"
#       endif
        MIDI_NAMESPACE::MidiInterface<HardwareSerial> MIDI((HardwareSerial&)Serial);
#   endif // MIDI_USE_SOFTWARE_SERIAL
#endif // MIDI_AUTO_INSTANCIATE

EDIT:
Si. C'è.  smiley-mr-green
--> https://github.com/FortySevenEffects/arduino_midi_library/blob/master/res/Examples/MIDI_Bench/MIDI_Bench.ino
« Last Edit: February 15, 2013, 09:47:04 am by PaoloP » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non puoi dirmi queste cose  smiley-cry

In ogni caso andrò avanti a fare la mia personale, magari più lightweight dato che devo inserirci un po' tante di funzionalità. In ogni caso il codice postato da cyberhs è corretto, grazie mille! smiley
Logged

Cagliari
Offline Offline
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non puoi dirmi queste cose  smiley-cry

 ]smiley ]smiley
Logged


Pages: [1]   Go Up
Print
 
Jump to: