RS232串口通信实验报告学院:电子信息学院班级:08031102姓名:张泽宇康启萌余建军学号:2011301966 2011301950 2011301961时间:2014年11月13日学校:西北工业大学一.实验题目:设计一个简单的基于串口通信的信息发送和接受界面二.实验目的:1.熟悉并掌握RS232串口标准及原理。
2.实现PC机通过RS232串口进行数据的收发。
3.熟悉VC语言编写程序的环境,掌握基本的VC语言编程技巧。
三.实验内容程序代码:P// PC1PC2Dlg.cpp : implementation file//#include "stdafx.h"#include "PC1PC2.h"#include "PC1PC2Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CPC1PC2Dlg dialogCPC1PC2Dlg::CPC1PC2Dlg(CWnd* pParent /*=NULL*/): CDialog(CPC1PC2Dlg::IDD, pParent){//{{AFX_DATA_INIT(CPC1PC2Dlg)m_send = _T("");m_receive = _T("");m_bt = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CPC1PC2Dlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CPC1PC2Dlg)DDX_Control(pDX, IDC_MSCOMM1, m_Comm);DDX_Text(pDX, IDC_EDIT1, m_send);DDX_Text(pDX, IDC_EDIT2, m_receive);DDX_CBString(pDX, IDC_COMBO1, m_bt);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CPC1PC2Dlg, CDialog)//{{AFX_MSG_MAP(CPC1PC2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON_SET, OnButtonSet)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CPC1PC2Dlg message handlersBOOL CPC1PC2Dlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_Comm.SetCommPort(1); //选择COM1m_Comm.SetInputMode(1); //输入方式为二进制方式m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件// CString str;// str="9600,n,8,1";// m_Comm.SetSettings(str);m_Comm.SetPortOpen(TRUE);//打开串口return TRUE; // return TRUE unless you set the focus to a control}void CPC1PC2Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CPC1PC2Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CPC1PC2Dlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//把字符通过串口发送出去void CPC1PC2Dlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData(TRUE); //读编辑框内容if(strlen(m_send)==0)MessageBox("发送的数据不能为空!","提示",MB_OK);else{m_Comm.SetOutput(COleV ariant(m_send));Sleep(100);}}BEGIN_EVENTSINK_MAP(CPC1PC2Dlg, CDialog)//{{AFX_EVENTSINK_MAP(CPC1PC2Dlg)ON_EVENT(CPC1PC2Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CPC1PC2Dlg::OnOnCommMscomm1(){// TODO: Add your control notification handler code hereV ARIANT data;COleSafeArray data2;CByteArray datatemp;CString strtemp,buffer;LONG len,i;BYTE Inbyte[2048],temp;UpdateData(TRUE); //读编辑框内容if(m_Comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符{data=m_Comm.GetInput(); //读缓冲区data2=data; //V ARIANT型变量转换为ColeSafeArray型变量len=data2.GetOneDimSize(); ////得到有效数据长度if(len>0){for(i=0;i<len;i++)data2.GetElement(&i,Inbyte+i);//转换为BYTE型数组for(i=0;i<len;i++) //将数组转换为Cstring型变量{temp=*(char*)(Inbyte+i); //字符型strtemp.Format("%c",temp); //将字符送入临时变量strtemp存放buffer+=strtemp; //将字符串送入临时变量buffer中存放}}m_receive=m_receive+buffer+" ";}UpdateData(FALSE); //更新编辑框内容// MessageBox("gegnxin","提示",MB_OK);}void CPC1PC2Dlg::OnButtonSet(){// TODO: Add your control notification handler code hereUpdateData(TRUE);CString str;str.Format("%s,n,8,1",m_bt);m_Comm.SetSettings(str);}void CPC1PC2Dlg::OnButton2(){// TODO: Add your control notification handler code hereGetDlgItem(IDC_EDIT2)->SetWindowText(_T(""));}四.实验过程:(1)将9针RS232串口通信线与PC机串口连接,并用跳线将RS232串口通信线另一端2(RXD)和3(TXD)短接。