VS2015 基于MSComm的串口调试

原问题:VS2015 基于MSComm的串口调试
分类:编程开发 > 最后更新时间:【2017-04-14 14:54:12】
问题补充:

编的的一个串口通讯测试的小程序,不知为什么运行后一直提示串口无法打开?

最佳答案

看不清楚图片。你可以先检查下波特率是否设置正确,串口有没有被占用等原因,如果确保调用都是正确的,那我再告诉你一个小秘密:mscomm控件有个bug,不能打开com 16以上的串口哦,所以如果串口号比较大也是打不开的


追问:
波特率和其他的一些参数没有错误啊,串口也都用串口调试助手试了,也都可以正常打开。当时打开的串口主要是COM1(自带)、COM3(PPI电缆装驱动后生成)和COM5(虚拟),都提示打不开。不知道是不是程序还有问题,请高手指点!!!主程序附录如下:// CMSCTestDlg.cpp : 实现文件//#include "stdafx.h"#include "CMSCTest.h"#include "CMSCTestDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CCMSCTestDlg 对话框CCMSCTestDlg::CCMSCTestDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_CMSCTEST_DIALOG, pParent), m_strRecvData(_T("")), m_strSendData(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCMSCTestDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_RECV, m_strRecvData);DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData);DDX_Control(pDX, IDC_MSCOMM1, m_Comm);}BEGIN_MESSAGE_MAP(CCMSCTestDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_SEND, &CCMSCTestDlg::OnButtonSend)END_MESSAGE_MAP()// CCMSCTestDlg 消息处理程序BOOL CCMSCTestDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码//串口初始化代码if (m_Comm.get_PortOpen())m_Comm.put_PortOpen(FALSE);m_Comm.put_CommPort(1);//选择COM1端口m_Comm.put_InputMode(1);//输入方式为二进制方式m_Comm.put_InBufferSize(1024);//设置输入缓冲区m_Comm.put_OutBufferSize(512);//设置输出缓冲区m_Comm.put_Settings(TEXT("9600,n,8,1"));//波特率9600,无校验,8个数据位,1个停止位if (!m_Comm.get_PortOpen()){m_Comm.put_PortOpen(TRUE);//打开串口m_Comm.put_RThreshold(1);//每当接收缓冲区有1个字符则接收串口数据m_Comm.put_InputLen(0);//设置当前缓冲区长度为0m_Comm.get_Input();//预读缓冲区以清除残留数据}elseAfxMessageBox(TEXT("打开端口失败!"), MB_ICONSTOP, 0);AfxMessageBox(_T("打开端口失败!"), MB_ICONSTOP, 0);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void CCMSCTestDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void CCMSCTestDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CCMSCTestDlg::OnQueryDragIcon(){return static_cast(m_hIcon);}BEGIN_EVENTSINK_MAP(CCMSCTestDlg, CDialogEx)ON_EVENT(CCMSCTestDlg, IDC_MSCOMM1, 1, CCMSCTestDlg::Oncomm, VTS_NONE)END_EVENTSINK_MAP()void CCMSCTestDlg::Oncomm(){// TODO: 在此处添加消息处理程序代码//从串口接受数据并显示在编辑框中VARIANT variant_inp;COleSafeArray safearray_inp;long len, k;byte rxdata[512];//设置BYTE数据CString strtemp;if (m_Comm.get_CommEvent() == 2)//值为2表示接收缓冲区内有字符{variant_inp = m_Comm.get_Input();//读缓冲区内的消息safearray_inp = variant_inp;//变量转换len = safearray_inp.GetOneDimSize();//得到有效的数据长度for (k = 0; k < len; k++)safearray_inp.GetElement(&k, rxdata + k);for (k = 0; k < len; k++)//将数据转换为Cstring型变量{char bt = *(char*)(rxdata + k);//字符型strtemp.Format(TEXT("%c"), bt);//将字符送入临时变量strtemp存放strtemp.Format(_T("%c"), bt);m_strRecvData += strtemp;//加入接收编辑框对应字符串}}CString temp = (TEXT("\r\n"));//显示完成后要自动换行m_strRecvData = temp;UpdateData(FALSE);//更新编辑框内容}void CCMSCTestDlg::OnButtonSend(){// TODO: 在此添加控件通知处理程序代码//单击发送按钮的操作UpdateData(true);//读取编辑框内容 m_Comm.put_Output(COleVariant(m_strSendData));//发送数据m_strSendData.Empty();//发送后清空输入框UpdateData(FALSE);//更新编辑框内容 //对发送的数据进行强制类型转换,由CString字符串数据转换为VARIANT类型} 追答:
大兄弟,你确定是打开串口失败了,而不是提示出错?你的代码中无论打开串口成功与否,都会弹出打开串口失败的对话框。
追问:
大神,确实多了一句,但是现在串口打开了,数据始终不能显示又是为什么呢?在笔记本上测试的,用的虚拟端口。求再指点一下
  • 追答:
    首先,确定有没有收到数据,如果没有收到数据,那就检查串口配置部分的代码。如果有收到数据,那就再看看接收的数据是否是字符串,比如收到的是0x31,会显示成字符‘1’,但是如果是0x01,就无法显示,需要转换字符‘0’和‘1’
    最佳答案由网友  听枫2005  提供
  • 公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
    10

    分享到:

    其他回答

    暂无其它回答!