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