The problem is in the "setTX" method in the file "SoftwareSerial.cpp" located in the SoftwareSerial subdirectory of the Libraries folder. This code should set the tx pin output/HIGH for UART-polarity serial, and output/LOW for inverted serial. Unfortunately, it ignores the "inverse" case entirely:
void SoftwareSerial::setTX(uint8_t tx) { pinMode(tx, OUTPUT); digitalWrite(tx, HIGH);
Additionally, it ought to set the pin state before turning on the output driver, as the way it's written could generate a brief glitch on the output pin. We can fix both the inverse-mode problem and the glitch by changing it to:
void SoftwareSerial::setTX(uint8_t tx) { digitalWrite(tx, _inverse_logic ? LOW : HIGH ); pinMode(tx, OUTPUT);Now you might be reluctant to change anything in a standard library. It would be easy to forget about the fix when you download a new copy of the Arduino software. Fortunately, there's a simple and harmless workaround that you can use in your sketches: Send a dummy character (0xFF) immediately after configuring the SoftwareSerial object. In the case of our serial displays, like the GLO-216, here's code that squashes the bug without modifying the library code:
#include <softwareserial.h> // use any pin for serial out #define rxPin 255 // Not used, set to invalid pin # #define txPin 3 // Hook GLO serial input to this pin. #define inverted 1 // If GLO Spol jumper is intact (COM-polarity) #define noninverted 0 // If GLO Spol jumper is cut (UART polarity) // SETUP: void setup() { SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin, inverted); mySerial.begin(9600); // set data rate for SoftwareSerial mySerial.write("\xff") ; // write a dummy character to fix setTX bug delay(500); mySerial.write("\x0c") ; // clear the screen mySerial.print("Hello World"); } void loop() { }
No comments:
Post a Comment