On 03/10/2016 01:36 PM, [email protected] wrote: > Hello! > > I'm having some trouble getting serial communication running reliable on my > BBB. I've used code mostly based on this page > <http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html> following the > non-canonical input section. > > It's up and running, and I can echo anything I send back with read, write, > and shorting the TX and RX pins. The problem I'm having is if I do this > multiple times in one instance of the program, on the third time my board > hangs on the read command. Does anyone have any idea where a good place to > start solving this issue would be? > > I've tried using "tcflush(SERIAL_fd,TCIFLUSH);" to clear everything out after > each read under the assumption that this is some kind of buffer overflow, but > that doesn't seem to do anything at all. Here are the relevant sections of my > code, thanks! > > void SERIAL_Init(void) > { > /*******************************************************************/ > printf("\tSerial Port Initialization ..."); > SERIAL_fd = open(MODEMDEVICE,O_RDWR | O_NOCTTY /*| O_NDELAY*/); > if (SERIAL_fd < 0) > { perror(MODEMDEVICE); > exit(-1); > } > fcntl(SERIAL_fd,F_SETFL,0); > tcgetattr(SERIAL_fd,&newtio); > newtio.c_cflag |= CS8 | CLOCAL | CREAD ; > cfsetispeed(&newtio,BAUDRATE); > cfsetospeed(&newtio,BAUDRATE); > newtio.c_iflag = IGNBRK | IGNPAR; > newtio.c_oflag = 0; > newtio.c_lflag = 0; > newtio.c_cc[VTIME]=0; /* inter-character timer unused */ > newtio.c_cc[VMIN]=31; /* blocking read until 18 chars received > */ > tcflush(SERIAL_fd,TCIFLUSH); > tcsetattr(SERIAL_fd,TCSANOW,&newtio); > /****************************************************************/ > printf("Done\n"); > return; > } > > ...and then in main without all the other code I'm adding this too.... > > //Read from maestro command, 1a2b is a test command strictly for echoing > unsigned char read_command[2][2] = { > {0x1a,0x2b}, > {0x90,0x05}, > }; > unsigned char test_data[2] = {0x00,0x00}; > > ...here's where the actual read and write calls happen... > > while(readTest == 0) > { > printf("Enter 0 to read from maestro pin, 1 to continue with testing\n"); > scanf("%d",&readTest); > write(SERIAL_fd,read_command[0],2); > printf("Wrote values...\n"); > num_bytes = read(SERIAL_fd,&test_data,2); > printf("Value read: %x %x\n",test_data[0],test_data[1]); > > } > > Any help would be greatly appreciated! If there's anything else you need from > me in order to help just let me know! Thanks!
You're using a blocking read waiting for 31 bytes of input, but you don't have 31 bytes of input. -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
