Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SoftwareSerial does not compile with Calunium's pins_arduino.h #1

Open
kfuglsang opened this issue Aug 8, 2012 · 9 comments
Open
Assignees

Comments

@kfuglsang
Copy link

When including SoftwareSerial into the Arduino 1.0.1 IDE targeting Calunium 1284P the code wont compile due to compilation errors in SoftwareSerial.cpp.

arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::begin(long int)':
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:398: error: operands to ?: have different types 'int' and 'uint8_t_'
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:399: error: expected primary-expression before ']' token
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:399: error: operands to ?: have different types 'int' and 'uint8_t_'
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::end()':
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:414: error: expected primary-expression before ']' token
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:415: error: expected primary-expression before ']' token
arduino-1.0.1\libraries\SoftwareSerial\SoftwareSerial.cpp:415: error: operands to ?: have different types 'int' and 'uint8_t*'

I found that the problem occurs due to these lines in pins_arduino.h:

define digitalPinToPCICR(p) ifpin(p,&PCICR,(uint8_t *)0)

define digitalPinToPCICRbit(p) ifpin(p,digital_pin_to_pcint[p] >> 3,(uint8_t *)0)

define digitalPinToPCMSK(p) ifpin(p,__pcmsk[digital_pin_to_pcint[]],(uint8_t *)0)

define digitalPinToPCMSKbit(p) ifpin(p,digital_pin_to_pcint[p] & 0x7,(uint8_t *)0)

Changing them to this makes it compilable:

define digitalPinToPCICR(p) ifpin(p,&PCICR,(uint8_t *)0)

define digitalPinToPCICRbit(p) ifpin(p, digital_pin_to_pcint[p] >> 3, 0)

define digitalPinToPCMSK(p) ifpin(p,(uint16_t *)__pcmsk[digital_pin_to_pcint[p]],(uint16_t *)0)

define digitalPinToPCMSKbit(p) ifpin(p, digital_pin_to_pcint[p] & 0x7, 0)

@kfuglsang
Copy link
Author

I'm starting to believe though, that the digitalPinToPCMSK(p) and in particular the __pcmsk array is incomplete. Any help on completing these would be appreciated.

@stevemarple
Copy link
Owner

I've not had chance to test this but the change to uint16_t* does look correct. Why do you believe __pcmsk is incomplete?

@kfuglsang
Copy link
Author

I also added the index 'p' to the array lookup in digitalPinToPCMSK(p).
To be honest, I don't quite recall why I had the belief that the __pcmsk array was incomplete. Most likely it was because I had a number of issues with my code on the Calunium-based board. I traced my problems back to a broken ethernet-library though.

@ghost ghost assigned stevemarple Feb 8, 2013
@stevemarple
Copy link
Owner

I've applied the changes you suggested.

@deladriere
Copy link

Hi Steve
I can compile but cannot use SoftwareSerial
It works on Arduino Uno but the same code (SoftwareSerialExample) doesn't work on Calunium
Did you succeed using it ?
Thx

@stevemarple
Copy link
Owner

@deladriere With two hardware UARTs I've never had the need to use SoftwareSerial.
What pins are you trying to use? If those pins are configured for other functionality that will prevent their use as normal I/O.
Are you sure you have the correct hardware pins?

@stevemarple stevemarple reopened this May 28, 2015
@deladriere
Copy link

I am trying this code
TX pins are OK but no RX pins works (I've tried many pins)

/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 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

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

@stevemarple
Copy link
Owner

Digital pin 10 is the slave select (/SS) for the SPI port. It's normally recommended that it is kept as an output; you're not using SPI so I'm not sure if that still applies. Could you try another pin?

@deladriere
Copy link

Hi Steve just installed the lasted version and still cannot work with the SoftwareSerial
SoftwareSerial mySerial(8, 15); // RX, TX
If I use the Maniacbug board definition (from https://github.com/JChristensen/mighty-1284p) it works fine on the same hardware & pins (with the corrected pin number of course)
Did you ever had success using SoftwareSerial?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants