RE: rs232?



Hi Sean and all others!

Thankyou for your posts, I have gone to the web site:

http://www.codeproject.com/system/serial.asp

suggested by Jochen, and I would like to adopt the CSerialWnd method, since
I feel comfortable with it. However, I don't understand a few things. like:

Do I declare it like this in WIN main of VC++?

#include <windows.h>
#include "Sysmets.h"
#define STRICT
#include <tchar.h>
#include "Serial.h"


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInnstance,
PSTR szCmdLine, int iCmdShow)
{
CSerial serial;

Setup(CSerial::EBaudrate(9600),
CSerial::EDataBits(8),
CSerial::EParity(NOPARITY),
CSerial::EStopBits(ONESTOPBIT));


// Attempt to open the serial port (COM1)
serial.Open(_T("COM1"));

// Setup the serial port (9600,N81) using hardware handshaking

serial.Setup
(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop1);
serial.SetupHandshaking(CSerial::EHandshakeHardware);

// The serial port is now ready and we can send/receive data.
serial.Write("Hello world");

// Close the port again
serial.Close();



static TCHAR szAppName[] = TEXT ("SysMets3");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW |CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("xxx"),szAppName, MB_ICONERROR);
return 0;
}

hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No3!"),
WS_OVERLAPPEDWINDOW |WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow (hwnd);

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

=================================================

But then further in the document it says to open the port with this:

=================================================
LONG Open (
LPCTSTR lpszDevice,
HWND hwndDest,
UINT nComMsg = WM_NULL,
LPARAM lParam = 0,
DWORD dwInQueue = 0,
DWORD dwOutQueue = 0
)

===================================================

and then it shows what looks like something I would be used to seeing:

===================================================
LRESULT CALLBACK MyWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM
lParam)
{
if (nMsg == CSerialWnd::mg_nDefaultComMsg)
{
// A serial message occurred
const CSerialWnd::EEvent eEvent = CSerialWnd::EEvent(LOWORD(wParam));
const CSerialWnd::EError eError = CSerialWnd::EError(HIWORD(wParam));

switch (eEvent)
{
case CSerialWnd::EEventRecv:
// TODO: Read data from the port
break;

...
}

// Return successful
return 0;
}

// Perform other window processing
...
}

==================================================

How do you put it all together! :(

I have read the whole document and it shows that you should not try to get
events for your serial port through the Windows message loop, it also shows
various ways of
getting events from the serial port such as:

"CSerial is the base serial class, which provides a wrapper around the Win32
API. It is a lot easier to use, because it combines all relevant calls in one
single class. It allows the programmer to mix overlapped and non-overlapped
calls, provides reasonable default settings, better readability, etc, etc.
CSerialEx adds an additional thread to the serial class, which can be used
to handle the serial events. This releases the main GUI thread from the
serial burden. The main disadvantage of this class is that it introduces
threading to your architecture, which might be hard for some people.
CSerialWnd fits in the Windows event driven model. Whenever a communication
event occurs a message is posted to the owner window, which can process the
event.
CSerialMFC is an MFC wrapper around CSerialWnd, which make the serial
classes fit better in MFC based programs. "

I would be interested in the CSerialWnd approach... But do I innitialize it
and set it up as shown above..... This document confused me more than
anything else.

Does anyone know of a good book which shows only the core code to simply
receive *one* byte and transmit *one* byte. It seems to me that you must
declare a serial object or in my case a CSerialWnd object and then set it up,
and then open the port and wait for some messages so you can trap them and
read or write to the port.

I have not yet gone to the Win32, Communications Resources section of the
SDK.
I wil do this as soon as I finish this post!

I have not used yet file I/Os, so I don't know if this will be easy to do
with
CreateFile, ReadFile and WriteFile, and CloseHandle to open, read/write and
close the port respectively.

I tried to enter words like SerialPort class in the help, but found nothing.

All samples, suggestions, help documents, or any pointers to this is (at
this point) so appreciated!

help!

--
Best regards
Robert


"Sean M. DonCarlos" wrote:

"Robby" wrote:

I find myself faced with the need to do some serial communications from VC++
to the rs232 port of my computer.

Can someone directme to the pertinant commands in C or in C++ in order to do
this.

In Win32, see the Communications Resources section of the SDK. Typically,
serial port I/O is handled in much the same way as file I/O: You use
CreateFile, ReadFile and WriteFile, and CloseHandle to open, read/write and
close the port respectively. There are some other APIs and structures that
handle configuration of the serial ports.

In C++/CLI, use the System::IO::Ports::SerialPort class.

Sean
.



Relevant Pages

  • Re: SerialPort Caching?
    ... Dropping the odd GPS sentence is hardly going to stuff things up much if ... ReadLine looks at the buffer for a line break, ... close the port during a read. ... SerialPort for 10x seconds...not sure what the exact numbers are, ...
    (microsoft.public.dotnet.framework.compactframework)
  • Re: Virtual COM port with UMDF
    ... virtual com port. ... The file type returned by GetFileTypeis 1, ... Please do not send e-mail directly to this alias. ... I would like to debug into the SerialPort component of .NET, ...
    (microsoft.public.development.device.drivers)
  • Re: Virtual COM port with UMDF
    ... component SerialPort can now open my virtual com port. ... Please do not send e-mail directly to this alias. ... I would like to debug into the SerialPort component of .NET, ... driver cannot write to this key so that it is not possible without ...
    (microsoft.public.development.device.drivers)
  • Problem with JNI and Tomcat
    ... This DLL is used to communicate over a RS232 port, and it must notice any event that occurs on the port to the java application. ... the nativeOpenPort functions looks for the "notifyEvent" Java method in the object that called it, in order to notify events when they occurs, and saves it in the "eventNotifyMethod" of the SERIALPORT structure ... private int portType; ...
    (comp.lang.java.programmer)

Loading