beagleboard / beagleboard/librobotcontrol

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

Open
#207 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
212
Forks
167
PR merge metrics
No merged PRs in 30d

Description

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
#include // for atoi
#include
#include

#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;
}

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the behavior with the rc_uart_loopback.c example at 115200 baud, comparing continuous reads on UART0 and UART2. Trace the rc_uart_init, rc_uart_read_bytes, and rc_uart_flush calls while checking the BeagleBone Blue UART configuration; done means explaining and resolving the UART0 stall and confirming sustained reads.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, debian, linux
Domain
embedded-iot, operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.