Beaglebone Blue UART0 functions differently than UART's 1 2 5 - UART0 will stall after short period.
Created by: maxelrad
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;
}