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

Beaglebone Blue UART0 functions differently than UART's 1 2 5 - UART0 will stall after short period. #207

Open
maxelrad opened this issue Jul 15, 2021 · 0 comments

Comments

@maxelrad
Copy link

UART 0 & UART 2 Behave Differently
Beaglebone Blue - with a recent recommended Debian release

Below is Strawson's example UART loopback program. With minor changes to read continuously.

I have attached an Arduino 115200 baud char output stream to both the UART0 & UART2 in parallel.

If UART2 is selected the stream will read as expected - maybe forever.

If UART0 is selected the stream will read for perhaps 30 seconds. The PUTTY cursor will flash and
the program stalls until interrupted with a ctl C.

I suspect there is some conflict within LINUX?? If anyone has an idea about this,
it will be greatly appreciated.

/**

  • @file rc_uart_loopback.c
  • @example rc_uart_loopback
  • This is a test to check read and write operation of UART buses. For this
  • example to work, connect the RX and TX wires of one of the included 4-pin
  • JST-SH pigtails and plug into the UART1 or UART5 headers. You may also elect
  • to test UART0 on the debug header or UART2 on the GPS header. The test
  • strings this programs transmits will then loopback to the RX channel.
    */

#include <stdio.h>
#include <stdlib.h> // for atoi
#include <string.h>
#include <rc/uart.h>

#define BUF_SIZE 32
#define TIMEOUT_S 0.5
#define BAUDRATE 115200

static void __print_usage(void)
{
printf("\n");
printf("Usage: rc_uart_loopback {bus}\n");
printf("This sends a short message out the specified bus and then\n");
printf("reads it back in. This requires connecting RX to TX to make a loopback.\n");
printf("For Robotics Cape or BeagleBone Blue specify bus 0,1,2 or 5\n");
printf("\n");
return;
}

int main(int argc, char argv[])
{
char
test_str = "Hello World";
int bytes = 10; //strlen(test_str); // get number of bytes in test string
uint8_t buf[BUF_SIZE];
int ret; // return value
int bus; // which bus to use

// Parse arguments
if(argc!=2){ //argc==2 actually means one argument given
	__print_usage();
	return -1;
}
else bus = atoi(argv[1]);

if(!(bus==0||bus==1||bus==2||bus==5)){
	__print_usage();
	return -1;
}

printf("\ntesting UART bus %d\n\n", bus);
// disable canonical (0), 1 stop bit (1), disable parity (0)
if(rc_uart_init(bus, BAUDRATE, TIMEOUT_S, 0,1,0)){
	printf("Failed to rc_uart_init%d\n", bus);
	return -1;
}

// Flush and Write
printf("Sending  %d bytes: %s \n", bytes, test_str);
rc_uart_flush(bus);
rc_uart_write(bus, (uint8_t*)test_str, bytes);

//repeated reads fom a character stream sent from Arduino at 115200
while(1){


	// Read
	//printf("reading bytes:\n");
	memset(buf,0,sizeof(buf));
	ret = rc_uart_read_bytes(bus, buf, bytes);
	if(ret<0) fprintf(stderr,"Error reading bus\n");
	else if(ret==0) printf("timeout reached, %d bytes read\n", ret);
	else printf("Received %d bytes: %s ", ret, buf);
	rc_uart_flush(bus);
	fflush(stdout);
}



// now write again
printf("\n");
printf("Sending  %d bytes: %s \n", bytes, test_str);
rc_uart_write(bus, (uint8_t*)test_str, bytes);

// read back as line
printf("reading line:\n");
memset(buf,0,sizeof(buf));
ret = rc_uart_read_line(bus, buf, sizeof(buf));
if(ret<0) fprintf(stderr,"Error reading bus\n");
else if(ret==0) printf("timeout reached, %d bytes read\n", ret);
else printf("Received %d bytes: %s \n", ret, buf);

// close
rc_uart_close(bus);
return 0;

}

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

1 participant