I have developed two dialog based application One for reading from COM1 port and other
to write on COM1 port.Read application waits for com event.Problem is write application able to open com port if read applcation is not running.but not able to
open com port if read application is running.This is not threading problem,
Its something is regarding serial Port Basic concepts.
My Read and write functions are as follows.I need to extend this basic functionality
furthur,but before this simple read and write needs to work
int CReadDlg::Readme()
{
CString PortSpecifier = "COM1";
DCB dcb;
int retVal;
BYTE Byte;
DWORD dwBytesTransferred;
DWORD dwCommModemStatus;
HANDLE hPort = CreateFile(
PortSpecifier,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (!GetCommState(hPort,&dcb))
return 0x100;
dcb.BaudRate = CBR_9600; //9600 Baud
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop
if (!SetCommState(hPort,&dcb))
return 0x100;
SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event
WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character
if (dwCommModemStatus & EV_RXCHAR)
ReadFile (hPort, &Byte, 1, &dwBytesTransferred, 0); //read 1
else if (dwCommModemStatus & EV_ERR)
retVal = 0x101;
retVal = Byte;
CloseHandle(hPort);
return retVal;
}
Please use code tags [CODE][/CODE] when posting code.
There's no need to do this by yourself since there are so many free serial port classes on the net.
This is one example http://www.naughter.com/serialport.html
Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.
- Brian W. Kernighan
It sounds like you're trying to run both applications on the same computer. If so, you'll run in to another problem (which you may be aware of).
The sending of data will cause the data to be transmitted on the TxD pin of the serial port, but the read event won't be triggered unless the RxD pin receives something. You could make this happen by using a serial loopback connector (it connects TxD to RxD among other things).
Additionally, you're serial port might be set for hardware flow control, in which case nothing would be sent until the receiving device indicates it's ready. Of course you could turn flow control off which would eliminate that problem.
Hope this helps.
Be sure to rate those who help!
-------------------------------------------------------------
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
Bookmarks