[Dprglist] Arduino Code Troubles

John Gauthier zizumara at sbcglobal.net
Fri Dec 17 14:19:28 PST 2021


Thanks.  I had assumed that he was using C, not C++.  For C++, that's 
even better.  =)

On 12/17/2021 4:06 PM, Rud Merriam via DPRGlist wrote:
>
> Since you opened the door (LOL).
>
> Ardino code is C++ so as a C++ pedant I'll suggest a different 
> defensive approach... Macros are problematic. I think C allows the 
> following.
>
> enum Positions { // might do enum struct Positions : uint8_t { 
>  US_LEFT = 0, US_MID  = 1, US_RIGHT = 2, IR_LEFT  = 3. IR_RIGHT = 4 }; 
> const uint8_t TIME_DIFF {5}; const uint8_t SONAR_NUM {3}; const 
> uint8_t IR_NUM {2}; const uint8_t BUFF_SIZE {SONAR_NUM + IR_NUM}; 
> const uint8_t MAX_DISTANCE {200}; const uint8_t DIST_UNKNOWN {999); 
>  uint32_t cm[BUFF_SIZE{0}; // will initialize entire array to 0
>
> I'd change the names to be lower case the same as regular variables. 
> Using an /enum struct/ can cause challenges since it doesn't convert 
> to regular integers so must be cast: /uint8_t(US_LEFT)/. But it is 
> safer if you want to enforce its use only as the enum.
>
> -73 -
> *Rud Merriam K5RUD*
> /Mystic Lake Software/ <http://mysticlakesoftware.com/>
>
> On 12/17/21 3:28 PM, John Gauthier via DPRGlist wrote:
>> As a side note, I believe there is great value in defensive 
>> programming as a habit.  In my code, I always use macros to define 
>> constants, especially when using them as indicies of an array 
>> representing a message.  In this case, you could use
>>
>> #define US_LEFT   0
>> #define US_MID    1
>> #define US_RIGHT  2
>> #define IR_LEFT   3
>> #define IR_RIGHT  4
>> #define TIME_DIFF 5
>> #define BUFF_SIZE 8
>>
>> #define SONAR_NUM 3
>> #define IR_NUM    2
>> #define MAX_DISTANCE 200
>> #define DIST_UNKNOWN 999
>>
>> assert(SONAR_NUM + IR_NUM <= BUFF_SIZE);
>>
>> uint32_t cm[BUFF_SIZE];
>> for (i = 0; i < BUFF_SIZE; ++i) {
>>    cm[i] = 0;
>> }
>>
>> irSensorL.read();
>> cm[IR_LEFT] = irSensorL.ranging_data.range_mm / 10;
>> if (cm[IR_LEFT] > MAX_DISTANCE) {
>> cm[IR_LEFT] = DIST_UNKNOWN;
>> }
>>
>> Coding constants with macros makes it hard to make mistakes, 
>> especially when making modifications to the code.  It also makes reading
>> the code much easier.  This was a C coding standard at two companies 
>> where I have worked.
>>
>>
>> John G.
>>
>> >      uint16_t maxDistance = 200; // Also used with NewPing.h library
>> >      .
>> >      . // Other code here
>> >      .
>> >      irSensorL.read(); // Read IR sensor... This is working!
>> >      cm[3] = irSensorL.ranging_data.range_mm/10; // This returns 268
>> >      if (cm[3] > maxDistance) {
>> >        cm[3] = 999;                 /
>> >      }
>> >      Serial.println(cm[3]);  / cm[3] value is always = 999
>> >      sendData();
>> On 12/17/2021 10:13 AM, Pat Caron via DPRGlist wrote:
>>>
>>> What I meant to say last night is the array size is cm[8].  The 
>>> values for SONAR_NUM == 3 and IR_NUM == 2
>>> This should not be overrunning the array as it only loops through 5 
>>> times.
>>> I have tried setting maxDistance as uint32_t without any difference.
>>> I have commented out the sendData() function and added some 
>>> Serial.print statements prior to reassigning the values. (shown in 
>>> output)
>>>
>>> #define SONAR_NUM 3
>>> #define IR_NUM 2
>>> uint32_t cm[8] = {0,0,0,0,0,0,0,0}; // Create array
>>> uint16_t maxDistance = 200; // Also used with NewPing.h libraray
>>> char *position[] = {"us_Left", "us_Mid", "us_Right", "ir_Left", 
>>> "ir_Right", "cm[5]", "cm[6]", "cm[7]"};
>>> .
>>> . // Other code here
>>> .
>>>
>>> void oneSensorCycle() { // Sensor ping cycle complete, do something 
>>> with the results.
>>>   for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>>>     Serial.print("cm[");
>>>     Serial.print(x);
>>>     Serial.print("] = ");
>>>     Serial.println(cm[x]);
>>>     if ((cm[x] == 0) or (cm[x] > maxDistance)) {
>>>       cm[x] = 999;
>>>     }
>>>   }
>>>   if (troubleshoot) {
>>>     for (uint8_t i = 0; i < (SONAR_NUM + IR_NUM); i++) {
>>>       Serial.print("| ");
>>>       Serial.print(position[i]);
>>>       Serial.print(" = ");
>>>       Serial.print(cm[i]);
>>>       Serial.print("cm ");
>>>     }
>>>     Serial.print("| ");
>>>     Serial.print("Time = ");
>>>     Serial.print(elapsedMillis);
>>>     Serial.print("mS");
>>>     Serial.println();
>>>   }
>>>   //else {
>>>   //  sendData();
>>>   //}
>>> }
>>>
>>>
>>> Loop() {
>>>   .// other code
>>> oneSensorCycle()
>>>   . // more code
>>> }
>>>
>>> Serial output:
>>>
>>> -- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
>>> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
>>> cm[0] = 0
>>> cm[1] = 95
>>> cm[2] = 91
>>> cm[3] = 85
>>> cm[4] = 246
>>> | us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm | ir_Left = 
>>> 999cm | ir_Right = 999cm | Time = 44mS
>>>
>>> ...Pat C
>>>
>>>
>>> On Fri, Dec 17, 2021 at 10:07 AM Chris Netter 
>>> <netterchris at gmail.com> wrote:
>>>
>>>     The for loop stops at x < 8, so it won’t overrun.
>>>
>>>     What if you remove the sendData() call?  Does that help?
>>>
>>>     Also,  make sure you have declared any global variables which
>>>     are modified by interrupts or other tasks as “volatile”,
>>>     otherwise the compile may decide to optimize away parts of your
>>>     code.
>>>
>>>     Chris
>>>
>>>     *From: *Doug Paradis <mailto:paradug at gmail.com>
>>>     *Sent: *Thursday, December 16, 2021 11:46 PM
>>>     *To: *Chris Netter <mailto:netterchris at gmail.com>
>>>     *Cc: *Pat Caron <mailto:patcaron at mail.com>; dprglist at lists.dprg.org
>>>     *Subject: *Re: [Dprglist] Arduino Code Troubles
>>>
>>>     Pat,
>>>
>>>         for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>>>
>>>         If  SONAR_NUM _ IR_NUM = 8 then you are overrunning the
>>>     array which goes 0 to 7.
>>>
>>>     Regards,
>>>
>>>     Doug P.
>>>
>>>     On Thu, Dec 16, 2021 at 8:53 PM Chris Netter via DPRGlist
>>>     <dprglist at lists.dprg.org> wrote:
>>>
>>>         So Markus and Karim already pointed out that the original
>>>         code snipped works as designed.
>>>
>>>         It’s also been pointed out already that you are mixing data
>>>         types. I don’t think that’s the issue, but worth trying to
>>>         make both the array and maxDistance uint16_t
>>>
>>>         As for this new code snippet:
>>>
>>>         I don’t see any obvious issue with the for loop.  Are you
>>>         positive that SONAR_NUM + IR_NUM == 8 ?   if not, you are
>>>         overshooting the array and that can cause all kinds of
>>>         non-obvious issues.
>>>
>>>         Also, what does sendData() do?  Could it have some
>>>         side-effects?   Maybe its causing a stack overflow, array
>>>         bounds overflow, or similar, which in turn causes
>>>         non-obvious issues?
>>>
>>>         *From: *Pat Caron via DPRGlist <mailto:dprglist at lists.dprg.org>
>>>         *Sent: *Thursday, December 16, 2021 9:04 PM
>>>         *To: *dprglist at lists.dprg.org
>>>         *Subject: *Re: [Dprglist] Arduino Code Troubles
>>>
>>>         Hi guys, here is a better example to show what is happening
>>>         taken from actual code:
>>>
>>>         .... other code
>>>           for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {  //
>>>         SONAR_NUM + IR_NUM = 8
>>>             if ((cm[x] == 0) || (cm[x] > maxDistance)) {
>>>               cm[x] = 999;
>>>             }
>>>
>>>           sendData();
>>>
>>>           }
>>>
>>>         Printed values cm[0] to cm[5] (us_Left to ir_Right) without
>>>         the above if statement
>>>         | us_Left = 0cm | us_Mid = 95cm | us_Right = 51cm | ir_Left
>>>         = 84cm | ir_Right = 252cm | Time = 45mS
>>>
>>>         Printed values cm[0] to cm[5] with the above if statement
>>>         \| us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm |
>>>         ir_Left = 999cm | ir_Right = 999cm | Time = 44mS
>>>
>>>         ...Pat C
>>>
>>>         On Thu, Dec 16, 2021 at 8:45 PM Karim Virani
>>>         <pondersome64 at gmail.com> wrote:
>>>
>>>             It's doing what it's coded to do
>>>
>>>             On Thu, Dec 16, 2021 at 7:42 PM Pat Caron via DPRGlist
>>>             <dprglist at lists.dprg.org> wrote:
>>>
>>>                 Hi Murray, I did try that with the same results. 
>>>                 NewPing.h library is looking for a uint16_t although
>>>                 it didn't complain when I tried that.
>>>
>>>                 ...Pat C
>>>
>>>                 On Thu, Dec 16, 2021 at 8:35 PM Murray Altheim via
>>>                 DPRGlist <dprglist at lists.dprg.org> wrote:
>>>
>>>                     Hi Pat,
>>>
>>>                     What if you define maxDistance as uint32_t?
>>>
>>>                     Cheers,
>>>
>>>                     Murray
>>>
>>>                     On 17/12/21 2:27 pm, Pat Caron via DPRGlist wrote:
>>>                     > Hi guys, I'm looking for help with the
>>>                     following Arduino code.
>>>                     >
>>>                     >      uint32_t cm[8] = {0,0,0,0,0,0,0,0}; //
>>>                     Create array
>>>                     >      uint16_t maxDistance = 200; // Also used
>>>                     with NewPing.h library
>>>                     >      .
>>>                     >      . // Other code here
>>>                     >      .
>>>                     >      irSensorL.read(); // Read IR sensor...
>>>                     This is working!
>>>                     >      cm[3] =
>>>                     irSensorL.ranging_data.range_mm/10; // This
>>>                     returns 268
>>>                     >      if (cm[3] > maxDistance) {
>>>                     >        cm[3] = 999;         /
>>>                     >      }
>>>                     > Serial.println(cm[3]);  / cm[3] value is
>>>                     always = 999
>>>                     >      sendData();
>>>                     >
>>>                     > The cm[3] value is always 999 when I run this.
>>>                     > If I comment out the if cm[3]... statement
>>>                     cm[3] value is then 268.
>>>                     >
>>>                     > ...Pat C
>>>                     >
>>>                     > _______________________________________________
>>>                     > DPRGlist mailing list
>>>                     > DPRGlist at lists.dprg.org
>>>                     >
>>>                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>                     >
>>>
>>>                     -- 
>>>
>>>                     .......................................................................
>>>                     Murray Altheim <murray18 at altheim dot com>    
>>>                          = =  ===
>>>                     http://www.altheim.com/murray/    ===  ===
>>>                         = =  ===
>>>                          In the evening
>>>                          The rice leaves in the garden
>>>                          Rustle in the autumn wind
>>>                          That blows through my reed hut.
>>>                                 -- Minamoto no Tsunenobu
>>>
>>>                     _______________________________________________
>>>                     DPRGlist mailing list
>>>                     DPRGlist at lists.dprg.org
>>>                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>>         _______________________________________________
>>>         DPRGlist mailing list
>>>         DPRGlist at lists.dprg.org
>>>         http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>>     _______________________________________________
>>>     DPRGlist mailing list
>>>     DPRGlist at lists.dprg.org
>>>     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>>
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>
>>
>>
>> _______________________________________________
>> DPRGlist mailing list
>> DPRGlist at lists.dprg.org
>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>
> _______________________________________________
> DPRGlist mailing list
> DPRGlist at lists.dprg.org
> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/c2abf7e1/attachment.html>


More information about the DPRGlist mailing list