From: Zack S. <za...@sn...> - 2008-04-02 22:41:23
|
This is a long read, I'm sorry for that, but I wanted to be very complete. Please read all of it. I'm working on a project where I'd like to connect a waysmall 400xm-bt to a Bluetooth GPS receiver. The receiver is a G-sat model that requires a passkey for connection ("0000"). I'm trying to connect it to the gumstix computer as a bluetooth serial device. I then want to use this serial device in a C program I'm writing. I seem to be having trouble getting this all working and I'm not exactly sure where the problem is, I'm new to all of this. Basically, this is what I have: I want to keep the bluetooth terminal and this new device at the same time, so I have the following in a startup script: sdptool add --channel=2 SP sdptool setattr 0x10000 0x100 "Ch 1 Serial (getty)" sdptool setattr 0x10001 0x100 "Ch 2 Serial (GPS)" This seems to be working. I can see it run at startup and it makes the new port for me. Next, I have a script that binds the bluetooth device to /dev/rfcomm1 before my program runs. I simply run the command: # rfcomm bind 1 00:0D:B5:34:B1:12 # rfcomm rfcomm1: 00:0D:B5:34:B1:12 channel 1 clean As you can see, the port binds and all that. I can even ping the device (l2ping 00:0D:B5:34:B1:12) with 0% loss. But when I run my C program, the trouble starts. The program is supposed to read from the GPS, run a few calculations, and send off the result over wired serial (ttyS2) to a nearby PIC. The wired serial port part works fine. I've tested it independently with hardcoded data. However, the minute I try to use basically the same code to connect to and test the GPS, it all goes downhill. The GPS setup code follows: // Open the GPS serial port. if (( gpsPort = open( "/dev/rfcomm1", O_RDWR | O_EXCL )) < 0 ) { fprintf( stderr, "Unable to open GPS serial port: %s\n", strerror( errno )); exit( 2 ); } // Get the attribute structure of the port we just opened to set up the baud rate and other details. if ( tcgetattr( gpsPort, &attr ) < 0 ) { fprintf( stderr, "Failed initialize GPS serial port: %s\n", strerror( errno )); exit( 3 ); } attr.c_iflag = 0; // No Software Flow Control attr.c_oflag = 0; attr.c_cflag = CLOCAL | CREAD | CS8; attr.c_lflag = 0; attr.c_cc[ VTIME ] = 2; // timeout in tenths of a second attr.c_cc[ VMIN ] = 1; cfsetispeed( &attr, B38400 ); cfsetospeed( &attr, B38400 ); // Apply the attribute changes. if ( tcsetattr( gpsPort, TCSAFLUSH, &attr ) < 0 ) { fprintf( stderr, "Failed to setup GPS serial port: %s\n", strerror( errno )); exit( 4 ); } // Done setting up GPS. fprintf( stdout, "System Online.\n\n"); Except I never get to the "System Online" part. I get a segmentation fault. Ugh, it couldn't be more vague. Though some basic debugging, I found the program is never getting past this function: open( "/dev/rfcomm1", O_RDWR | O_EXCL ) When I check rfcomm after the program has run, I see: # rfcomm rfcomm1: 00:0D:B5:34:B1:12 channel 1 closed If I run the program again, I get this error: Unable to open GPS serial port: Device or resource busy Ok, not exactly unexpected. I can unbind, bind and run again and I'll get the segmentation fault again. Any advice would be appreciated. Am I missing something obvious? I replaced my default Gumstix bluetooth passkey of 1234 with 0000, should I be doing something else to connect? Could it be my compiler settings? Other wired serial ports open, read, write and otherwise work perfectly fine. In fact, if I replace /dev/rfcomm1 with /dev/ttyS2 in my code, it runs fine. I've been stuck on this for 2 days and it's so frustrating. |
From: Brad M. <bmi...@gm...> - 2008-04-03 02:22:30
|
Zach Some of your approach could be simpler. You don't need to do anything with sdp since you are a client to the gps. Put your rfcomm bindings in /etc/bluetooth/rfcomm.conf. Use gpsd and point it at /dev/rfcomm1 or whatever using /etc/default/gpsd. You can make gpsd hold the connection up by running something like "gpspipe -r" in the background. Otherwise the bt connection is made on demand and your gps may time and turn off the bt radio. The c api for gpsd is straightforward and isolates you from nmea parsing. Brad On Wed, Apr 2, 2008 at 4:41 PM, Zack Schilling <za...@sn...> wrote: > This is a long read, I'm sorry for that, but I wanted to be very > complete. Please read all of it. > > I'm working on a project where I'd like to connect a waysmall 400xm-bt > to a Bluetooth GPS receiver. The receiver is a G-sat model that > requires a passkey for connection ("0000"). I'm trying to connect it > to the gumstix computer as a bluetooth serial device. I then want to > use this serial device in a C program I'm writing. > > I seem to be having trouble getting this all working and I'm not > exactly sure where the problem is, I'm new to all of this. Basically, > this is what I have: > > I want to keep the bluetooth terminal and this new device at the same > time, so I have the following in a startup script: > > sdptool add --channel=2 SP > sdptool setattr 0x10000 0x100 "Ch 1 Serial (getty)" > sdptool setattr 0x10001 0x100 "Ch 2 Serial (GPS)" > > This seems to be working. I can see it run at startup and it makes the > new port for me. > > Next, I have a script that binds the bluetooth device to /dev/rfcomm1 > before my program runs. I simply run the command: > > # rfcomm bind 1 00:0D:B5:34:B1:12 > # rfcomm > rfcomm1: 00:0D:B5:34:B1:12 channel 1 clean > > As you can see, the port binds and all that. I can even ping the > device (l2ping 00:0D:B5:34:B1:12) with 0% loss. But when I run my C > program, the trouble starts. > > The program is supposed to read from the GPS, run a few calculations, > and send off the result over wired serial (ttyS2) to a nearby PIC. The > wired serial port part works fine. I've tested it independently with > hardcoded data. However, the minute I try to use basically the same > code to connect to and test the GPS, it all goes downhill. > > The GPS setup code follows: > > // Open the GPS serial port. > > if (( gpsPort = open( "/dev/rfcomm1", O_RDWR | O_EXCL )) < 0 ) > { > fprintf( stderr, "Unable to open GPS serial port: %s\n", > strerror( errno )); > exit( 2 ); > } > > // Get the attribute structure of the port we just opened to set up > the baud rate and other details. > if ( tcgetattr( gpsPort, &attr ) < 0 ) > { > fprintf( stderr, "Failed initialize GPS serial port: %s\n", > strerror( errno )); > exit( 3 ); > } > > attr.c_iflag = 0; // No Software Flow Control > attr.c_oflag = 0; > attr.c_cflag = CLOCAL | CREAD | CS8; > attr.c_lflag = 0; > attr.c_cc[ VTIME ] = 2; // timeout in tenths of a second > attr.c_cc[ VMIN ] = 1; > > cfsetispeed( &attr, B38400 ); > cfsetospeed( &attr, B38400 ); > > // Apply the attribute changes. > if ( tcsetattr( gpsPort, TCSAFLUSH, &attr ) < 0 ) > { > fprintf( stderr, "Failed to setup GPS serial port: %s\n", > strerror( errno )); > exit( 4 ); > } > > // Done setting up GPS. > > fprintf( stdout, "System Online.\n\n"); > > > > Except I never get to the "System Online" part. I get a segmentation > fault. Ugh, it couldn't be more vague. Though some basic debugging, I > found the program is never getting past this function: > > open( "/dev/rfcomm1", O_RDWR | O_EXCL ) > > When I check rfcomm after the program has run, I see: > > # rfcomm > rfcomm1: 00:0D:B5:34:B1:12 channel 1 closed > > If I run the program again, I get this error: > > Unable to open GPS serial port: Device or resource busy > > Ok, not exactly unexpected. I can unbind, bind and run again and I'll > get the segmentation fault again. Any advice would be appreciated. Am > I missing something obvious? I replaced my default Gumstix bluetooth > passkey of 1234 with 0000, should I be doing something else to > connect? Could it be my compiler settings? Other wired serial ports > open, read, write and otherwise work perfectly fine. In fact, if I > replace /dev/rfcomm1 with /dev/ttyS2 in my code, it runs fine. I've > been stuck on this for 2 days and it's so frustrating. > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > -- Brad |
From: Zack S. <za...@sn...> - 2008-04-03 02:49:33
|
I understand that some of my setup could be simpler (I tried it the way you described and got basically the same result). GPSd cannot connect to this device, nor can "sertest", a serial test program off the Wiki. What should the inside of my rfcomm file look like? Right now, it looks like this: rfcomm0 { listen yes; # Bluetooth address of the device device hci0; # RFCOMM channel for the connection channel 1; # Description of the connection comment "Gumstix Serial Console"; } rfcomm1 { bind yes; device 00:0D:B5:34:B1:12; channel 2; comment "GPS"; } Does the passkey go in here somewhere? Do I have it set up incorrectly? On Apr 2, 2008, at 10:22 PM, Brad Midgley wrote: > Zach > > Some of your approach could be simpler. You don't need to do anything > with sdp since you are a client to the gps. > > Put your rfcomm bindings in /etc/bluetooth/rfcomm.conf. > > Use gpsd and point it at /dev/rfcomm1 or whatever using /etc/default/ > gpsd. > > You can make gpsd hold the connection up by running something like > "gpspipe -r" in the background. Otherwise the bt connection is made on > demand and your gps may time and turn off the bt radio. > > The c api for gpsd is straightforward and isolates you from nmea > parsing. > > Brad > > On Wed, Apr 2, 2008 at 4:41 PM, Zack Schilling <za...@sn...> wrote: >> This is a long read, I'm sorry for that, but I wanted to be very >> complete. Please read all of it. >> >> I'm working on a project where I'd like to connect a waysmall 400xm- >> bt >> to a Bluetooth GPS receiver. The receiver is a G-sat model that >> requires a passkey for connection ("0000"). I'm trying to connect it >> to the gumstix computer as a bluetooth serial device. I then want to >> use this serial device in a C program I'm writing. >> >> I seem to be having trouble getting this all working and I'm not >> exactly sure where the problem is, I'm new to all of this. Basically, >> this is what I have: >> >> I want to keep the bluetooth terminal and this new device at the same >> time, so I have the following in a startup script: >> >> sdptool add --channel=2 SP >> sdptool setattr 0x10000 0x100 "Ch 1 Serial (getty)" >> sdptool setattr 0x10001 0x100 "Ch 2 Serial (GPS)" >> >> This seems to be working. I can see it run at startup and it makes >> the >> new port for me. >> >> Next, I have a script that binds the bluetooth device to /dev/rfcomm1 >> before my program runs. I simply run the command: >> >> # rfcomm bind 1 00:0D:B5:34:B1:12 >> # rfcomm >> rfcomm1: 00:0D:B5:34:B1:12 channel 1 clean >> >> As you can see, the port binds and all that. I can even ping the >> device (l2ping 00:0D:B5:34:B1:12) with 0% loss. But when I run my C >> program, the trouble starts. >> >> The program is supposed to read from the GPS, run a few calculations, >> and send off the result over wired serial (ttyS2) to a nearby PIC. >> The >> wired serial port part works fine. I've tested it independently with >> hardcoded data. However, the minute I try to use basically the same >> code to connect to and test the GPS, it all goes downhill. >> >> The GPS setup code follows: >> >> // Open the GPS serial port. >> >> if (( gpsPort = open( "/dev/rfcomm1", O_RDWR | O_EXCL )) < 0 ) >> { >> fprintf( stderr, "Unable to open GPS serial port: %s >> \n", >> strerror( errno )); >> exit( 2 ); >> } >> >> // Get the attribute structure of the port we just opened to set up >> the baud rate and other details. >> if ( tcgetattr( gpsPort, &attr ) < 0 ) >> { >> fprintf( stderr, "Failed initialize GPS serial port: %s\n", >> strerror( errno )); >> exit( 3 ); >> } >> >> attr.c_iflag = 0; // No Software Flow Control >> attr.c_oflag = 0; >> attr.c_cflag = CLOCAL | CREAD | CS8; >> attr.c_lflag = 0; >> attr.c_cc[ VTIME ] = 2; // timeout in tenths of a second >> attr.c_cc[ VMIN ] = 1; >> >> cfsetispeed( &attr, B38400 ); >> cfsetospeed( &attr, B38400 ); >> >> // Apply the attribute changes. >> if ( tcsetattr( gpsPort, TCSAFLUSH, &attr ) < 0 ) >> { >> fprintf( stderr, "Failed to setup GPS serial port: %s\n", >> strerror( errno )); >> exit( 4 ); >> } >> >> // Done setting up GPS. >> >> fprintf( stdout, "System Online.\n\n"); >> >> >> >> Except I never get to the "System Online" part. I get a segmentation >> fault. Ugh, it couldn't be more vague. Though some basic debugging, I >> found the program is never getting past this function: >> >> open( "/dev/rfcomm1", O_RDWR | O_EXCL ) >> >> When I check rfcomm after the program has run, I see: >> >> # rfcomm >> rfcomm1: 00:0D:B5:34:B1:12 channel 1 closed >> >> If I run the program again, I get this error: >> >> Unable to open GPS serial port: Device or resource busy >> >> Ok, not exactly unexpected. I can unbind, bind and run again and I'll >> get the segmentation fault again. Any advice would be appreciated. Am >> I missing something obvious? I replaced my default Gumstix bluetooth >> passkey of 1234 with 0000, should I be doing something else to >> connect? Could it be my compiler settings? Other wired serial ports >> open, read, write and otherwise work perfectly fine. In fact, if I >> replace /dev/rfcomm1 with /dev/ttyS2 in my code, it runs fine. I've >> been stuck on this for 2 days and it's so frustrating. >> >> ------------------------------------------------------------------------- >> Check out the new SourceForge.net Marketplace. >> It's the best place to buy or sell services for >> just about anything Open Source. >> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >> _______________________________________________ >> gumstix-users mailing list >> gum...@li... >> https://lists.sourceforge.net/lists/listinfo/gumstix-users >> > > > > -- > Brad > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users |
From: Brad M. <bmi...@gm...> - 2008-04-03 03:21:48
|
channel 2 looks wrong. it's usually 1, but you can use sdptool to check. On Wed, Apr 2, 2008 at 8:49 PM, Zack Schilling <za...@sn...> wrote: > I understand that some of my setup could be simpler (I tried it the > way you described and got basically the same result). GPSd cannot > connect to this device, nor can "sertest", a serial test program off > the Wiki. What should the inside of my rfcomm file look like? Right > now, it looks like this: > > rfcomm0 { > listen yes; > > # Bluetooth address of the device > device hci0; > > # RFCOMM channel for the connection > channel 1; > > # Description of the connection > comment "Gumstix Serial Console"; > } > > rfcomm1 { > bind yes; > device 00:0D:B5:34:B1:12; > channel 2; > comment "GPS"; > } > > > Does the passkey go in here somewhere? Do I have it set up incorrectly? > > > > > On Apr 2, 2008, at 10:22 PM, Brad Midgley wrote: > > > Zach > > > > Some of your approach could be simpler. You don't need to do anything > > with sdp since you are a client to the gps. > > > > Put your rfcomm bindings in /etc/bluetooth/rfcomm.conf. > > > > Use gpsd and point it at /dev/rfcomm1 or whatever using /etc/default/ > > gpsd. > > > > You can make gpsd hold the connection up by running something like > > "gpspipe -r" in the background. Otherwise the bt connection is made on > > demand and your gps may time and turn off the bt radio. > > > > The c api for gpsd is straightforward and isolates you from nmea > > parsing. > > > > Brad > > > > On Wed, Apr 2, 2008 at 4:41 PM, Zack Schilling <za...@sn...> wrote: > >> This is a long read, I'm sorry for that, but I wanted to be very > >> complete. Please read all of it. > >> > >> I'm working on a project where I'd like to connect a waysmall 400xm- > >> bt > >> to a Bluetooth GPS receiver. The receiver is a G-sat model that > >> requires a passkey for connection ("0000"). I'm trying to connect it > >> to the gumstix computer as a bluetooth serial device. I then want to > >> use this serial device in a C program I'm writing. > >> > >> I seem to be having trouble getting this all working and I'm not > >> exactly sure where the problem is, I'm new to all of this. Basically, > >> this is what I have: > >> > >> I want to keep the bluetooth terminal and this new device at the same > >> time, so I have the following in a startup script: > >> > >> sdptool add --channel=2 SP > >> sdptool setattr 0x10000 0x100 "Ch 1 Serial (getty)" > >> sdptool setattr 0x10001 0x100 "Ch 2 Serial (GPS)" > >> > >> This seems to be working. I can see it run at startup and it makes > >> the > >> new port for me. > >> > >> Next, I have a script that binds the bluetooth device to /dev/rfcomm1 > >> before my program runs. I simply run the command: > >> > >> # rfcomm bind 1 00:0D:B5:34:B1:12 > >> # rfcomm > >> rfcomm1: 00:0D:B5:34:B1:12 channel 1 clean > >> > >> As you can see, the port binds and all that. I can even ping the > >> device (l2ping 00:0D:B5:34:B1:12) with 0% loss. But when I run my C > >> program, the trouble starts. > >> > >> The program is supposed to read from the GPS, run a few calculations, > >> and send off the result over wired serial (ttyS2) to a nearby PIC. > >> The > >> wired serial port part works fine. I've tested it independently with > >> hardcoded data. However, the minute I try to use basically the same > >> code to connect to and test the GPS, it all goes downhill. > >> > >> The GPS setup code follows: > >> > >> // Open the GPS serial port. > >> > >> if (( gpsPort = open( "/dev/rfcomm1", O_RDWR | O_EXCL )) < 0 ) > >> { > >> fprintf( stderr, "Unable to open GPS serial port: %s > >> \n", > >> strerror( errno )); > >> exit( 2 ); > >> } > >> > >> // Get the attribute structure of the port we just opened to set up > >> the baud rate and other details. > >> if ( tcgetattr( gpsPort, &attr ) < 0 ) > >> { > >> fprintf( stderr, "Failed initialize GPS serial port: %s\n", > >> strerror( errno )); > >> exit( 3 ); > >> } > >> > >> attr.c_iflag = 0; // No Software Flow Control > >> attr.c_oflag = 0; > >> attr.c_cflag = CLOCAL | CREAD | CS8; > >> attr.c_lflag = 0; > >> attr.c_cc[ VTIME ] = 2; // timeout in tenths of a second > >> attr.c_cc[ VMIN ] = 1; > >> > >> cfsetispeed( &attr, B38400 ); > >> cfsetospeed( &attr, B38400 ); > >> > >> // Apply the attribute changes. > >> if ( tcsetattr( gpsPort, TCSAFLUSH, &attr ) < 0 ) > >> { > >> fprintf( stderr, "Failed to setup GPS serial port: %s\n", > >> strerror( errno )); > >> exit( 4 ); > >> } > >> > >> // Done setting up GPS. > >> > >> fprintf( stdout, "System Online.\n\n"); > >> > >> > >> > >> Except I never get to the "System Online" part. I get a segmentation > >> fault. Ugh, it couldn't be more vague. Though some basic debugging, I > >> found the program is never getting past this function: > >> > >> open( "/dev/rfcomm1", O_RDWR | O_EXCL ) > >> > >> When I check rfcomm after the program has run, I see: > >> > >> # rfcomm > >> rfcomm1: 00:0D:B5:34:B1:12 channel 1 closed > >> > >> If I run the program again, I get this error: > >> > >> Unable to open GPS serial port: Device or resource busy > >> > >> Ok, not exactly unexpected. I can unbind, bind and run again and I'll > >> get the segmentation fault again. Any advice would be appreciated. Am > >> I missing something obvious? I replaced my default Gumstix bluetooth > >> passkey of 1234 with 0000, should I be doing something else to > >> connect? Could it be my compiler settings? Other wired serial ports > >> open, read, write and otherwise work perfectly fine. In fact, if I > >> replace /dev/rfcomm1 with /dev/ttyS2 in my code, it runs fine. I've > >> been stuck on this for 2 days and it's so frustrating. > >> > >> ------------------------------------------------------------------------- > >> Check out the new SourceForge.net Marketplace. > >> It's the best place to buy or sell services for > >> just about anything Open Source. > >> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > >> _______________________________________________ > >> gumstix-users mailing list > >> gum...@li... > >> https://lists.sourceforge.net/lists/listinfo/gumstix-users > >> > > > > > > > > -- > > Brad > > > > ------------------------------------------------------------------------- > > Check out the new SourceForge.net Marketplace. > > It's the best place to buy or sell services for > > just about anything Open Source. > > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > > _______________________________________________ > > gumstix-users mailing list > > gum...@li... > > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > -- Brad |
From: Zack S. <za...@sn...> - 2008-04-03 06:00:16
|
Ok, I've got it working the way I want now. I'm so happy. This is the only sequence of steps that has worked. Do once: 1.) Change onboard pin to match GPS. (/etc/bluetooth/pin) 2.) Add device description to rfcomm config file. rfcomm1 { bind no; device 00:0D:B5:34:B1:12; channel 1; comment "GPS"; } Each bootup: 3.) sdptool add --channel=1 OPUSH 4.) sudo rfcomm bind 1 5.) Run program If it gives a device busy error, I run "rfcomm" with no arguments, then the program again and it seems to sort its self out. Man, that was an ordeal. But hey, now I can connect to the GPS with any serial port app and I don't lose remote terminal (I tested both at the same time, preformance was degraded but it worked). Excellent. Thanks for the help. On Apr 2, 2008, at 11:21 PM, Brad Midgley wrote: > channel 2 looks wrong. it's usually 1, but you can use sdptool to > check. > > On Wed, Apr 2, 2008 at 8:49 PM, Zack Schilling <za...@sn...> wrote: >> I understand that some of my setup could be simpler (I tried it the >> way you described and got basically the same result). GPSd cannot >> connect to this device, nor can "sertest", a serial test program off >> the Wiki. What should the inside of my rfcomm file look like? Right >> now, it looks like this: >> >> rfcomm0 { >> listen yes; >> >> # Bluetooth address of the device >> device hci0; >> >> # RFCOMM channel for the connection >> channel 1; >> >> # Description of the connection >> comment "Gumstix Serial Console"; >> } >> >> rfcomm1 { >> bind yes; >> device 00:0D:B5:34:B1:12; >> channel 2; >> comment "GPS"; >> } >> >> >> Does the passkey go in here somewhere? Do I have it set up >> incorrectly? >> >> >> >> >> On Apr 2, 2008, at 10:22 PM, Brad Midgley wrote: >> >>> Zach >>> >>> Some of your approach could be simpler. You don't need to do >>> anything >>> with sdp since you are a client to the gps. >>> >>> Put your rfcomm bindings in /etc/bluetooth/rfcomm.conf. >>> >>> Use gpsd and point it at /dev/rfcomm1 or whatever using /etc/ >>> default/ >>> gpsd. >>> >>> You can make gpsd hold the connection up by running something like >>> "gpspipe -r" in the background. Otherwise the bt connection is >>> made on >>> demand and your gps may time and turn off the bt radio. >>> >>> The c api for gpsd is straightforward and isolates you from nmea >>> parsing. >>> >>> Brad >>> >>> On Wed, Apr 2, 2008 at 4:41 PM, Zack Schilling <za...@sn...> >>> wrote: >>>> This is a long read, I'm sorry for that, but I wanted to be very >>>> complete. Please read all of it. >>>> >>>> I'm working on a project where I'd like to connect a waysmall >>>> 400xm- >>>> bt >>>> to a Bluetooth GPS receiver. The receiver is a G-sat model that >>>> requires a passkey for connection ("0000"). I'm trying to connect >>>> it >>>> to the gumstix computer as a bluetooth serial device. I then want >>>> to >>>> use this serial device in a C program I'm writing. >>>> >>>> I seem to be having trouble getting this all working and I'm not >>>> exactly sure where the problem is, I'm new to all of this. >>>> Basically, >>>> this is what I have: >>>> >>>> I want to keep the bluetooth terminal and this new device at the >>>> same >>>> time, so I have the following in a startup script: >>>> >>>> sdptool add --channel=2 SP >>>> sdptool setattr 0x10000 0x100 "Ch 1 Serial (getty)" >>>> sdptool setattr 0x10001 0x100 "Ch 2 Serial (GPS)" >>>> >>>> This seems to be working. I can see it run at startup and it makes >>>> the >>>> new port for me. >>>> >>>> Next, I have a script that binds the bluetooth device to /dev/ >>>> rfcomm1 >>>> before my program runs. I simply run the command: >>>> >>>> # rfcomm bind 1 00:0D:B5:34:B1:12 >>>> # rfcomm >>>> rfcomm1: 00:0D:B5:34:B1:12 channel 1 clean >>>> >>>> As you can see, the port binds and all that. I can even ping the >>>> device (l2ping 00:0D:B5:34:B1:12) with 0% loss. But when I run my C >>>> program, the trouble starts. >>>> >>>> The program is supposed to read from the GPS, run a few >>>> calculations, >>>> and send off the result over wired serial (ttyS2) to a nearby PIC. >>>> The >>>> wired serial port part works fine. I've tested it independently >>>> with >>>> hardcoded data. However, the minute I try to use basically the same >>>> code to connect to and test the GPS, it all goes downhill. >>>> >>>> The GPS setup code follows: >>>> >>>> // Open the GPS serial port. >>>> >>>> if (( gpsPort = open( "/dev/rfcomm1", O_RDWR | O_EXCL )) < 0 ) >>>> { >>>> fprintf( stderr, "Unable to open GPS serial port: %s >>>> \n", >>>> strerror( errno )); >>>> exit( 2 ); >>>> } >>>> >>>> // Get the attribute structure of the port we just opened to set up >>>> the baud rate and other details. >>>> if ( tcgetattr( gpsPort, &attr ) < 0 ) >>>> { >>>> fprintf( stderr, "Failed initialize GPS serial port: %s\n", >>>> strerror( errno )); >>>> exit( 3 ); >>>> } >>>> >>>> attr.c_iflag = 0; // No Software Flow Control >>>> attr.c_oflag = 0; >>>> attr.c_cflag = CLOCAL | CREAD | CS8; >>>> attr.c_lflag = 0; >>>> attr.c_cc[ VTIME ] = 2; // timeout in tenths of a second >>>> attr.c_cc[ VMIN ] = 1; >>>> >>>> cfsetispeed( &attr, B38400 ); >>>> cfsetospeed( &attr, B38400 ); >>>> >>>> // Apply the attribute changes. >>>> if ( tcsetattr( gpsPort, TCSAFLUSH, &attr ) < 0 ) >>>> { >>>> fprintf( stderr, "Failed to setup GPS serial port: %s\n", >>>> strerror( errno )); >>>> exit( 4 ); >>>> } >>>> >>>> // Done setting up GPS. >>>> >>>> fprintf( stdout, "System Online.\n\n"); >>>> >>>> >>>> >>>> Except I never get to the "System Online" part. I get a >>>> segmentation >>>> fault. Ugh, it couldn't be more vague. Though some basic >>>> debugging, I >>>> found the program is never getting past this function: >>>> >>>> open( "/dev/rfcomm1", O_RDWR | O_EXCL ) >>>> >>>> When I check rfcomm after the program has run, I see: >>>> >>>> # rfcomm >>>> rfcomm1: 00:0D:B5:34:B1:12 channel 1 closed >>>> >>>> If I run the program again, I get this error: >>>> >>>> Unable to open GPS serial port: Device or resource busy >>>> >>>> Ok, not exactly unexpected. I can unbind, bind and run again and >>>> I'll >>>> get the segmentation fault again. Any advice would be >>>> appreciated. Am >>>> I missing something obvious? I replaced my default Gumstix >>>> bluetooth >>>> passkey of 1234 with 0000, should I be doing something else to >>>> connect? Could it be my compiler settings? Other wired serial ports >>>> open, read, write and otherwise work perfectly fine. In fact, if I >>>> replace /dev/rfcomm1 with /dev/ttyS2 in my code, it runs fine. I've >>>> been stuck on this for 2 days and it's so frustrating. >>>> >>>> ------------------------------------------------------------------------- >>>> Check out the new SourceForge.net Marketplace. >>>> It's the best place to buy or sell services for >>>> just about anything Open Source. >>>> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >>>> _______________________________________________ >>>> gumstix-users mailing list >>>> gum...@li... >>>> https://lists.sourceforge.net/lists/listinfo/gumstix-users >>>> >>> >>> >>> >>> -- >>> Brad >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >>> _______________________________________________ >>> gumstix-users mailing list >>> gum...@li... >>> https://lists.sourceforge.net/lists/listinfo/gumstix-users >> >> >> ------------------------------------------------------------------------- >> Check out the new SourceForge.net Marketplace. >> It's the best place to buy or sell services for >> just about anything Open Source. >> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >> _______________________________________________ >> gumstix-users mailing list >> gum...@li... >> https://lists.sourceforge.net/lists/listinfo/gumstix-users >> > > > > -- > Brad > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users |