参考文档:http://wenku.baidu.com/link?url=MLGQojaxyHnEgngEAXG8oPnISuM9SVaDzNTvg0oTSrrJkMXIR_6MR3cO_Vnh-grkUekLw2CSnQlE2ni5P-CzCCyI36fnNFFl_BkbEbMomP_     MSComm在VS2010中的实现过程

注:在vs2010中MSComm类中一些函数被改变了,例如setcommport()被改成了put_commport(),getinput()改为了get_input(),以此类推。

串口编程流程

1、串口初始化。

在MSCommDlg.cpp中的OnInitDialog()中,加入串口初始化代码。

代码如下:

  1. 1: // CMSCommDlg 消息处理程序
  1. 2:  
  1. 3: BOOL CMSCommDlg::OnInitDialog()
  1. 4: {
  1. 5: CDialogEx::OnInitDialog();
  1. 6:  
  1. 7: // 将“关于...”菜单项添加到系统菜单中。
  1. 8:  
  1. 9: // IDM_ABOUTBOX 必须在系统命令范围内。
  1. 10: ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  1. 11: ASSERT(IDM_ABOUTBOX < 0xF000);
  1. 12:  
  1. 13: CMenu* pSysMenu = GetSystemMenu(FALSE);
  1. 14: if (pSysMenu != NULL)
  1. 15: {
  1. 16: BOOL bNameValid;
  1. 17: CString strAboutMenu;
  1. 18: bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  1. 19: ASSERT(bNameValid);
  1. 20: if (!strAboutMenu.IsEmpty())
  1. 21: {
  1. 22: pSysMenu->AppendMenu(MF_SEPARATOR);
  1. 23: pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  1. 24: }
  1. 25: }
  1. 26:  
  1. 27: // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  1. 28: // 执行此操作
  1. 29: SetIcon(m_hIcon, TRUE); // 设置大图标
  1. 30: SetIcon(m_hIcon, FALSE); // 设置小图标
  1. 31:  
  1. 32: // TODO: 在此添加额外的初始化代码
  1. 33: m_Comm.put_CommPort(2);//选择串口2
  1. 34: m_Comm.put_InputMode(1);//输入模式为二进制模式
  1. 35: m_Comm.put_InBufferSize(1024);//输入缓冲区大小
  1. 36: m_Comm.put_OutBufferSize(512);//输出缓冲区大小
  1. 37: //设置波特率9600,无奇偶校验,8位数据位,1位停止位
  1. 38: m_Comm.put_Settings(_T("9600,n,8,1"));
  1. 39: if(!m_Comm.get_PortOpen())
  1. 40: {
  1. 41: m_Comm.put_PortOpen(TRUE);//打开串口
  1. 42: }
  1. 43: //每接收一个字符或多个字符就会触发OnComm事件
  1. 44: m_Comm.put_RThreshold(1);//每当接收缓冲区有1个字符则接收串口数据
  1. 45: //清空缓存区内容
  1. 46: m_Comm.put_InputLen(0);// 设置当前缓冲区长度为0
  1. 47: m_Comm.get_Input(); // 预读缓冲区以清除残留数据(从接收缓冲区中读取数据)
  1. 48:  
  1. 49: return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  1. 50: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2、为MSComm类添加事件处理函数OnCommMscomm1();用于处理接收到的数据。

注:在此介绍一个小知识。文本框如何和字符串相关联。

DDX_Control 与 DDX_Text 区别

1)DDX_Text()的作用可以理解为把字符串变量与控件的文本(WindowText)关联起来。

2)DDX_Control()的作用可以理解为把变量和控件本身相关联,此变量就是一个控件类型的变量。

3)DoDataExchange(pDX)的作业可以理解为处理所有变量与其相关联控件,两者进行数据交换的函数。

  1. 1: void CView::DoDataExchange(CDataExchange* pDX)
  1. 2:
  1. 3: CFormView::DoDataExchange(pDX);
  1. 4: DDX_Text(pDX, IDC_ID_VALUE, m_strID); //1
  1. 5: DDX_Control(pDX, IDC_ID_VALUE, m_editID);  //2
  1. 6:

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

