我在VC中,用CSerial Port 类,写一个串口通信小程序,想用WM_COMM_RXFLAG_DETECTED这个事件告知我一次接收信息完成。我的主程序文件是:CVerDlg.cpp,在该文件中:ON_MESSAGE(WM_COMM_RXFLAG_DETECTED, OnCommEnd)LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)在CVerDlg.h中:
afx_msg LONG OnCommEnd(WPARAM ch, LPARAM port);现在,当接收到串口发送来的消息后,我可以进入
LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)
这个函数但是,问题在于:
如果串口到来的消息只有一个字节,我每接收完这条消息后,进入LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)这个函数一次, 如果串口发送的消息大于一个字节(2~N)则每次接收完消息后,会进入这个函数两次,为啥会这样?还盼牛人指点!!!! 或者是,我对WM_COMM_RXFLAG_DETECTED这个事件的理解有问题??
afx_msg LONG OnCommEnd(WPARAM ch, LPARAM port);现在,当接收到串口发送来的消息后,我可以进入
LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)
这个函数但是,问题在于:
如果串口到来的消息只有一个字节,我每接收完这条消息后,进入LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)这个函数一次, 如果串口发送的消息大于一个字节(2~N)则每次接收完消息后,会进入这个函数两次,为啥会这样?还盼牛人指点!!!! 或者是,我对WM_COMM_RXFLAG_DETECTED这个事件的理解有问题??
解决方案 »
- Windows Sockets网络编程 基于UDP
- 关于setupfactory 制作安装文件,判断浏览器版本问题
- 为什么CTreeView一有滚动条,所选的ITEM就不准确了
- 字符串转换成语音播放出来
- 问一个sdk的问题,弹出对话框,在菜单中可以弹出,在某一个对话框上面点击按钮弹出另一个,怎么做?
- 如何使工具栏中的按扭disable
- CGridCtrl 的使用
- XML读入后如何修改并保存,使用MSXML,点击保存按钮无法保存修改后的文件
- VC中注册的ActiveX的ADO data、DataGrid、DataList、DataCombo控件到底属不属于MFC类的?
- 两个关于CStdioFile的问题?
- 我的VC中怎么没有GetDefaultPrinter函数?
- 简单的聊天室程序问题
我的协议是:没接收到一条信息,不验证信息的内容,立即回复一条信息(回复的信息是预先存储的,且每一条按次序均不相同)。在这种情况下,如果其实只收到一条信息,但却进入了两次LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)函数,这是,我的程序就会发出两条不同的应答信息,但事实上,这时候应该只发送一条应答信息,这就是现在的问题代码的话,其实就是我在1楼所贴的:
我的程序中使用了CSerialPort 类,我使用了该类中定义的WM_COMM_RXFLAG_DETECTED事件(Serial Port.h文件中)
#define WM_COMM_RXFLAG_DETECTED WM_USER+8 // The event character was received and placed in the input buffer. 而后,在我的主程序文件(CVer1Dlg.cpp)中,定义了LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)这个函数对该事件的响应
ON_MESSAGE(WM_COMM_RXFLAG_DETECTED, OnCommEnd)LONG CVer1Dlg::OnCommEnd(WPARAM ch, LPARAM port)当然,在CVer1Dlg.h中,也有声明
afx_msg LONG OnCommEnd(WPARAM ch, LPARAM port);就是这样的了现在的情况是,接收到一次串口数据后,可以进入上述函数,如果接收的数据只有一个字节,则只进入上述函数一次;如果一次接收的数据超过一个字节,就会进入上述函数两次。。 我想要的结果是,一次不管接收多少个字节,只进入这个函数一次。 这个,是不是也是WM_COMM_RXFLAG_DETECTED这个事件的本来意义?或者说,我对WM_COMM_RXFLAG_DETECTED这个事件的理解有问题?
SerialPort.h#ifndef __SERIALPORT_H__
#define __SERIALPORT_H__#define WM_COMM_BREAK_DETECTED WM_USER+1 // A break was detected on input.
#define WM_COMM_CTS_DETECTED WM_USER+2 // The CTS (clear-to-send) signal changed state.
#define WM_COMM_DSR_DETECTED WM_USER+3 // The DSR (data-set-ready) signal changed state.
#define WM_COMM_ERR_DETECTED WM_USER+4 // A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
#define WM_COMM_RING_DETECTED WM_USER+5 // A ring indicator was detected.
#define WM_COMM_RLSD_DETECTED WM_USER+6 // The RLSD (receive-line-signal-detect) signal changed state.
#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.
#define WM_COMM_RXFLAG_DETECTED WM_USER+8 // The event character was received and placed in the input buffer.
#define WM_COMM_TXEMPTY_DETECTED WM_USER+9 // The last character in the output buffer was sent. class CSerialPort
{
public:
int m_nWriteSize;
void ClosePort();
// contruction and destruction
CSerialPort();
virtual ~CSerialPort(); // port initialisation
BOOL InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, char parity = 'N', UINT databits = 8, UINT stopbits = 1, DWORD dwCommEvents = EV_RXCHAR, UINT writebuffersize = 1024);
HANDLE m_hComm; // start/stop comm watching
BOOL StartMonitoring();
BOOL RestartMonitoring();
BOOL StopMonitoring(); DWORD GetWriteBufferSize();
DWORD GetCommEvents();
DCB GetDCB(); void WriteToPort(char* string);
void WriteToPort(char* string,int n);
void WriteToPort(LPCTSTR string);
void WriteToPort(LPCTSTR string,int n);protected:
// protected memberfunctions
void ProcessErrorMessage(char* ErrorText);
static UINT CommThread(LPVOID pParam);
static void ReceiveChar(CSerialPort* port, COMSTAT comstat);
static void WriteChar(CSerialPort* port); // thread
CWinThread* m_Thread; // synchronisation objects
CRITICAL_SECTION m_csCommunicationSync;
BOOL m_bThreadAlive; // handles
HANDLE m_hWriteEvent;
HANDLE m_hShutdownEvent; // Event array.
// One element is used for each event. There are two event handles for each port.
// A Write event and a receive character event which is located in the overlapped structure (m_ov.hEvent).
// There is a general shutdown when the port is closed.
HANDLE m_hEventArray[3]; // structures
OVERLAPPED m_ov;
COMMTIMEOUTS m_CommTimeouts;
DCB m_dcb; // owner window
CWnd* m_pOwner; // misc
UINT m_nPortNr;
char* m_szWriteBuffer;
DWORD m_dwCommEvents;
DWORD m_nWriteBufferSize;
};#endif __SERIALPORT_H__