Pages: [1]   Go Down
Author Topic: Bit by SoftwareSerial  (Read 3946 times)
0 Members and 1 Guest are viewing this topic.
Central MN, USA
Offline Offline
Tesla Member
***
Karma: 64
Posts: 6893
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I was under the assumption that the arduino 1.0 softwareserial is a rewritten NewSoftSerial authored by Mike Hart but was I so wrong! For a whole morning I was puzzled by it. Why didn't I get anything from my serial LCD keypad?! The not New SoftwareSerial must be very different under the hood from Mike Hart's version. In his version you can use any pins but in this official version you can only use a few select pins for RX. I later learned out from the sample code.
Quote
Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 

As I know Mike's version can't simultaneously receive from multiple instances of NSS (right?).

Does this mean the official SoftwareSerial can simultaneously receive from multiple instances of SoftwareSerial? Thanks.

Further reading:
Quote
It is possible to have multiple software serial ports with speeds up to 115200 bps.

Sounds like more powerful.

In general, how do I get these updates if I'm already using a lot of arduino libraries?
Logged


Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I strongly doubt you could use any version of softwareSerial to receive simultaneously. The ones I have seen use tight timing loops to clock bits in, so once the original bit started it turns interrupts off and you couldn't clock in bits from other ports.

I may be wrong, but I think you will run out of processing power attempting to do it, particularly at high baud rates.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 548
Posts: 46042
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SoftwareSerial (or NewSoftSerial) was not designed for use on a board with 4 hardware serial ports. Why do you need to use it on a Mega?
Logged

Central MN, USA
Offline Offline
Tesla Member
***
Karma: 64
Posts: 6893
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

SoftwareSerial (or NewSoftSerial) was not designed for use on a board with 4 hardware serial ports. Why do you need to use it on a Mega?

I am doing a project that has 2 serial sensors, 1 cell modem and the Serial is reserved for upload and error message so I have to put the serial lcd keypad on software serial.

Paul, can you explain why SoftwareSerial etc was not designed for MEGA? Just because it has plenty serial ports already? Thanks.
Logged


Offline Offline
Sr. Member
****
Karma: 3
Posts: 327
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

this is not an answer, more sympathy.

I bumped into the same problem with software serial on the mega,
    in that I'd wired the serial port on software serial to pins that did not support interupts.

qQED : it did not work,
   I had to move the pins to one of those that does support interrupts on input
     and software serial worked,

Logged

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 168
Posts: 12431
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Software Serial cannot receive OR send simultaneously as SW has to control the timing of the pulses and the Arduino is single threaded.
RX is triggered by an interrupt but TX does not use interrupts. So carefully choosing which pin to RX and TX, increases the (theoretical) amount of soft serial ports.

What I like the most of SoftSerial is that you can create a TX or RX only serial port by declaring the other -1.



Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Central MN, USA
Offline Offline
Tesla Member
***
Karma: 64
Posts: 6893
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Rob, I have not read about the -1 yet. Is it mentioned in reference? Would be helpful for gps or other output only devices and non-smart serial lcds. In my case the lcd returns button pushes and menu choices so both rx and tx are needed.
Logged


Central MN, USA
Offline Offline
Tesla Member
***
Karma: 64
Posts: 6893
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Apparently drjiohnsmith met the same problem as I did. Could this be the source of his problem?

http://arduino.cc/en/Reference/SoftwareSerialConstructor

The example had pins 2 and 3, which are not on the selection of supported pins.
Logged


Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 548
Posts: 46042
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Paul, can you explain why SoftwareSerial etc was not designed for MEGA? Just because it has plenty serial ports already? Thanks.
SoftwareSerial was developed to deal with the situation where one needs to read from, or write to, two serial devices at the same time.

The Mega has that ability natively. Why would one consider the need to use SoftwareSerial on a device with seemingly sufficient hardware serial ports?

