Closed NickWaterton closed 8 years ago
I do seem to have come up with a workaround, it seems that Serial.peek() returns the correct value!
So if I perform a Serial.peek(), then a Serial.read() and throw away the Serial.read(), I can get the correct values from USBSerial.
here's the Sketch to prove it:
#include "Adafruit_FeatherOLED_WiFi.h"
#include <adafruit_feather.h>
//OLED Featherwing display
#define OLED_RESET 4
Adafruit_FeatherOLED_WiFi display(OLED_RESET);
void setup() {
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.init(); // initialize with the I2C addr 0x3C (for the 128x32)
display.clearDisplay();
display.setRotation(2); //get display the right way up
display.setTextWrap(false); //don't wrap text
display.setTextColor(WHITE,BLACK);
display.setCursor(0,0);
display.print("Waiting for Serial");
display.display();
Serial.begin(115200); // Initialize Serial USB (doesn't actually do anything)
while(!Serial); //wait for serial port
display.clearDisplay();
}
void loop() {
// loopback bytes receved on serial
if(Serial.available()) {
display.clearDisplay();
display.setCursor(0,0);
uint8_t p = Serial.peek();
display.print("peek: 0x");display.println(p, HEX);
display.print("peek: 0d");display.println(p, DEC);
uint8_t c = Serial.read();
display.print("read: 0x");display.println(c, HEX);
display.print("read: 0d");display.println(c, DEC);
display.display();
Serial.write(p);
}
}
output:
sent: 253
sent: 254
sent: 255
received 256 bytes
00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f:20:21:22:23:24:25:26:27:28:29:2a:2b:2c:2d:2e:2f:30:31:32:33:34:3
5:36:37:38:39:3a:3b:3c:3d:3e:3f:40:41:42:43:44:45:46:47:48:49:4a:4b:4c:4d:4e:4f:50:51:52:53:54:55:56:57:58:59:5a:5b:5c:5d:5e:5f:60:61:62:63:64:65:66:67:68:69:6a
:6b:6c:6d:6e:6f:70:71:72:73:74:75:76:77:78:79:7a:7b:7c:7d:7e:7f:80:81:82:83:84:85:86:87:88:89:8a:8b:8c:8d:8e:8f:90:91:92:93:94:95:96:97:98:99:9a:9b:9c:9d:9e:9f:
a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:aa:ab:ac:ad:ae:af:b0:b1:b2:b3:b4:b5:b6:b7:b8:b9:ba:bb:bc:bd:be:bf:c0:c1:c2:c3:c4:c5:c6:c7:c8:c9:ca:cb:cc:cd:ce:cf:d0:d1:d2:d3:d4:d
5:d6:d7:d8:d9:da:db:dc:dd:de:df:e0:e1:e2:e3:e4:e5:e6:e7:e8:e9:ea:eb:ec:ed:ee:ef:f0:f1:f2:f3:f4:f5:f6:f7:f8:f9:fa:fb:fc:fd:fe:ff
End of Data
serial ports closed
Serial.begin(115200); // Initialize Serial USB (doesn't actually do anything)
while(!Serial); //wait for serial port
First of all, it is not relevant but you should not simply while (!Serial); since it will not release the CPU control to process other tasks in featherlib, which handle USBSerial connection event. Please change it to
while(!Serial) delay(1); //wait for serial port
It seems like 0xFF (-1) is misunderstanding as EOF for no data available.
This issue should be fixed with the development branch's featherlib.bin (featherlib version 0.5.5).
Please confirm if it works for you with the Serial.read(), we will close this then.
Thanks for the info about putting delay(1) in the loop.
I have tested as you suggested, and can confirm that the problem is resolved.
Thanks.
when trying to use Serial.read() to read from the USB port, all byte values of 0xFF are read as 0x00.
This makes trying to read anything other than plain text (eg binary data) impossible.
I have tested this behavior with a simple sketch and python script:
Sketch:
Python Script:
Output is:
Notice that the last 255 sent is read as 00. This is confirmed as a USBSerial.read error by the onboard OLED display.
I am willing to try experimental libraries, or fixes as this is a deal breaker for my project right now. The protocol I am using sends the data size in the header, and with FF being read as 00 this will not work (quite apart from trying to avoid ff in binary data is not a possibility).
Help would be appreciated!