Solved

Serial Communications

Posted on 2004-04-14
5
518 Views
Last Modified: 2013-11-20
Hi

I am re-jigging some code I have used for some time now and have hit a small
problem.

I have two apps using the same serial comm code. On a call to

OnSerialMsg in the new app I am building

The debugger keeps bringing up the file

C\...\SRC\Intel\CHKSTK.ASM

File Header....

        page    ,132
        title   chkstk - C stack checking routine
;***
;chkstk.asm - C stack checking routine
;
;       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
;
;Purpose:
;       Provides support for automatic stack checking in C procedures
;       when stack checking is enabled.

End File Header


Then as soon as it hits any one of the if statements the debugger jumps to
return 0 and exits the function. I have debugged this code many times
and have never had this happen

LRESULT CSerialDlg::OnSerialMsg(WPARAM wParam, LPARAM /*lParam*/)
{
      CSerialAPI::EEvent eEvent = CSerialAPI::EEvent(LOWORD(wParam));
      CSerialAPI::EError eError = CSerialAPI::EError(HIWORD(wParam));

      if (eError)
            // what a do?

      if (eEvent & CSerialAPI::EEventBreak)
            

      if (eEvent & CSerialAPI::EEventError)
            
      
      if (eEvent & CSerialAPI::EEventRcvEv)
                 
                 ....................


        return 0;
}


Any help much appreciated

LittlePerson
0
Comment
Question by:LittlePerson
  • 3
  • 2
5 Comments
 
LVL 13

Expert Comment

by:SteH
ID: 10822516
An error during stack checking normally means that calling conventions don't match. Possible ones are __cdecl, __stdcall or PASCAL. The difference is how they treat arguments to functions: Putting them from left to right or the other way on the stack and who has to cleanup when the function finishes. If the stack is not cleaned up by the called function as the calles expected you will get this error. But writing out of bounds of an array might modify the stack in a way that a check fails on return.

Standard for C/C++ is __cdecl which means right to left pushing of arguments. Callee must clean the stack.
0
 

Author Comment

by:LittlePerson
ID: 10822570
I am not understanding !!!
0
 
LVL 13

Accepted Solution

by:
SteH earned 200 total points
ID: 10822751
To assure that the stack is not altered when returning from a call to a function a value is pushed onto the stack before calling the function and stored into a register. After returning these two values are compared and need to be identical. If not the above mentioned code is called. To get into this situation there are mainly two options:
1) Writing to a memory location using a pointer can modify the stored value. In that case you need to check whether all array indices you use are within bounds reserved for that array.

2) Calling conventions don't match. To find this type of error can be much more tricky since there are several possibilities. Values can be assumed to be put on the stack by value or by address. If their sizes don't match the cleaning up after calling will fail since the amount of data on the stack is different from the amount removed. Check all function declarations and that all header files agree.

Can you post more code?
0
 

Author Comment

by:LittlePerson
ID: 10824052
Thanks for the replies.

I will post more code later as time is tight at the moment. The only change I made
is that instead of writing CString* over the serial communication I am now sending
an unsigned char.

Till later...


Thanks
0
 

Author Comment

by:LittlePerson
ID: 10867595
Thanks again for the reply and sorry for the delay in getting
back to the question. Fortunately the code is performing OK now
(well I have a new problem now - new question to be posted)

Hopefully you can help with this new problem.

Regards
LittlePerson
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
VB.NET how to use the Vertical ScrollBar 5 114
Prevent this page from creating additional dialogs. 3 613
string initialization in java 11 115
Authenticate using sesu from script 7 56
Here is how to use MFC's automatic Radio Button handling in your dialog boxes and forms.  Beginner programmers usually start with a OnClick handler for each radio button and that's just not the right way to go.  MFC has a very cool system for handli…
Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question