Hey,
I want to send data (array of 30000 floats) to PC. Now I have it via USB. I found some examples with Serial.write but it seems too slow.
What is important for me is to transfer data under 0.5 second.
Does anyone have experience with this?
Thanks
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0, 1); // RX, TX
float y = 0;
#define BUFFER_SIZE (30000)
float buf[BUFFER_SIZE];
void setup()
{
Serial.begin(38400);
mySerial.begin(38400);
}
void loop()
{
for (int i = 0; i < BUFFER_SIZE; i++) {
y = random(1, 500) / 100.0;
buf[i] = y;
// mySerial.write(y);
}
mySerial.write(buf);
delay(1000);
}
C:\Users\kurte\Documents\Arduino\yyy\yyy.ino: In function 'void loop()':
C:\Users\kurte\Documents\Arduino\yyy\yyy.ino:19:21: warning: invalid conversion from 'float*' to 'uint8_t {aka unsigned char}' [-fpermissive]
mySerial.write(buf);
^
In file included from C:\Users\kurte\Documents\Arduino\yyy\yyy.ino:1:0:
c:\Users\kurte\Documents\Arduino\libraries\SoftwareSerial/SoftwareSerial.h:64:17: note: initializing argument 1 of 'virtual size_t SoftwareSerial::write(uint8_t)'
virtual size_t write(uint8_t byte);
^
#include <SoftwareSerial.h>
#define RX 0
#define TX 1
SoftwareSerial sserial = SoftwareSerial(RX, TX);
String data;
#define BUFFER_SIZE (100)
String buf[BUFFER_SIZE];
void setup() {
sserial.begin(9600);
for(int i=0; i<BUFFER_SIZE; i++) {
buf[i] = "1";
}
}
void loop() {
while(sserial.available()) {
char c = sserial.read();
if (c != -1) {
data += c;
if (c == '\n') {
Serial.println(data);
sserial.print(data); [B]// no problem - I can see text on my mobile[/B]
sserial.write((char*)buf, sizeof(buf)); [B] // I see just nonsense chars on my mobile[/B]
data = "";
break;
}
}
}
}
String data;
#define BUFFER_SIZE (100)
String buf[BUFFER_SIZE];
void setup() {
Serial1.begin(9600);
for(int i=0; i<BUFFER_SIZE; i++) {
buf[i] = "1";
}
}
void loop() {
while(Serial1.available()) {
char c = Serial1.read();
if (c != -1) {
data += c;
if (c == '\n') {
Serial.println(data);
Serial1.print(data); // no problem - I can see text on my mobile
Serial1.write((char*)buf, sizeof(buf)); // I see just nonsense chars on my mobile
data = "";
break;
}
}
}
}
Not sure what you are expecting with 100 String objects.UPDATED code but same issue:
String data;
#define BUFFER_SIZE (100)
char buf[BUFFER_SIZE];
int cch = 0;
void setup() {
Serial1.begin(9600);
for(int i=0; i<BUFFER_SIZE; i++) {
buf[i] = `1`;
}
}
void loop() {
while(Serial1.available()) {
int c = Serial1.read();
if (c != -1) {
data += c;
buf[cch++] = c;
if (c == '\n') {
Serial.println(data);
Serial1.print(data); // no problem - I can see text on my mobile
Serial1.write(buf, cch); // I see just nonsense chars on my mobile
data = "";
cch = 0;
break;
}
}
}
}
String data;
#define BUFFER_SIZE (30000)
String buf[BUFFER_SIZE];
int in_time;
int out_time;
void setup() {
Serial1.begin(9600);
}
void loop() {
while(Serial1.available()) {
char c = Serial1.read();
if (c != -1) {
data += c;
if (c == '\n') {
Serial.println(data);
Serial1.print(data);
in_time = micros();
for(int i=0; i<BUFFER_SIZE; i++) {
buf[i] = String(random(1, 500) / 100.0);
Serial1.println(buf[i]);
}
out_time = micros();
Serial.println(out_time-in_time);
data = "";
break;
}
}
}
}
As I said earlier if you use write you are sending 4 BYTES of BINARY data. If you used print that binary data is converted into MANY MORE BYTES is ASCII text.I am testing this code:
Code:#include <SoftwareSerial.h> #define RX 0 #define TX 1 SoftwareSerial sserial = SoftwareSerial(RX, TX); String data; #define BUFFER_SIZE (100) String buf[BUFFER_SIZE]; void setup() { sserial.begin(9600); for(int i=0; i<BUFFER_SIZE; i++) { buf[i] = "1"; } } void loop() { while(sserial.available()) { char c = sserial.read(); if (c != -1) { data += c; if (c == '\n') { Serial.println(data); sserial.print(data); [B]// no problem - I can see text on my mobile[/B] sserial.write((char*)buf, sizeof(buf)); [B] // I see just nonsense chars on my mobile[/B] data = ""; break; } } } }
I can see correct text with sserial.print(data);
With sserial.write((char*)buf, sizeof(buf)); I see nonsense - see picture:
View attachment 28877
uint32_t num;
num = 1094795585; // = 0xAAAA
Serial.print(num); // will print ASCII representation of num - 1094795585 to the screen / serial port - 10 BYTES
Serial.write(num); // will print the binary representation of num - A to the screen / serial port
#define BUFFER_SIZE (30000)
float buf[BUFFER_SIZE];
char inChar;
float num;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
if (Serial1.available() > 0) {
inChar = Serial1.read();// get incoming byte:
for(int i=0; i<BUFFER_SIZE; i++) {
buf[i] = 1;
//Serial1.write(char(buf[i])); //Works OK but very slow of course - it takes 16 secodns to read id in Python
}
Serial1.write((char*)buf, sizeof(buf)); // I receive sometimes 1 number or 10 numbers but not more
Serial.println("Array sent.");
}
}
import bluetooth
import time
v_data = []
rec_value = 0
value = 0
bd_addr = "FC:A8:9A:00:22:33"
port = 1
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((bd_addr, port))
print('Connected')
sock.send("r")
print('Sent char to start sending data from Teensy')
rec = 0
start_time = time.time()
while rec < 1: # or < 30000 for reading one by one
#value = sock.recv(1)
#rec_value = ord(value)
#v_data.append(rec_value) # I can rear 30000 values but very very slow
v_data = sock.recv(30000) # does not work
#if rec_value == 0: break
rec += 1
end_time = time.time()
print(end_time-start_time)
print(v_data[0:100])
print(len(v_data))
print("Finished")
Serial1.write((char*)buf, sizeof(buf));
#define BUFFER_SIZE (300)
float buf[BUFFER_SIZE];
char inChar;
float num;
float adc_volt;
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
}
void loop() {
if (Serial1.available() > 0) {
inChar = Serial1.read();// get incoming byte:
for(int i=0; i<BUFFER_SIZE; i++) {
adc_volt = random(100);
byte *b = (byte *)&adc_volt;
Serial1.write(b[0]);
Serial1.write(b[1]);
Serial1.write(b[2]);
Serial1.write(b[3]);
}
}
}
import bluetooth
import struct
SAMPLES= 300
s = struct.Struct('<' + str(SAMPLES) + 'f')
bt_data = []
bd_addr = "FC:A8:9A:00:22:33"
port = 1
sock=bluetooth.BluetoothSocket(bluetooth.RFCOMM )
sock.connect((bd_addr, port))
print('Connected')
sock.send("r")
print('Sent char to start sending data from Teensy')
bt_data = sock.recv(SAMPLES*4)
unpacked_data = s.unpack(bt_data)
print(unpacked_data)
print(len(unpacked_data))
Traceback (most recent call last):
File "c:\Users\frohr\bt.py", line 18, in <module>
unpacked_data = s.unpack(bt_data)
struct.error: unpack requires a buffer of 1200 bytes
for i in range(0, len(bt_data, 4):
print(struct.unpack('>f', bt_data[i:4]))
print(struct.unpack('<f', bt_data[i:4]))