Reading and Writing to a com port

Posted on 2003-10-22
Last Modified: 2010-04-05
I have a good component that deals with com port data that I found on this website

Trouble is something has happened to my machine that has stopped this component working,

Can anyone suggest a better com port component or a fix that will suggest why this component keeps triggering recieving data?


I am using Delphi 7 and windows 2000.
Question by:ofdan
LVL 17

Accepted Solution

Wim ten Brink earned 34 total points
ID: 9599333
LVL 11

Assisted Solution

robert_marquardt earned 33 total points
ID: 9599646
Do not forget to take hardware errors into account.

Assisted Solution

gmayo earned 33 total points
ID: 9600113
Or just write your own:

unit TBall;

// Purpose: Handles trackerball interface via a comm port




procedure TBallDone;
procedure TBallInit(comportid : string);
procedure TBallTenMSTimer;



      CommPort : THandle;                  // Handle for the comm port
      Byte1, Byte2, Byte3 : byte;      // Most recently received bytes
      ByteCount : integer;            // Number of bytes received

Purpose:        Closes the communications port
Inputs:         None
Returns:        Nothing
Preconditions:  None
Postconditions: Comm port closed if open
Actions:        If the handle is non-zero, then close the handle and zero the handle.
procedure TBallDone;
      if CommPort <> 0 then begin
            CommPort := 0;

Purpose:        Initialises the communications port
Inputs:         comportid - Identity (e.g. COM2: ) of the communications port
Returns:        Nothing
Preconditions:  None
Postconditions: Comm port opened or error shown
Actions:        Open the comm port. If an error occurs then show the error. Otherwise, initialise
                the port to the appropriate speed etc.
procedure TBallInit(comportid : string);
      dcb : TDCB;
      t : TCommTimeouts;
      if CommPort <> 0 then TBallDone;
      CommPort := CreateFile(PChar(comportid), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
      if CommPort <> 0 then begin
            SetupComm(CommPort, 256, 256);

            dcb.DCBlength := SizeOf(dcb);
            GetCommState(CommPort, dcb);

            dcb.BaudRate := CBR_1200;
            dcb.Parity := NOPARITY;
            dcb.ByteSize := 8;
            dcb.StopBits := ONESTOPBIT;
            SetCommState(CommPort, dcb);

            t.ReadIntervalTimeout := MAXDWORD;
            t.ReadTotalTimeoutConstant := 0;
            t.ReadTotalTimeoutMultiplier := 0;
            t.WriteTotalTimeoutMultiplier := 0;
            t.WriteTotalTimeoutConstant := 0;
            SetCommTimeouts(CommPort, t);
      end else begin
            ShowMessage('Failed to open hardware port ' + comportid + ' for trackerball. Hardware will not be available in this session.');

Purpose:        Checks the port for activity
Inputs:         None
Returns:        Nothing
Preconditions:  Comm port opened
Postconditions: Mouse cursor moved if necessary
Actions:        Read any bytes from the comm port if open. If any are received, process them. Three
                bytes are received per movement, although not necessarily at the same time. Certain
                bit patterns in the 3 bytes denote the X and Y distance, and whether the byte is the
                first of the 3 (ie to synchronise with a triplet).
procedure TBallTenMSTimer;
      procedure ProcessMouse;
            {lb, rb : boolean;}
            xm, ym, xdiff : integer;
            xc, yc : shortint;
            p : TPoint;
            {lb := (Byte1 and 32) = 32;      // Not used at present
            rb := (Byte1 and 16) = 16;}
            xc := ((Byte1 and 3) shl 6) + (Byte2 and 63);
            yc := ((Byte1 and 12) shl 4) + (Byte3 and 63);
            xm := p.X + xc div 1;
            ym := p.Y - yc div 1;
            if MouseScreenBoundary then DisplayForm.MouseMoveTest(xm, ym, xdiff);
            SetCursorPos(xm, ym);
      buf : byte;
      numread : cardinal;
      if CommPort <> 0 then begin
            numread := 1;
            while (ReadFile(CommPort, buf, 1, numread, nil) = true) and (numread = 1) do begin
                  if (buf and 64) = 64 then begin
                        bytecount := 0;
                        Byte1 := buf;
                  end else if bytecount = 0 then begin
                        bytecount := 1;
                        Byte2 := buf;
                  end else if bytecount = 1 then begin
                        bytecount := 2;
                        Byte3 := buf;

Geoff M.

Author Comment

ID: 9622388
I have now tried writing my own com port component and finding different components.

It usually is infomation is sent to the comport and nothing is recieve or

courrupt data is recieved, which would suggest that there is something wrong with the hardware as it did work.

Thed reason I think it is not hardware is I can manually execute commands in HyperTerminal and everything performs as it should.

What does hyper terminal do that standard com component don't?

Expert Comment

ID: 9622526
It sounds like the buffer you are providing is wrong. Make sure the buffer you pass is in the correct format - see my example above (and below):

     buf : byte;
     numread : cardinal;
    ReadFile(CommPort, buf, 1, numread, nil)

Note that it is buf and not @buf like many Win32 APIs. Don't forget to check the length of data received (which may be 0 depending on how SetCommTimeouts has been set).

Note also that the first time you read from COM ports you DO get one or two rubbish characters. It shouldn't be a problem after that unless you physically unplug and plug in the serial cable, in which case you get more electrical noise and rubbish characters.

Geoff M.

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
proper way to parse url in delphi 2 164
build html 5 client that connect to indy Tidtcpserver 3 356
Convert Jpg /PNG To GIF 5 120
How to renew a Delphi rad-studio licence? 5 49
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.

867 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

13 Experts available now in Live!

Get 1:1 Help Now