针对1:  通过updateData(TRUE)取得控件上的值传给m_strID,此时说明可以进行修改。修改完之后,通过ApdateData(FALSE),将变量的值传回控件,然后进行界面显示。
      针对2: 通过m_editID.GetWindText(str),取得值,处理后,通过m_editID.SetWindText(str)传回控件界面显示。

下面再举一个小实例来进行说明:

  1. 给编辑框加成员变量m_strA
    在响应插入操作的消息里如下写
    UpdateData(TRUE);
    m_strA += _T("b"); //此处只能是一个常量,变量行不通,需要利用DDX_Text()或者下面的函数进行处理。
    UpdateData(FALSE);
  1. 等同于:
  1. CString str;
    ((CEdit*)GetDlgItem(IDC_EDIT)->GetWindowText(str);
    str+="b";
    ((CEdit*)GetDlgItem(IDC_EDIT)->SetWindowText(str);
  1.  
  1.  
  1. 主要程序如下:
  1. 1: void CMSCommDlg::OnCommMscomm1()
  1. 2: {
  1. 3: // TODO: 在此处添加消息处理程序代码
  1. 4: VARIANT variant_inp;//VARIANT型变量,用于接收串口数据
  1. 5: COleSafeArray safearray_inp;//安全数组,用于接收串口数据
  1. 6: LONG len,k;
  1. 7: BYTE rxdata[2048];//接收数据缓冲区
  1. 8: CString strTemp;
  1. 9: if(m_Comm.get_CommEvent() == 2)//事件值为2表示有接收到的数据到来
  1. 10: {
  1. 11: variant_inp = m_Comm.get_Input();
  1. 12: safearray_inp = variant_inp;//将VARIANT类型变量转换为COleSafeArray类型变量(我们可以理解为一个容器,有数据有长度尺寸等。)
  1. 13: len = safearray_inp.GetOneDimSize();//获取有效数据的长度
  1. 14: for(k = 0; k < len; k++)
  1. 15: {
  1. 16: safearray_inp.GetElement(&k,rxdata+k);//将COleSafeArray类型变量,拆解为字符数组。
  1. 17: }
  1. 18: for(k = 0; k < len; k++) //将字符数组转换为字符串类型变量
  1. 19: {
  1. 20: BYTE bt = *(char *)(rxdata + k);
  1. 21: strTemp.Format(_T("%c"),bt);
  1. 22: m_strEditRXData += (strTemp);
  1. 23: }
  1. 24: }
  1. 25: //自动换行的实现
  1. 26: CString temp = _T("\r\n");//显示完成后要自动换行
  1. 27: //_T就是TEXT,vs2010里面为了兼容vc6.0而设计的转换(兼容)函数。
  1. 28: m_strEditRXData += temp;
  1. 29: UpdateData(FALSE); //显示接收编辑框中的内容
  1. 30: }

3、发送数据。通过put_output()函数,向发送缓冲区写入数据即可。

为对话框类添加onbuttonsend函数,然后编辑。核心代码如下:

  1. 1: void CMSCommDlg::OnBnClickedButton1Send()
  1. 2: {
  1. 3: // TODO: 在此添加控件通知处理程序代码
  1. 4: UpdateData(TRUE); //读取发送编辑框中的文本内容
  1. 5: //对发送的数据进行强制类型转换,由CString 字符串数据转换为VARIANT 类型。
  1. 6: m_Comm.put_Output(COleVariant(m_strEditTXData));//发送数据,可以将字符串变为VARIANT型数据类型
  1. 7: //以下两句代码可以不要。以下两句为一个整体,用其一肯定没有用处。
  1. 8: //用下面两句就不用手动清空了。呵呵,可以自动清空发送缓冲区数据。
  1. 9: //首先清空发送的字符串变量,然后将此变量的值返回给控件。使控件为空。从而达到清空的目的。
  1. 10: m_strEditTXData.Empty();//发送后清空输入框
  1. 11: UpdateData(FALSE); //更新编辑框内容
  1. 12: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4、结果演示:

  1.  
  1.  
  1. 以下是整个代码:(供读者朋友们参考)
  1. MSCommDlg.cpp文件:
  1. 1:  
  1. 2: // MSCommDlg.cpp : 实现文件
  1. 3: //
  1. 4:  
  1. 5: #include "stdafx.h"
  1. 6: #include "MSComm.h"
  1. 7: #include "MSCommDlg.h"
  1. 8: #include "afxdialogex.h"
  1. 9: #include "Resource.h"
  1. 10:  
  1. 11: #ifdef _DEBUG
  1. 12: #define new DEBUG_NEW
  1. 13: #endif
  1. 14:  
  1. 15:  
  1. 16: // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  1. 17:  
  1. 18: class CAboutDlg : public CDialogEx
  1. 19: {
  1. 20: public:
  1. 21: CAboutDlg();
  1. 22:  
  1. 23: // 对话框数据
  1. 24: enum { IDD = IDD_ABOUTBOX };
  1. 25:  
  1. 26: protected:
  1. 27: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  1. 28:  
  1. 29: // 实现
  1. 30: protected:
  1. 31: DECLARE_MESSAGE_MAP()
  1. 32: };
  1. 33:  
  1. 34: CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  1. 35: {
  1. 36: }
  1. 37:  
  1. 38: void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  1. 39: {
  1. 40: CDialogEx::DoDataExchange(pDX);
  1. 41: }
  1. 42:  
  1. 43: BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  1. 44: END_MESSAGE_MAP()
  1. 45:  
  1. 46:  
  1. 47: // CMSCommDlg 对话框
  1. 48:  
  1. 49:  
  1. 50:  
  1. 51:  
  1. 52: CMSCommDlg::CMSCommDlg(CWnd* pParent /*=NULL*/)
  1. 53: : CDialogEx(CMSCommDlg::IDD, pParent)
  1. 54: {
  1. 55: m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  1. 56: m_strEditRXData = _T(""); //也可以自己自动在对话框上右击,添加变量生成。
  1. 57: m_strEditTXData = _T("");
  1. 58: }
  1. 59:  
  1. 60: void CMSCommDlg::DoDataExchange(CDataExchange* pDX)
  1. 61: {
  1. 62: CDialogEx::DoDataExchange(pDX);
  1. 63: DDX_Control(pDX, IDC_MSCOMM1, m_Comm);
  1. 64: // DDX_Control(pDX, IDC_EDIT1, m_strEditRXData);
  1. 65: DDX_Text(pDX,IDC_EDIT1,m_strEditRXData);
  1. 66: DDX_Text(pDX,IDC_EDIT2,m_strEditTXData);
  1. 67: }
  1. 68:  
  1. 69: BEGIN_MESSAGE_MAP(CMSCommDlg, CDialogEx)
  1. 70: ON_WM_SYSCOMMAND()
  1. 71: ON_WM_PAINT()
  1. 72: ON_WM_QUERYDRAGICON()
  1. 73: ON_BN_CLICKED(IDC_BUTTON1_SEND, &CMSCommDlg::OnBnClickedButton1Send)
  1. 74: END_MESSAGE_MAP()
  1. 75:  
  1. 76:  
  1. 77: // CMSCommDlg 消息处理程序
  1. 78:  
  1. 79: BOOL CMSCommDlg::OnInitDialog()
  1. 80: {
  1. 81: CDialogEx::OnInitDialog();
  1. 82:  
  1. 83: // 将“关于...”菜单项添加到系统菜单中。
  1. 84:  
  1. 85: // IDM_ABOUTBOX 必须在系统命令范围内。
  1. 86: ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  1. 87: ASSERT(IDM_ABOUTBOX < 0xF000);
  1. 88:  
  1. 89: CMenu* pSysMenu = GetSystemMenu(FALSE);
  1. 90: if (pSysMenu != NULL)
  1. 91: {
  1. 92: BOOL bNameValid;
  1. 93: CString strAboutMenu;
  1. 94: bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  1. 95: ASSERT(bNameValid);
  1. 96: if (!strAboutMenu.IsEmpty())
  1. 97: {
  1. 98: pSysMenu->AppendMenu(MF_SEPARATOR);
  1. 99: pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  1. 100: }
  1. 101: }
  1. 102:  
  1. 103: // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  1. 104: // 执行此操作
  1. 105: SetIcon(m_hIcon, TRUE); // 设置大图标
  1. 106: SetIcon(m_hIcon, FALSE); // 设置小图标
  1. 107:  
  1. 108: // TODO: 在此添加额外的初始化代码
  1. 109: m_Comm.put_CommPort(2);//选择串口2
  1. 110: m_Comm.put_InputMode(1);//输入模式为二进制模式
  1. 111: m_Comm.put_InBufferSize(1024);//输入缓冲区大小
  1. 112: m_Comm.put_OutBufferSize(512);//输出缓冲区大小
  1. 113: //设置波特率9600,无奇偶校验,8位数据位,1位停止位
  1. 114: m_Comm.put_Settings(_T("9600,n,8,1"));
  1. 115: if(!m_Comm.get_PortOpen())
  1. 116: {
  1. 117: m_Comm.put_PortOpen(TRUE);//打开串口
  1. 118: }
  1. 119: //每接收一个字符或多个字符就会触发OnComm事件
  1. 120: m_Comm.put_RThreshold(1);//每当接收缓冲区有1个字符则接收串口数据
  1. 121: //清空缓存区内容
  1. 122: m_Comm.put_InputLen(0);// 设置当前缓冲区长度为0
  1. 123: m_Comm.get_Input(); // 预读缓冲区以清除残留数据(从接收缓冲区中读取数据)
  1. 124:  
  1. 125: return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  1. 126: }
  1. 127:  
  1. 128: void CMSCommDlg::OnSysCommand(UINT nID, LPARAM lParam)
  1. 129: {
  1. 130: if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  1. 131: {
  1. 132: CAboutDlg dlgAbout;
  1. 133: dlgAbout.DoModal();
  1. 134: }
  1. 135: else
  1. 136: {
  1. 137: CDialogEx::OnSysCommand(nID, lParam);
  1. 138: }
  1. 139: }
  1. 140:  
  1. 141: // 如果向对话框添加最小化按钮,则需要下面的代码
  1. 142: // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  1. 143: // 这将由框架自动完成。
  1. 144:  
  1. 145: void CMSCommDlg::OnPaint()
  1. 146: {
  1. 147: if (IsIconic())
  1. 148: {
  1. 149: CPaintDC dc(this); // 用于绘制的设备上下文
  1. 150:  
  1. 151: SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  1. 152:  
  1. 153: // 使图标在工作区矩形中居中
  1. 154: int cxIcon = GetSystemMetrics(SM_CXICON);
  1. 155: int cyIcon = GetSystemMetrics(SM_CYICON);
  1. 156: CRect rect;
  1. 157: GetClientRect(&rect);
  1. 158: int x = (rect.Width() - cxIcon + 1) / 2;
  1. 159: int y = (rect.Height() - cyIcon + 1) / 2;
  1. 160:  
  1. 161: // 绘制图标
  1. 162: dc.DrawIcon(x, y, m_hIcon);
  1. 163: }
  1. 164: else
  1. 165: {
  1. 166: CDialogEx::OnPaint();
  1. 167: }
  1. 168: }
  1. 169:  
  1. 170: //当用户拖动最小化窗口时系统调用此函数取得光标
  1. 171: //显示。
  1. 172: HCURSOR CMSCommDlg::OnQueryDragIcon()
  1. 173: {
  1. 174: return static_cast<HCURSOR>(m_hIcon);
  1. 175: }
  1. 176:  
  1. 177: BEGIN_EVENTSINK_MAP(CMSCommDlg, CDialogEx)
  1. 178: ON_EVENT(CMSCommDlg, IDC_MSCOMM1, 1, CMSCommDlg::OnCommMscomm1, VTS_NONE)
  1. 179: END_EVENTSINK_MAP()
  1. 180:  
  1. 181:  
  1. 182: void CMSCommDlg::OnCommMscomm1()
  1. 183: {
  1. 184: // TODO: 在此处添加消息处理程序代码
  1. 185: VARIANT variant_inp;//VARIANT型变量,用于接收串口数据
  1. 186: COleSafeArray safearray_inp;//安全数组,用于接收串口数据
  1. 187: LONG len,k;
  1. 188: BYTE rxdata[2048];//接收数据缓冲区
  1. 189: CString strTemp;
  1. 190: if(m_Comm.get_CommEvent() == 2)//事件值为2表示有接收到的数据到来
  1. 191: {
  1. 192: variant_inp = m_Comm.get_Input();
  1. 193: safearray_inp = variant_inp;//将VARIANT类型变量转换为COleSafeArray类型变量(我们可以理解为一个容器,有数据有长度尺寸等。)
  1. 194: len = safearray_inp.GetOneDimSize();//获取有效数据的长度
  1. 195: for(k = 0; k < len; k++)
  1. 196: {
  1. 197: safearray_inp.GetElement(&k,rxdata+k);//将COleSafeArray类型变量,拆解为字符数组。
  1. 198: }
  1. 199: for(k = 0; k < len; k++) //将字符数组转换为字符串类型变量
  1. 200: {
  1. 201: BYTE bt = *(char *)(rxdata + k);
  1. 202: strTemp.Format(_T("%c"),bt);
  1. 203: m_strEditRXData += (strTemp);
  1. 204: }
  1. 205: }
  1. 206: //自动换行的实现
  1. 207: CString temp = _T("\r\n");//显示完成后要自动换行
  1. 208: //_T就是TEXT,vs2010里面为了兼容vc6.0而设计的转换(兼容)函数。
  1. 209: m_strEditRXData += temp;
  1. 210: UpdateData(FALSE); //显示接收编辑框中的内容
  1. 211: }
  1. 212:  
  1. 213:  
  1. 214: void CMSCommDlg::OnBnClickedButton1Send()
  1. 215: {
  1. 216: // TODO: 在此添加控件通知处理程序代码
  1. 217: UpdateData(TRUE); //读取发送编辑框中的文本内容
  1. 218: //对发送的数据进行强制类型转换,由CString 字符串数据转换为VARIANT 类型。
  1. 219: m_Comm.put_Output(COleVariant(m_strEditTXData));//发送数据,可以将字符串变为VARIANT型数据类型
  1. 220: //以下两句代码可以不要。以下两句为一个整体,用其一肯定没有用处。
  1. 221: //用下面两句就不用手动清空了。呵呵,可以自动清空发送缓冲区数据。
  1. 222: //首先清空发送的字符串变量,然后将此变量的值返回给控件。使控件为空。从而达到清空的目的。
  1. 223: m_strEditTXData.Empty();//发送后清空输入框
  1. 224: UpdateData(FALSE); //更新编辑框内容
  1. 225: }

MSCommDlg.h 文件:

  1. 1:  
  1. 2: // MSCommDlg.h : 头文件
  1. 3: //
  1. 4:  
  1. 5: #pragma once
  1. 6: #include "mscomm1.h"
  1. 7: #include "afxwin.h"
  1. 8:  
  1. 9:  
  1. 10: // CMSCommDlg 对话框
  1. 11: class CMSCommDlg : public CDialogEx
  1. 12: {
  1. 13: // 构造
  1. 14: public:
  1. 15: CMSCommDlg(CWnd* pParent = NULL); // 标准构造函数
  1. 16:  
  1. 17: // 对话框数据
  1. 18: enum { IDD = IDD_MSCOMM_DIALOG };
  1. 19:  
  1. 20: protected:
  1. 21: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  1. 22:  
  1. 23:  
  1. 24: // 实现
  1. 25: protected:
  1. 26: HICON m_hIcon;
  1. 27:  
  1. 28: // 生成的消息映射函数
  1. 29: virtual BOOL OnInitDialog();
  1. 30: afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  1. 31: afx_msg void OnPaint();
  1. 32: afx_msg HCURSOR OnQueryDragIcon();
  1. 33: DECLARE_MESSAGE_MAP()
  1. 34: public:
  1. 35: DECLARE_EVENTSINK_MAP()
  1. 36: void OnCommMscomm1();
  1. 37: afx_msg void OnBnClickedButton1Send();
  1. 38: CMscomm1 m_Comm;
  1. 39: CString m_strEditRXData;   //可以通过为对话框添加变量建立此变量,也可以直接敲代码建立此成员变量。
  1. 40: CString m_strEditTXData; //假如是通过直接敲代码建立的成员变量,需要在.cpp文件里面手动初始化。然后,在和需要联系的
  1. 41: // CEdit m_strEditRXData; // 控件建立联系。.cpp里面有很详细。
  1. 42: };

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

MSComm串口类的使用 (程序设计)的更多相关文章

  1. 谢欣伦 - OpenDev原创教程 - 串口类CxSerial

    这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...

  2. 一个由印度人编写的VC串口类

    http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...

  3. mfc的一个串口类

    这几天一直再看串口相关知识,对于其总结为如下串口类: 头文件声明如下: #pragma once // 声明当串口接收到线程的时候调用的函数指针 // 参数: 1,接收到的数据: 2,数据长度: 3, ...

  4. Remon Spekreijse CSerialPort串口类的修正版2014-01-10

    转自:http://m.blog.csdn.net/blog/itas109/18358297# 2014-1-16阅读691 评论0 如需转载请标明出处:http://blog.csdn.net/i ...

  5. CSerialPort串口类最新修正版(解决关闭死锁问题)

    这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...

  6. Qt 串口类QSerialPort 使用笔记

    Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...

  7. CSerialPort串口类最新修正版(解决关闭死锁问题)2014-01-11

    这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...

  8. MSComm 串口

    MSComm 串口 http://www.docin.com/p-761416611.html http://blog.sina.com.cn/s/blog_50cfd0fc0102v27p.html

  9. <QT之Bug制造机>QT中串口类“QSerialPort”的学习笔记

    QT5中已经增加了串口类QSrialPort,可以直接调用API函数进行快速开发. 1. 获取串口信息 Dialog::Dialog(QWidget *parent) : QDialog(parent ...

随机推荐

  1. Linux PC开发环境搭建建议

    搭建Linux PC开发环境 很早之前整理的在Linux(ubuntu)系统下搭建 PC开发环境的工具的推荐和简单说明,尽管现在有些已经不再使用,但还是要备份一下,作为以后的参考: package: ...

  2. 2018华南理工大学程序设计竞赛 H-对称与反对称

    H-对称与反对称 题目描述 给出一个N*N的方阵A.构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵. 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩 ...

  3. numeric 转换为数据类型 (null) 时出现算术溢出错误

    mssql数据同步到mysql时提示错误如下: 消息 8115,级别 16,状态 14,第 1 行 将 numeric 转换为数据类型 (null) 时出现算术溢出错误 问题分析如下: 1.数据字段类 ...

  4. Request.Form to JSON

    原文发布时间为:2012-03-21 -- 来源于本人的百度文章 [由搬家工具导入] NameValueCollection nvc =newNameValueCollection(Request.F ...

  5. dva脚手架 dva-cli 配置roadhogrc,antd-mobile样式按需加载 不生效的问题

    1.新安装dva-cli脚手架版本0.9.2,dva版本是2.4.1,roadhogrc版本是2.4.9 roadhogrc2 与1 的区别把roadhogrc 改成了webpackrc 所以配置an ...

  6. 修复无法启动的mariadb

    一直在用的数据库,今天无论如何启动不了了,最后在archlinux wiki上查到了解决方法: mysql_install_db --user=mysql --basedir=/usr --datad ...

  7. 使用中科大源下载android源码

    我的系统时manjaro linux 最新版的,安装过了git和curl软件 一.如果没有安装的同学,请使用命令: pacman -S git curl 我这里安装了python3和python2,但 ...

  8. 键盘事件keydown、keypress、keyup

    事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发k ...

  9. python - break和continue

    break 终止整个循环:当循环或判断执行到break语句时,即使判断条件为True或者序列尚未完全被历遍,都会跳出循环或判断 for i in xrange(10): print(i) if i = ...

  10. JS和jquery加载的区别

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...