串口通信问题,如何触发oncomm事件 ?

时间:2023-01-20 19:57:00
我有个扫描枪,是通过串口连到计算机上的
问题:我想这个枪 一扫,文本框上就显示数据。
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

#2


这个我也有
我做往串口写数据的时候能触发,用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);   

#4


读数据是如何触发的呢
----------
读数据哪有出发这一说?
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);

#7


大哥, 我不是这意思

我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。

#8


1.检查扫描枪是否连在了com1口上,或者com1是否为坏的,用串口调试程序试下就知道了,
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的

#9


OnCommMscomm2内容是啥?

#10


mscomm那个控件有时会有这种毛病,或者自己写一个读写串口的函数, 或者向那个口发一个随便什么垃圾数据, 就能收到东西了。

#11


老兄,我也遇到这个问题,写了数据,但是ONCOMM事件没有被触发,搞不懂什么意思...
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

#2


这个我也有
我做往串口写数据的时候能触发,用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);   

#4


读数据是如何触发的呢
----------
读数据哪有出发这一说?
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);

#7


大哥, 我不是这意思

我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。

#8


1.检查扫描枪是否连在了com1口上,或者com1是否为坏的,用串口调试程序试下就知道了,
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的

#9


OnCommMscomm2内容是啥?

#10


mscomm那个控件有时会有这种毛病,或者自己写一个读写串口的函数, 或者向那个口发一个随便什么垃圾数据, 就能收到东西了。

#11


老兄,我也遇到这个问题,写了数据,但是ONCOMM事件没有被触发,搞不懂什么意思...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...

#12


老兄,我知道了,这个问题是你没有外部触发信号,弄个外部触发信号就搞定了