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

Unreliable communication with tinyproto #23

Closed
redemption95 opened this issue Jul 29, 2021 · 2 comments
Closed

Unreliable communication with tinyproto #23

redemption95 opened this issue Jul 29, 2021 · 2 comments

Comments

@redemption95
Copy link

I am unable to get reliable data transmission
at a bit higher baud rate: 115200, 57600.
Enabled crccheck16() on both sides.

Send :
Rpi python

ser = serial.Serial('/dev/ttyS0', 115200, parity = serial.PARITY_NONE, timeout= 0)

while True:
    buf = bytearray([ 0x7E, 0xFF, 0x3F, 0xF3, 0x39, 0x40, 0x7E  ])
    buf = "SAM\0"
    buf = "HELLO-WORLD\0"
    print("Writing byte array to serial")
    print(p.put(buf)) #bytearray([ 0x7E, 0xFF, 0x3F, 0xF3, 0x39, 0x7E  ])
    # print(p.tx())
    ser.write(p.tx())

Receive:
Arduino

#include <TinyProtocol.h>
#include <SoftwareSerial.h>

int buff[256];
tinyproto::Hdlc proto_hdlc(buff, 256);
SoftwareSerial mySerial(A3, A2);


void hdlcRecieveCallback(tinyproto::IPacket &pkt)
{
    //Recive and process packets
    Serial.println("HDLC Recieve callback");
    Serial.println(pkt.getString());
    Serial.println("Recieved data size : " + String(pkt.size()));
    Serial.println("Max buffer size : " + String(pkt.maxSize()));
    Serial.println("=========================");
}
void setup() {
    /* No timeout, since we want non-blocking UART operations. */
    Serial.setTimeout(0);
    mySerial.setTimeout(0);
    /* Initialize serial protocol for test purposes */
    Serial.begin(115200);
    mySerial.begin(9600);
    proto_hdlc.setReceiveCallback(hdlcRecieveCallback);
    proto_hdlc.begin();
    proto_hdlc.enableCrc16();
}


void loop()
{

    size_t len =   mySerial.available();  
    // char bytes[128];
    if (len) {
        uint8_t bytes = mySerial.read();
        proto_hdlc.run_rx( &bytes, 1 );
        // mySerial.readBytes(bytes,len > 128 ? 128 : len);
        // proto_hdlc.run_rx( bytes, len > 128 ? 128 : len ); // run FD protocol parser to process data received from the channel
    }
}

Baud: 115200
Zero reliability

2021-07-30_02-28-54

More reliable than above.
But still unacceptable to the requirement.
Baud : 57600
2021-07-30_02-31-21

Most reliable
Still too many error packets
Baud : 9600
2021-07-30_02-37-51

Am I doing something wrong.
or the observation is correct.

Thank you in advance.
Sasank Panda

@lexus2k
Copy link
Owner

lexus2k commented Jul 30, 2021

Hi Sasank,

did you try examples from examples folder? Do they work on your setup?
As I wrote earlier in another github issue #20: Also, I would recommend to carefully test Software Serial library communication, because unlike Hardware implementation, the Software one may miss some bits due to higher load off AVR MCU.
Even printing debug information to hardware Serial Serial.println("HDLC Recieve callback"); in the hdlcRecieveCallback callback eats the resources of AVR MCU.

Since, you're using Software Serial on the weak micro controller, this could be a root cause. You can try to switch to more powerful hardware.

@redemption95
Copy link
Author

Yes, I tried,
I did finally change to AltSoftSerial the second-best to hardware as I managed
to get pin 8,9 free. There I observed I was writing to the buffer too fast (probably faster CPU of RPi ), than the Arduino can empty the buffer. I managed to get good
reliability adding some delay although I am not convinced with the solution.
But yes no issues with the library functionality.

Thank you ,
Sasank Panda

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

No branches or pull requests

2 participants