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

weasea 2008-02-19 12:40:52
我有个扫描枪,是通过串口连到计算机上的
问题:我想这个枪 一扫,文本框上就显示数据。
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);
...全文
819 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SUGENG328 2009-06-14
  • 打赏
  • 举报
回复
老兄,我知道了,这个问题是你没有外部触发信号,弄个外部触发信号就搞定了
SUGENG328 2009-06-14
  • 打赏
  • 举报
回复
老兄,我也遇到这个问题,写了数据,但是ONCOMM事件没有被触发,搞不懂什么意思...
m_ComPort.GetCommEvent()这个数据就是不等于2,是个什么-4083,不管怎么发,发什么都是一样的,-4083...
sheenl 2008-02-21
  • 打赏
  • 举报
回复
mscomm那个控件有时会有这种毛病,或者自己写一个读写串口的函数, 或者向那个口发一个随便什么垃圾数据, 就能收到东西了。
tiger波波 2008-02-21
  • 打赏
  • 举报
回复
OnCommMscomm2内容是啥?
dabie 2008-02-20
  • 打赏
  • 举报
回复
1.检查扫描枪是否连在了com1口上,或者com1是否为坏的,用串口调试程序试下就知道了,
2.如果都对的那么按上面几位提供的设置的方法肯定是能出发的
weasea 2008-02-20
  • 打赏
  • 举报
回复
大哥, 我不是这意思

我的意思是 com1上连了个扫描枪 。我现在扫描,程序OnCommMscomm2 不触发。
易道禅 2008-02-19
  • 打赏
  • 举报
回复
把打开串口的语句放在设置串口参数的最后。
//打开串口 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);
}
weasea 2008-02-19
  • 打赏
  • 举报
回复
这个我也有
我做往串口写数据的时候能触发,用m_mscom.SetOutput(COleVariant(csLCID));,但是读数据是如何触发的呢
tiger波波 2008-02-19
  • 打赏
  • 举报
回复
引入控件后,为该控件添加控件类型变量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
tiger波波 2008-02-19
  • 打赏
  • 举报
回复
哦,你意思可能是,想发送数据时,把数据放在一个全局变量里,然后发送一个自定义消息,
通知自定义响应相应函数去发送这些数据。
这样的话就是自定义消息的问题

// 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);
weasea 2008-02-19
  • 打赏
  • 举报
回复
可是OnComm 不起作用 奇怪
tiger波波 2008-02-19
  • 打赏
  • 举报
回复
读数据是如何触发的呢
----------
读数据哪有出发这一说?
OnComm()
{
if(m_ComPort.GetCommEvent()==2) //有数据到达
。。。
}
当有数据来了,你就读呗,触发是为了某个事件产生时,告诉别人,你读数据不用告诉别人

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