Logged

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 168
Posts: 12431
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@liudr
The -1 trick was discussed once in the time the lib was maintained by Michael Hart.
The -1 becomes 255 and that pin does not exist, so it will not generate an ISR().

Have worked with it in 0.22 and 0.23 without problems. If I look at the code of SoftSerial I think it still works.


Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Offline Offline
Sr. Member
****
Karma: 3
Posts: 327
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I would make a few comments.

software serial was made I understand to add extra serial ports to a device that had not sufficient.
  I certainly used it to provide a 5th port on the mega when the design called for one.


I have also used it to give me multiple outputs on a design I needed, wit h no inputs. the -1 was added about that time, may be a year or so ago me thinks, but could be out there.

I think software serial was around before the mega, so was not as such designed for it, or not for it.
   its there if needed.

Logged

0
Offline Offline
God Member
*****
Karma: 24
Posts: 587
Always making something...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Have you tried my AltSoftSerial library?

http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

It only supports a single instance, and requires specific pins, and uses a timer.... but it creates much less interrupt latency than normal SoftwareSerial.  In some cases (with carefully chosen baud rates), it can even be used together with AltSoftSerial and SoftwareSerial in the same project, for 3 serial ports on an Arduino Uno.

Of course, if you're using Mega, Due, Teensy3 or any other board that has multiple real hardware serial, you should always use the hardware serial before resorting to software serial.
Logged

Central MN, USA
Offline Offline
Tesla Member
***
Karma: 64
Posts: 6893
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks Paul. I'll take a look. I am using MEGA with 4 serial devices and the main serial a means of debug print and future plan to send data so I ran out of 4 serials pretty quickly.

Rob and drjohnsmith, I'll remember to use -1 in the future for any software serial that only needs one pin.
Logged


0
Offline Offline
God Member
*****
Karma: 24
Posts: 587
Always making something...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

On Arduino Mega, if you really need 6 serial ports, and 2 of them could run at relatively slow baud rates (eg, 9600 or maybe even 19200 baud)... you probably could use 2 copies of AltSoftSerial.  You'd need to make another copy of the library, change the name to something like AltOtherSerial, and edit its copy of config/known_boards.h to use the other timer.

Mega actually has 4 of those timers, so in theory it would be possible to have 4 copies of AltSoftSerial working simultaneously (at slower baud rates), for 8 serial ports working simultaneously.  Unfortunately, 2 of those 4 timers can't be used, because the input capture pin for those timers is not brought out to any location on the board.  However, if you only wanted to transmit and never receive, you could make modified copies of AltSoftSerial that only transmit.  It's the receive pins that aren't available on Mega's PCB layout.
« Last Edit: March 06, 2013, 07:10:19 am by Paul Stoffregen » Logged

texas
Offline Offline
God Member
*****
Karma: 27
Posts: 862
old, but not dead
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Have you tried my AltSoftSerial library?

http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

It only supports a single instance, and requires specific pins, and uses a timer.... but it creates much less interrupt latency than normal SoftwareSerial.  In some cases (with carefully chosen baud rates), it can even be used together with AltSoftSerial and SoftwareSerial in the same project, for 3 serial ports on an Arduino Uno.

Of course, if you're using Mega, Due, Teensy3 or any other board that has multiple real hardware serial, you should always use the hardware serial before resorting to software serial.

I wan't to second this.  I was using SoftwareSerial to talk to a serial LCD that is currently locked at 9600 baud (no documentation available).  It seriously interfered with the stuff on Timer0 (millis() and delay()) and was causing my clock project to lose massive amounts of time due to lost Timer0 interrupts.  I switched it to Paul's stuff here and it works perfectly now.  There are no more lost interrupts and no more code running for more than 1mS with interrupts disabled (gag).  His stuff works perfectly so far, but I"m not doing simultaneous send and receive.  Since he uses interrupts and apparently the PWM feature for output, I expect it to have no trouble in that situation.
Logged

Experience, it's what you get when you were expecting something else.

Pages: [1]   Go Up
Jump to: