MSComm控件出错

问题描述

我做了一个简单的MSComm控件的程序,但是一旦运行到串口控件初始化时就出错,如下图:具体代码如下://SerialCOMDlg.cpp:实现文件//#include"stdafx.h"#include"SerialCOM.h"#include"SerialCOMDlg.h"#include"afxdialogex.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于应用程序“关于”菜单项的CAboutDlg对话框classCAboutDlg:publicCDialogEx{public:CAboutDlg();//对话框数据enum{IDD=IDD_ABOUTBOX};protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//CSerialCOMDlg对话框CSerialCOMDlg::CSerialCOMDlg(CWnd*pParent/*=NULL*/):CDialogEx(CSerialCOMDlg::IDD,pParent){m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_strReceive=_T("");m_strSend=_T("");}voidCSerialCOMDlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX,IDC_receive,m_strReceive);DDX_Text(pDX,IDC_send,m_strSend);DDX_Control(pDX,IDC_send,m_ctrlSend);}BEGIN_MESSAGE_MAP(CSerialCOMDlg,CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK,&CSerialCOMDlg::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL,&CSerialCOMDlg::OnBnClickedCancel)END_MESSAGE_MAP()//CSerialCOMDlg消息处理程序BOOLCSerialCOMDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码m_ctrlComm.put_CommPort(1);m_ctrlComm.put_InputMode(1);//输入方式为二进制方式m_ctrlComm.put_InBufferSize(1024);//输入缓冲区大小为1024bytem_ctrlComm.put_OutBufferSize(512);//输出缓冲区大小为512bytem_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数:9600波特率,无奇偶校验,8个数据位,1个停止位if(!m_ctrlComm.get_PortOpen())m_ctrlComm.put_PortOpen(1);//打开串口m_ctrlComm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件m_ctrlComm.put_InputLen(0);//设置当前接收区数据长度为0m_ctrlComm.get_Input();//预读缓冲区以清空残留数据returnTRUE;//除非将焦点设置到控件,否则返回TRUE}voidCSerialCOMDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID,lParam);}}//如果向对话框添加最小化按钮,则需要下面的代码//来绘制该图标。对于使用文档/视图模型的MFC应用程序,//这将由框架自动完成。voidCSerialCOMDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);//用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0);//使图标在工作区矩形中居中intcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//绘制图标dc.DrawIcon(x,y,m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSORCSerialCOMDlg::OnQueryDragIcon(){returnstatic_cast<HCURSOR>(m_hIcon);}voidCSerialCOMDlg::OnBnClickedOk(){//TODO:在此添加控件通知处理程序代码//CDialogEx::OnOK();}voidCSerialCOMDlg::OnBnClickedCancel(){//TODO:在此添加控件通知处理程序代码CDialogEx::OnCancel();}

解决方案

解决方案二:
推荐你有CSERIALPORT
解决方案三:
推荐你有CSERIALPORT
解决方案四:
推荐你用CSERIALPORT
解决方案五:
第一看看电脑的串口是不是串口0,第二修改put_InputMode(0),InBufferSize=512,OutBufferSize=1024试试
解决方案六:
更正一下,看看电脑的串口是不是串口1

时间: 2024-09-18 07:53:33

MSComm控件出错的相关文章

pb 串行通讯-急求,大家好,我是PB软件的新手,在使用MSCOMM控件编写的时候遇到问题

问题描述 急求,大家好,我是PB软件的新手,在使用MSCOMM控件编写的时候遇到问题 在使用MSCOMM控件编写oncomm程序的时候,显示错误:coo31:syntax error string Is_input,Out_input choose case Ole_MSC.object.commevent case 2 //CommEvent属性为CommEvReceive Ole_MSC.object.InputLen=10000 //读入缓冲区中的数据长度 Is_input=Ole_MSC

金手指Delphi中MsComm控件的安装使用

Delphi 具有功能强大.简便易用和代码执行速度快等特点,是全球公认的快速应用开发工具技术的先驱者.但是在对串口通信的控制上Delphi的帮助文档和其他书籍中很少提及,这恰恰又是在开发应用系统时会经常遇到的问题.用过VB的程序员都知道 VB的MSComm通信控件具有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令的接口,可以用它创建全双工的.事件驱动的.高效实用的通信程序.在这里就介绍一下如何把MSComm这个ActiveX控件加入到Delphi中,充分发挥出二者的优越性. 首先

MSComm控件使用详解

摘要:本文详细介绍了MSComm控件在串口编程中使用. 目次 MSComm控件两种处理通讯的方式 CommPort属性 RThreshold 属性 CTSHolding属性 SThreshold 属性 CDHolding属性 DSRHolding属性 Settings 属性 InputLen 属性 EOFEnable 属性 Handshake 常数 OnComm 常数 InputMode 常数 错误消息 MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串

MSComm控件在基于单文档中的应用

本文配套源码下载 MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间.在基于对话框的应用中加入一个MSComm控件非常简单.只需进行以下操作即可: 打开"Project->Add To Project->Components and Controls->Registered Activex Controls",然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中.这样就将类 CMSCo

Delphi中利用MSCOMM控件进行GPS数据采集

1.准备 GPS(Global Positioning System),即全球定位系统,利用24颗GPS卫星的测距和测时功能进行全球定位,在许多系统中,如机场导航系统,出租车辆管理和调度系统.江河流域的灾害信息管理和预测系统中,GPS得到了广泛的应用.本文利用MSCOMM控件实现了GPS数据的采集,可为信息管理和指挥调度等提供定位数据. 本文采用GPS的异步串行传送方式,将GARMIN 12C按NMEA-0183协议输出的数据采集到了微机,并将接收到的地理坐标转换成为直角坐标. 在DELPHI

MSComm控件的Modem通讯

MSComm 控件通过串行端口(serial port)传送和接收数据,为应用程序提供了串行通讯功能.而且在可视化编程盛行的今天,可以很方便的在Visual Basic(VB).Visual C++(VC).Delphi等语言及开发平台中应用. MSComm 是 Microsoft 公司为简化Windows下串行端口编程而提供的ActiveX控件,它提供了一系列标准通讯命令的使用接口,为应用程序提供了通过串行口收发数据的简洁方法.处理数据的方式有事件驱动(Event-driver).查询法(In

线程与mscomm控件问题

问题描述 线程与mscomm控件问题 我是在做下位机向上位机传递数据,使用的mfc基于对话框的mscomm控件.需要动态实时显示曲线.我采用teechart控件来画曲线.mscomm控件有个Onmscomm()函数用来接收串口通信数据并存储起来.现在开辟了一个线程,在线程函数里实现对Onmscomm()接收到的数据的处理(此处为while(true)循环),再将处理的数据用来画图.但是现在调试时程序进入开辟的线程函数里,始终跳不出,无法进入Onmscomm()函数里(下位机有传数据),运行时会显

按钮-使用mscomm控件发送十六进制数据的写法

问题描述 使用mscomm控件发送十六进制数据的写法 我需要单击一个按钮时发送一个十六进制字符串例如"01 03 00" 解决方案 先将16进制转换成byte[]不知道什么语言,如果是C#可以写string[] hexstr = s.Split(' ');byte[] data = new byte[hexstr.Count()];for (int i = 0; i < hexstr.Count(); i++){ data[i] = Convert.ToByte(hexstr[i

轮循法-C++MSComm控件的定时接收数据怎么实现

问题描述 C++MSComm控件的定时接收数据怎么实现 查了好多资料都是VB的,我想定时的从输入缓冲区中读数,C++如何实现啊,新手求教! 解决方案 我用settimer这个来实现定时,可能是由于ONCOMM事件在缓冲区有数时候就会触发,两者发生冲突阻塞了,有人说还可以多线程实现定时,但是我是新手,有没有哪位前辈遇到这种问题,传授一二?