Given your diagnosis, although this works, it doesn't sound theoretically sound.
What makes more sense to me is to create a new buffer for every read and pass it to the UI thread. On Wednesday, November 14, 2012 8:48:53 PM UTC-6, tma wrote: > > Greetings, > > I have resolved the issue by adding a simple 2KB circular buffer. > The buffer input pointer is managed in the bluetooth thread and the output > pointer in the main thread. Seems to work perfectly for 600 byte bursts of > data at 56KBaud. > > TMA > > On Wednesday, November 14, 2012 12:23:34 AM UTC-8, tma wrote: >> >> Further to my last I also wonder if this problem could be resolved by >> changing thread synchronization? >> >> TMA >> >> >> On Wednesday, November 14, 2012 12:00:10 AM UTC-8, tma wrote: >>> >>> Greetings, >>> >>> I think I now have a much clearer understanding of what is >>> causing the problem but I don't know how to fix it. >>> >>> The ConnectedThread bluetooth input stream process is >>> overwriting the handler message buffer before the MainThread picks it up. >>> But the byte count lags behind the buffer update. >>> >>> ------------------------ >>> For example, when the following string was received: >>> >>> "la50\r\n\r-9.8 dBm\n\r\n\r>" >>> >>> -The bluetooth input stream process first picked up only the >>> first three characters "la5", correctly assigned the string length of 3 and >>> sent the message via the handler. >>> >>> -Before the main thread picked up the message the bluetooth >>> input stream process picked up the 17 remaining characters and overwrote >>> the message character buffer. >>> >>> -When the main thread picked up the first message it got a >>> character count of 3 from the top of the que, picked up the first three >>> characters which were overwritten with "0\r\n", thus the "la5" is lost. >>> >>> - Then the main thread picked up the next 17 character message >>> in the que. It collected the remaining characters in the buffer which had >>> not been overwritten with new data. Three of the characters (characters in >>> buffer positions 0,1 and 2) ended up being sent to the screen twice. >>> >>> --------------------------- >>> >>> I am thinking about a double buffering/circular buffer fix with >>> hand shaking between threads but wonder if there is a simpler approach. >>> >>> It seems inconsistent that the "bytes" variable that records the >>> length of the buffer string for each message is not overwriteen but the >>> character buffer is. It would seem that there should be the equivalent of a >>> circular buffer in the Handler. I wonder if there is an option? I wonder if >>> the Handler is implemented properly here? >>> >>> Thanks in advance for any suggestions. >>> >>> TMA >>> >>> >>> >>> >>> >>> >>> On Tuesday, November 13, 2012 9:50:06 AM UTC-8, tma wrote: >>>> >>>> Greetings, >>>> >>>> As an alternative, which was easier for me as I am new to >>>> Android and don't yet know how to direct this data to a file, I used the >>>> debugger to examine the contents of the bluetooth read buffer. I found >>>> initially, with a breakpoint on this mHandler.obtainMessage line, that the >>>> BT read buffer was missing the odd character. I then inserted a dummy line >>>> to make a place for a breakpoint, removed the handler message line and >>>> found found then that the buffer content was perfect without the handler >>>> call. >>>> >>>> After restoring the mHandler.obtainMessage line I decided to take >>>> a look at the incoming message buffer in the main thread and found it to >>>> be >>>> missing half or more of the characters. >>>> >>>> Thinking the problem might be caused by the itemized UI display I >>>> added an editText window and directed the message output to it. I observed >>>> the same sporadic, sporadic data result. >>>> >>>> I noticed that the BT buffer read cycles twice before the first >>>> handler message is picked up by the main thread. I also noticed that there >>>> is no corresponding "getTarget()" statement in this code to provide a >>>> target definition for the "sendToTarget" extension. I don't know how to >>>> add >>>> a "getTarget" statement or if it is even required here as inferred by the >>>> docs. >>>> >>>> In any event it appears as if the problem is associated with the >>>> Handler implementation. Is a handler the best option for sending data >>>> between threads? Could (or should) an intent be used instead? >>>> >>>> Thanks in advance for any help! >>>> >>>> tma >>>> >>>> >>>> >>>> On Friday, November 9, 2012 7:26:58 AM UTC-8, bob wrote: >>>>> >>>>> I would look at this line in BluetoothChatService.java: >>>>> >>>>> mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) >>>>> .sendToTarget(); >>>>> >>>>> I would change that line to write to a file on the SD card. >>>>> >>>>> >>>>> Then, after some time, I would look at the file to see if it contains >>>>> what it should. >>>>> >>>>> That should help you see if it's a UI thing or a comm thing. >>>>> >>>>> >>>>> >>>>> On Thursday, November 8, 2012 6:14:32 PM UTC-6, tma wrote: >>>>>> >>>>>> Hi Bob, >>>>>> >>>>>> Thanks for your reply! >>>>>> >>>>>> I thought 56 kbps should be easily obtainable but didn't >>>>>> know what the upper limit might be. For testing I am using an Asus >>>>>> Transformer Prime which has a quad processor. I thought maybe the >>>>>> debugger >>>>>> might be slowing it down so I exported the apk, installed the app >>>>>> directly >>>>>> and turned USB debugging in my tablet off via "Settings", all to no >>>>>> avail. I presume that should have rid the app of possible debug >>>>>> delays??? >>>>>> >>>>>> My app is data acquisition from an external device that >>>>>> will eventually be graphically displayed in a GUI window. I decided I >>>>>> wanted to display the data as text to start with and then move on to the >>>>>> graphics display. >>>>>> >>>>>> I don't have any problem displaying the data with >>>>>> SENA's bluetooth terminal software. Thus I am absolutely sure of the >>>>>> quality of the data and the BT interface. >>>>>> >>>>>> I am now considering the use of the Amarino bluetooth >>>>>> API which also is capable of capturing the data without a glitch. But it >>>>>> would result in another software tier that I would prefer to avoid. >>>>>> >>>>>> TMA >>>>>> >>>>>> >>>>>> On Thursday, November 8, 2012 10:36:14 AM UTC-8, bob wrote: >>>>>>> >>>>>>> What are you trying to do with the data? Maybe you don't even need >>>>>>> to pass it to the UI thread? >>>>>>> >>>>>>> >>>>>>> In theory, I'm pretty sure there should be no throughput limitations >>>>>>> that would prevent your use case. I think it can handle like 700 kbps >>>>>>> or >>>>>>> something. >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thursday, November 8, 2012 12:05:33 PM UTC-6, tma wrote: >>>>>>>> >>>>>>>> Greetings, >>>>>>>> >>>>>>>> I am trying to adapt the BluetoothChat example engine to >>>>>>>> provide serial UART comms for an extenal device that provides 1000 >>>>>>>> byte >>>>>>>> bursts of data at 56KBaud (bits/S). Unfortunately the SDK >>>>>>>> BluetoothChat >>>>>>>> example, which I imagine was just intended for keyboard messaging, >>>>>>>> hickups >>>>>>>> with a 56KBaud bursts. It appears to repeat the display of the same >>>>>>>> text >>>>>>>> six times or more before moving on to the next data. In the process it >>>>>>>> misses some data. It would seem the buffers are not being managed >>>>>>>> properly >>>>>>>> between the inputstream and UI threads. >>>>>>>> >>>>>>>> I wonder if anyone here can suggest what to do to fix this >>>>>>>> problem? >>>>>>>> >>>>>>>> Thanks in advance! >>>>>>>> >>>>>>>> TMA >>>>>>>> >>>>>>> -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

