问题:我想这个枪 一扫,文本框上就显示数据。
OnCommMscomm2 事件不起动。如何做
//打开串口 1 用来接扫描枪
m_mscom1.SetCommPort(1); //串口1
m_mscom1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom1.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
if(!m_mscom1.GetPortOpen()) //打开串口
{
m_mscom1.SetPortOpen(true);
}
m_mscom1.SetInputMode(1); //设置输入方式为二进制方式
m_mscom1.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom1.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom1.SetInputLen(0);
12 个解决方案
#1
引入控件后,为该控件添加控件类型变量m_ComPort;
添加串口事件消息处理函数OnComm
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
{
variant_inp=m_ComPort.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
}
}
http://www.gjwtech.com/serialcomm.htm
添加串口事件消息处理函数OnComm
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
{
variant_inp=m_ComPort.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
}
}
http://www.gjwtech.com/serialcomm.htm
#2
这个我也有
我做往串口写数据的时候能触发,用m_mscom.SetOutput(COleVariant(csLCID));,但是读数据是如何触发的呢
我做往串口写数据的时候能触发,用m_mscom.SetOutput(COleVariant(csLCID));,但是读数据是如何触发的呢
#3
把打开串口的语句放在设置串口参数的最后。
//打开串口 1 用来接扫描枪
m_mscom1.SetCommPort(1); //串口1
m_mscom1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom1.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
m_mscom1.SetInputMode(1); //设置输入方式为二进制方式
m_mscom1.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom1.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom1.SetInputLen(0);
if(!m_mscom1.GetPortOpen()) //打开串口
{
m_mscom1.SetPortOpen(true);
}
//打开串口 1 用来接扫描枪
m_mscom1.SetCommPort(1); //串口1
m_mscom1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom1.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
m_mscom1.SetInputMode(1); //设置输入方式为二进制方式
m_mscom1.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom1.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom1.SetInputLen(0);
if(!m_mscom1.GetPortOpen()) //打开串口
{
m_mscom1.SetPortOpen(true);
}
#4
读数据是如何触发的呢
----------
读数据哪有出发这一说?
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
。。。
}
当有数据来了,你就读呗,触发是为了某个事件产生时,告诉别人,你读数据不用告诉别人
----------
读数据哪有出发这一说?
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
。。。
}
当有数据来了,你就读呗,触发是为了某个事件产生时,告诉别人,你读数据不用告诉别人
#5
可是OnComm 不起作用 奇怪
#6
哦,你意思可能是,想发送数据时,把数据放在一个全局变量里,然后发送一个自定义消息,
通知自定义响应相应函数去发送这些数据。
这样的话就是自定义消息的问题
// 1:在头文件中定义自定义消息
#define WM_MYMSG WM_USER + 100
// 2:在BEGIN_MESSAGE_MAP里添加消息处理函数映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_MESSAGE(WM_MYMSG,OnMyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// 3:在类的定义中,添加消息处理函数声明
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CWLDlg)
enum { IDD = IDD_WL_DIALOG };
CListCtrl m_List;
CMSComm m_ComPort;
CString m_Data;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWLDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CWLDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnAbout();
afx_msg void OnMyMsg(WPARAM wp,LPARAM lp); //OnMyMsg vc6
afx_msg LRESULT OnMyMsg(WPARAM wp,LPARAM lp); //vc2005
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// 4:发送自定义消息 handle是接收此消息的窗口句柄
HWND mainhandle;
::PostMessage(HWND(mainhandle), WM_MYMSG, 0, 0);
通知自定义响应相应函数去发送这些数据。
这样的话就是自定义消息的问题
// 1:在头文件中定义自定义消息
#define WM_MYMSG WM_USER + 100
// 2:在BEGIN_MESSAGE_MAP里添加消息处理函数映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_MESSAGE(WM_MYMSG,OnMyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// 3:在类的定义中,添加消息处理函数声明
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CWLDlg)
enum { IDD = IDD_WL_DIALOG };
CListCtrl m_List;
CMSComm m_ComPort;
CString m_Data;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWLDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CWLDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnAbout();
afx_msg void OnMyMsg(WPARAM wp,LPARAM lp); //OnMyMsg vc6
afx_msg LRESULT OnMyMsg(WPARAM wp,LPARAM lp); //vc2005
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// 4:发送自定义消息 handle是接收此消息的窗口句柄
HWND mainhandle;
::PostMessage(HWND(mainhandle), WM_MYMSG, 0, 0);
#7
大哥, 我不是这意思
我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。
我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。
#8
1.检查扫描枪是否连在了com1口上,或者com1是否为坏的,用串口调试程序试下就知道了,
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的
#9
OnCommMscomm2内容是啥?
#10
mscomm那个控件有时会有这种毛病,或者自己写一个读写串口的函数, 或者向那个口发一个随便什么垃圾数据, 就能收到东西了。
#11
老兄,我也遇到这个问题,写了数据,但是ONCOMM事件没有被触发,搞不懂什么意思...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...
#12
老兄,我知道了,这个问题是你没有外部触发信号,弄个外部触发信号就搞定了
#1
引入控件后,为该控件添加控件类型变量m_ComPort;
添加串口事件消息处理函数OnComm
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
{
variant_inp=m_ComPort.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
}
}
http://www.gjwtech.com/serialcomm.htm
添加串口事件消息处理函数OnComm
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
{
variant_inp=m_ComPort.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
}
}
http://www.gjwtech.com/serialcomm.htm
#2
这个我也有
我做往串口写数据的时候能触发,用m_mscom.SetOutput(COleVariant(csLCID));,但是读数据是如何触发的呢
我做往串口写数据的时候能触发,用m_mscom.SetOutput(COleVariant(csLCID));,但是读数据是如何触发的呢
#3
把打开串口的语句放在设置串口参数的最后。
//打开串口 1 用来接扫描枪
m_mscom1.SetCommPort(1); //串口1
m_mscom1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom1.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
m_mscom1.SetInputMode(1); //设置输入方式为二进制方式
m_mscom1.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom1.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom1.SetInputLen(0);
if(!m_mscom1.GetPortOpen()) //打开串口
{
m_mscom1.SetPortOpen(true);
}
//打开串口 1 用来接扫描枪
m_mscom1.SetCommPort(1); //串口1
m_mscom1.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom1.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
m_mscom1.SetInputMode(1); //设置输入方式为二进制方式
m_mscom1.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom1.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom1.SetInputLen(0);
if(!m_mscom1.GetPortOpen()) //打开串口
{
m_mscom1.SetPortOpen(true);
}
#4
读数据是如何触发的呢
----------
读数据哪有出发这一说?
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
。。。
}
当有数据来了,你就读呗,触发是为了某个事件产生时,告诉别人,你读数据不用告诉别人
----------
读数据哪有出发这一说?
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
。。。
}
当有数据来了,你就读呗,触发是为了某个事件产生时,告诉别人,你读数据不用告诉别人
#5
可是OnComm 不起作用 奇怪
#6
哦,你意思可能是,想发送数据时,把数据放在一个全局变量里,然后发送一个自定义消息,
通知自定义响应相应函数去发送这些数据。
这样的话就是自定义消息的问题
// 1:在头文件中定义自定义消息
#define WM_MYMSG WM_USER + 100
// 2:在BEGIN_MESSAGE_MAP里添加消息处理函数映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_MESSAGE(WM_MYMSG,OnMyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// 3:在类的定义中,添加消息处理函数声明
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CWLDlg)
enum { IDD = IDD_WL_DIALOG };
CListCtrl m_List;
CMSComm m_ComPort;
CString m_Data;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWLDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CWLDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnAbout();
afx_msg void OnMyMsg(WPARAM wp,LPARAM lp); //OnMyMsg vc6
afx_msg LRESULT OnMyMsg(WPARAM wp,LPARAM lp); //vc2005
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// 4:发送自定义消息 handle是接收此消息的窗口句柄
HWND mainhandle;
::PostMessage(HWND(mainhandle), WM_MYMSG, 0, 0);
通知自定义响应相应函数去发送这些数据。
这样的话就是自定义消息的问题
// 1:在头文件中定义自定义消息
#define WM_MYMSG WM_USER + 100
// 2:在BEGIN_MESSAGE_MAP里添加消息处理函数映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_MESSAGE(WM_MYMSG,OnMyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// 3:在类的定义中,添加消息处理函数声明
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CWLDlg)
enum { IDD = IDD_WL_DIALOG };
CListCtrl m_List;
CMSComm m_ComPort;
CString m_Data;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWLDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CWLDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnAbout();
afx_msg void OnMyMsg(WPARAM wp,LPARAM lp); //OnMyMsg vc6
afx_msg LRESULT OnMyMsg(WPARAM wp,LPARAM lp); //vc2005
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// 4:发送自定义消息 handle是接收此消息的窗口句柄
HWND mainhandle;
::PostMessage(HWND(mainhandle), WM_MYMSG, 0, 0);
#7
大哥, 我不是这意思
我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。
我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。
#8
1.检查扫描枪是否连在了com1口上,或者com1是否为坏的,用串口调试程序试下就知道了,
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的
#9
OnCommMscomm2内容是啥?
#10
mscomm那个控件有时会有这种毛病,或者自己写一个读写串口的函数, 或者向那个口发一个随便什么垃圾数据, 就能收到东西了。
#11
老兄,我也遇到这个问题,写了数据,但是ONCOMM事件没有被触发,搞不懂什么意思...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...
#12
老兄,我知道了,这个问题是你没有外部触发信号,弄个外部触发信号就搞定了