Solved

Serial Communications

Posted on 2004-04-14
5
507 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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Windows Drag & Drop Location 2 100
ASCII Non-Printable characters/codes and their HTML equivalents 6 113
VBA "SendKeys" Syntax for Multiple Keystrokes 7 108
unix example issues 18 89
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: Database storage, where is the exe actually on the disc? Playing a game selected randomly (how to generate random numbers).  Error trapping with try..catch to help the code run even if something goes wrong. Continuing from the seve…
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.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

813 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now