博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
串口通信学习(发送)
阅读量:2379 次
发布时间:2019-05-10

本文共 3627 字,大约阅读时间需要 12 分钟。

今天按照书上学习了一下API串口通信,并实际编程练习一番。

1.首先在vs6.0上建立一个新的MFC应用程序工程,选择单文档,基类采用CEditView(采用这个类的原因是在视图中具有文本编辑功能,同允许进行输入和编辑文本)。由此构建主界面。

 

2.新建一个dialog,用来设置com口、波特率、以及奇偶校验等。其中的选择是采用组合框。向组合框添加文本有三种方法:

一是:在组合框的Data项中,先输入文本,按ctrl+Enter,换行继续输入

二是:在class wizard中为组合框增加成员变量如m_Com,然后用m_Com.AddString("COM1");以此类推;

三是:采用获取组合框ID,然后调用AddString()函数,(CComboBox *)GetDlgItem(IDC_COMBO1)->AddString("COM1");

 

3.在头文件中申明必要的变量,我的设置时:

 HANDLE   hCom;                        //串口句柄

 OVERLAPPED Wol;                     //写操作OVERLAPPED 结构变量
 BYTE       myWByte[300];            //存放将写数据
 long       dataWLen;                //发送数据长度
 CSetupDlg  mySetupDlg;              //声明设置对话框实例
 LPCTSTR    myCom;                   //串口名称
 BYTE       myParity;                //校验类型
 DWORD      myfParity;               //是否使用校验位
 DWORD      myBaudRate;              //波特率
 bool       blnOpened;               //串口已经打开标志

同时将设置对话框头文件和主框架窗口头文件放到视图头文件中:

#include "SetupDlg.h"

#include "MainFrm.h"

 

4.设置串口,通过对设置按钮增加相应即可,用来设置COM口、奇偶校验、波特率等

CString strStatus;

 if (mySetupDlg.DoModal()==IDOK)
 {
  switch (mySetupDlg.m_Com)
  {
  case 0 :
   {
    strStatus="COM1";
    myCom="COM1";
    break;
   }
  case 1 :
   {
    strStatus="COM2";
    myCom="COM2";
    break;
   }
  case 2 :
   {
    strStatus="COM3";
    myCom="COM3";
    break;
   }
  case 3 :
   {
    strStatus="COM4";
    myCom="COM4";
    break;
   }
//   case 4 :
//    {
//     strStatus="COM1";
//     myCom="COM1";
//     break
//    }
   break;
  }
  strStatus+=",";
  switch(mySetupDlg.m_BaudRate)
  {
  case 0 :
   {
    strStatus="19200";
    myBaudRate=CBR_19200;
    break;
   }
  case 1 :
   {
    strStatus="9600";
    myBaudRate=CBR_9600;
    break;
   }
  case 2 :
   {
    strStatus="4800";
    myBaudRate=CBR_4800;
    break;
   }

   break;

  }
    strStatus+=",";
  switch(mySetupDlg.m_Parity)
  {
  case 0 :
   {
    myfParity=false;
    myParity=NOPARITY;
    strStatus+="N";
    break;
   }
  case 1 :
   {
    myfParity=TRUE;
    myParity=ODDPARITY;
    strStatus+="O";
    break;
   }
  case 2 :
   {
    myfParity=true;
    myParity=EVENPARITY;
    strStatus+="E";
    break;
   }
  }
   strStatus+=",8,1";
  CMainFrame *m_pGetFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;   //获取程序框架指针
  strStatus="TTY 发送程序-"+strStatus;                             //设置程序框架标题文本
  m_pGetFrame->SetWindowText(strStatus);
 }

 

5.打开串口,用来设置当前串口参数,一般采用CreateFile()函数来打开串口,用GetCommState()函数获取当前串口配置,之后用

DCB结构来设置具体com口、波特率、奇偶校验等参数,设置完后用SetCommState()函数实现这些配置

 CString  strDis;

 hCom=CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (hCom!=INVALID_HANDLE_VALUE)
 {
  SetupComm(hCom,1024,512);
  DCB myDCB;
  GetCommState(hCom,&myDCB);
  myDCB.BaudRate=myBaudRate;
  myDCB.fBinary=TRUE;
  myDCB.fParity=myfParity;
  myDCB.ByteSize=8;
  myDCB.Parity=myParity;
  myDCB.StopBits=ONESTOPBIT;
  SetCommState(hCom,&myDCB);
  AfxMessageBox("串口打开成功!");
  blnOpened=TRUE;
 }
 else
 {
  AfxMessageBox("串口打开失败!");
  blnOpened=FALSE;
 }
}

 

6.关闭串口,调用CloseHandle()函数实现。

if ((blnOpened)&&(hCom!=NULL))

 {
  CloseHandle(hCom);
  AfxMessageBox("串口已经关闭!");
  blnOpened=false;
 }
 else
 {
  AfxMessageBox("串口未打开!");
 }

 

7.发送字符,用OnChar()函数来实现。

myWByte[0]=nChar;

 dataWLen=1;
 Wol.Internal=0;
 Wol.InternalHigh=0;
 Wol.Offset=0;
 Wol.OffsetHigh=0;
 Wol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
 WriteFile(hCom,&myWByte,dataWLen,NULL,&Wol);
//  Beep(1000,10);
 CEditView::OnChar(nChar,nRepCnt,nFlags);
 
 CEditView::OnChar(nChar, nRepCnt, nFlags);

 

8.更新菜单命令

void CTTYView::OnUpdateSetupcom(CCmdUI* pCmdUI)

{
 // TODO: Add your command update UI handler code here
 if (!blnOpened)
 {
  pCmdUI->Enable(true);
 }
 else
 {
  pCmdUI->Enable(false);
 }
 
}

void CTTYView::OnUpdateOpencom(CCmdUI* pCmdUI)

{
 // TODO: Add your command update UI handler code here
 if (!blnOpened)
 {
  pCmdUI->Enable(true);
 }
 else
 {
  pCmdUI->Enable(false);
 }
}

void CTTYView::OnUpdateClosecom(CCmdUI* pCmdUI)

{
 // TODO: Add your command update UI handler code here
 if (blnOpened)
 {
  pCmdUI->Enable(true);
 }
 else
 {
  pCmdUI->Enable(false);
 }
}

void CTTYView::OnUpdateAppExit(CCmdUI* pCmdUI)

{
 // TODO: Add your command update UI handler code here
 if (blnOpened)
 {
  pCmdUI->Enable(true);
 }
 else
 {
  pCmdUI->Enable(false);
 }
}

转载地址:http://iqlxb.baihongyu.com/

你可能感兴趣的文章
directfb显示中文
查看>>
关于SIGPIPE导致的程序退出
查看>>
setsockopt()函数用法
查看>>
TCP之send函数研究
查看>>
Linux下访问内存物理地址
查看>>
mmap测试程序
查看>>
linux 启动详解
查看>>
在linux内核中操作文件的方法
查看>>
Linux下Socket编程
查看>>
Linux内核和用户空间通信的方式— proc文件和mmap共享内存
查看>>
基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
查看>>
CCS开发环境搭建小结
查看>>
DM642 gel文件和.cmd文件参考
查看>>
DSP软件优化小实验
查看>>
DSP/BIOS 介绍
查看>>
多线程编程之重点--使用DSP/BIOS时选择线程类型的参考方法
查看>>
DSP/BIOS在嵌入式数据采集系统中的应用
查看>>
基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
查看>>
迅雷C++试题及解答
查看>>
Linux 中断学习之小试牛刀篇
查看>>