vc串口通信
VC串口通讯
VC串口通讯在VC++中有两种方法可以进行串口通讯。
一种是利用Microsoft公司提供的ActiveX控件Microsoft Communications Control。
另一种是直接用VC++访问串口。
下面将简述这两种方法。
一、Microsoft Communications ControlMicrosoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。
在使用它之前,应将控件加在应用程序的对话框上。
然后再用ClassWizard 生成相应的对象。
现在我们可以使用它了。
该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。
我推荐用程序设置,这样更灵活。
SetCommPort:指定使用的串口。
GetCommPort:得到当前使用的串口。
SetSettings:指定串口的参数。
一般设为默认参数"9600,N,8,1"。
这样方便与其他串口进行通讯。
GetSettings:取得串口参数。
SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。
GetPortOpen:取得串口状态。
GetInBufferCount:输入缓冲区中接受到的字符数。
SetInPutLen:一次读取输入缓冲区的字符数。
设置为0时,程序将读取缓冲区的全部字符。
GetInPut:读取输入缓冲区。
GetOutBufferCount:输出缓冲区中待发送的字符数。
SetOutPut:写入输出缓冲区。
一般而言,使用上述函数和属性就可以进行串口通讯了。
以下是一个范例。
#define MESSAGELENGTH 100class CMyDialog : public CDialog{protected:VARIANT InBuffer; //(输入缓冲区)VARIANT OutBuffer;//(输出缓冲区)CMSComm m_Com;public:......}BOOL CMyDiaLog::OnInitDialog()CDialog::OnInitDialog(); //(onlnitDialog()是属于Cdialog)m_Com.SetCommPort(1);if (!m_Com.GetPortOpen()) { //(取得串口状态)m_Com.SetSettings("57600,N,8,1"); //(指定串口的参数)m_Com.SetPortOpen(true); //(打开或关闭串口)m_Com.SetInBufferCount(0); //(输入缓冲区中接受到的字符数)SetTimer(1,10,NULL);InBuffer.bstrVal=new unsigned short[MESSAGELENGTH];OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH];OutBuffer.vt=VT_BSTR;}return true;}void CMyDiaLog::OnTimer(UINT nIDEvent){if (m_Com.GetInBufferCount()>=MESSAGELENGTH) {InBuffer=m_Com.GetInput();// handle the InBuffer.// Fill the OutBuffer.m_Com.SetOutput(OutBuffer);}CDialog::OnTimer(nIDEvent);}用该控件传输的数据是UNICODE格式。
如何实现VC应用程序与PLC的数据交换
如何实现VC应用程序与PLC的数据交换当今,随着工业自动化的广泛应用,越来越多的工业企业开始采用可编程逻辑控制器(PLC)来控制和管理生产过程。
而随着信息技术的不断发展,将计算机技术与工业控制相结合,实现VC应用程序与PLC的数据交换,已经成为很多企业提高生产效率、提升产品质量的一种重要手段。
本文将从硬件和软件两个角度来介绍如何实现VC应用程序与PLC的数据交换。
硬件层面:在实现VC应用程序与PLC的数据交换之前,首先需要确保计算机和PLC之间能够进行可靠的通信。
一般而言,可以通过以下几种方式来实现计算机和PLC之间的连接和通信。
1.串口通信:串口通信是最常见的一种方式,通过串口线将计算机的串口与PLC的COM口相连接。
在VC应用程序中,通过编程方式来读写串口数据,从而实现与PLC的数据交互。
2.以太网通信:在以太网通信方式下,计算机和PLC通过以太网进行连接。
可以使用TCP/IP协议来实现数据的传输。
在VC应用程序中,可以使用套接字编程来实现与PLC的通信。
B通信:有些PLC具备USB接口,可以通过USB线将计算机和PLC进行连接。
在VC应用程序中,可以通过USB编程来与PLC进行数据交互。
软件层面:在硬件连接完成之后,下一步就是通过软件来实现VC应用程序与PLC的数据交换。
以下是一些常用的软件开发工具和编程语言,可以帮助我们实现这个目标。
1.Visual Studio:Visual Studio是一个功能强大的集成开发环境,可以用于开发各种类型的应用程序,包括VC应用程序。
在VC应用程序中,可以通过编写相应的代码来与PLC进行数据交换。
2.C#编程语言:C#是一种简单、现代化的编程语言,广泛应用于Windows平台的应用程序开发。
在VC应用程序中,可以使用C#编写代码来实现与PLC的数据交互。
3.编程库:PLC通常配备有相关的编程库,包括DLL、API等,可以用于编写与PLC通信的代码。
在VC应用程序中,可以引用这些编程库,从而实现与PLC的数据交换。
VC实现串口通信项目源码
VC实现串口通信项目源码以下是一个简单的VC实现串口通信项目的源码:```cpp#include <windows.h>#include <iostream>using namespace std;//定义串口类class SerialPortpublic:SerialPort(const char* portName)//打开串口hSerial = CreateFile(portName, GENERIC_READ , GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//检查串口是否成功打开if (hSerial == INVALID_HANDLE_VALUE)if (GetLastError( == ERROR_FILE_NOT_FOUND)cerr << "Error: " << portName << " 不存在" << endl;} elsecerr << "Error: 打开串口失败" << endl;}}//配置串口DCB dcbSerialParams = {0};dcbSerialParams.DCBlength = sizeof(dcbSerialParams);cerr << "Error: 获取串口配置信息失败" << endl;}dcbSerialParams.BaudRate = CBR_9600; // 设置波特率为9600dcbSerialParams.ByteSize = 8; // 设置数据位为8位dcbSerialParams.StopBits = ONESTOPBIT; // 设置停止位为1个dcbSerialParams.Parity = NOPARITY; // 设置奇偶校验方式为无校验cerr << "Error: 设置串口配置信息失败" << endl;}//配置读写操作的超时时间cerr << "Error: 设置串口超时时间失败" << endl;}}//读取串口数据int readData(char* buffer, int bufferSize)DWORD bytesRead;if (!ReadFile(hSerial, buffer, bufferSize, &bytesRead, NULL)) cerr << "Error: 读取串口数据失败" << endl;return -1;}return bytesRead;}//发送串口数据bool writeData(const char* buffer, int bufferSize)DWORD bytesWritten;if (!WriteFile(hSerial, buffer, bufferSize, &bytesWritten, NULL))cerr << "Error: 发送串口数据失败" << endl;return false;}return true;}//关闭串口void closePorCloseHandle(hSerial);}private:HANDLE hSerial;};int mai// 创建SerialPort对象,指定串口名称(根据实际情况修改)SerialPort serialPort("COM1");//读取串口数据char buffer[256];int bytesRead = serialPort.readData(buffer, sizeof(buffer)); if (bytesRead == -1)cerr << "Error: 读取串口数据失败" << endl;} elsecout << "读取到的数据: " << buffer << endl;}//发送串口数据const char* data = "Hello, Serial Port!";if (!serialPort.writeData(data, strlen(data)))cerr << "Error: 发送串口数据失败" << endl;} elsecout << "成功发送串口数据" << endl;}//关闭串口serialPort.closePort(;return 0;```上述代码实现了一个简单的串口通信项目,包括串口初始化、读取串口数据、发送串口数据和关闭串口的功能。
VC串口通信的3种常见方法_UE空间
VC串口通信的3种常见方法_UE空间.txt52每个人都一条抛物线,天赋决定其开口,而最高点则需后天的努力。
没有秋日落叶的飘零,何来新春绿芽的饿明丽?只有懂得失去,才会重新拥有。
VC串口通信的3种常见方法_UE_百度空间百度空间 | 百度首页 | 登录 UE 主页博客相册|个人档案 |好友查看文章VC串口通信的3种常见方法2009-12-03 16:23---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。
----在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
依据不同的条件实现对串口的灵活编程控制是我们所需要的。
----在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。
串行通信程序开发环境为VC++ 6.0。
---- Windows下串行通信----与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。
串行口在Win32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。
与通信设备相关的结构有COMMCONFIG,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的WindowsAPI函数共有26个,详细说明可参考MSDN帮助文件。
以下将结合实例,给出实现串行通信的三种方法。
vc++mfc串口通信
Vc++串口通信(加密解密以及反馈协议)一.主要功能:实现两台计算机通过串口进行数据通信。
二.软件特色:与本软件传输协议不同的串口信息接收到之后不做显示,发送过程中经过数据包加首部尾部来确定数据是否为同一个协议,之后再经过加密发送,接受时先解密,然后经过除去首部跟尾部来得到本来的数据。
三.加密原理:发送时先加首部跟尾部,然后再将所有字符串转换成字符数组,进而对数组中的每个字符进行处理,具体方法是首先获得本次发送的数据总长度,单个字符减去本次字符串总长度的数字,再将数组转换成字符串发送出去,解码时先将受到的字符串转换成字符数组,再将每个字符加上本次接收到的字符串总长度,然后除去首部跟尾部,得到实际有用的数据。
四.协议原理:在每次收到数据之后进行判断,是否为预先设定的反馈数据,如果是,则不做处理,如果不是,则进行发送反馈数据操作。
每次发送完数据对话框有提示“数据已发送“,当收到反馈数据时,提示”数据已成功接收“。
五.主要问题:单次发送的数据不能大于33个字符,否则会接收不正常。
波特率已加到程序里面固定为“115200“,如果太小了可能会出现接收不到信息或者接收速度慢等情况。
六.界面图示:1.发送完数据,但是对方未收到。
2.发送完数据,对方已经成功接收。
七.部分代码界面设计类向导中的函数设计“serilDlg.cpp”文件内部代码#include "stdafx.h"#include "seril.h"#include "serilDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifint comseril;///////////////////////////////////////////////////////////////////////////// // 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()/////////////////////////////////////////////////////////////////////////////// CSerilDlg dialogCSerilDlg::CSerilDlg(CWnd* pParent /*=NULL*/): CDialog(CSerilDlg::IDD, pParent){//{{AFX_DATA_INIT(CSerilDlg)m_strRXData = _T("");m_strTXData = _T("");m_TestFlag = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CSerilDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSerilDlg)DDX_Control(pDX, IDC_OPENSERIL, m_Opensril);DDX_Control(pDX, IDC_COM, m_serilcom);DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData);DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData);DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);DDX_Text(pDX, IDC_TESTFLAG, m_TestFlag);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSerilDlg, CDialog)//{{AFX_MSG_MAP(CSerilDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_CLEAR, OnClear)ON_BN_CLICKED(IDC_CLEARSEND, OnClearsend)ON_CBN_CLOSEUP(IDC_COM, OnCloseupCom)ON_BN_CLICKED(IDC_FASONG, OnFasong)ON_BN_CLICKED(IDC_OPENSERIL, OnOpenseril)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSerilDlg message handlersBOOL CSerilDlg::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 herereturn TRUE; // return TRUE unless you set the focus to a control}void CSerilDlg::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 CSerilDlg::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 CSerilDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}BEGIN_EVENTSINK_MAP(CSerilDlg, CDialog)//{{AFX_EVENTSINK_MAP(CSerilDlg)ON_EVENT(CSerilDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)//}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CSerilDlg::OnComm(){// TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[20480],rxtemp[20480]={0},top[20480],down[20480],jm[20480],jm1[20480]; //设置BYTE数组An 8-bit integerthat is not signed.CString strtemp,test,test1;if (m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符{ // CString rw="rw";////////以下你可以根据自己的通信协议加入处理代码variant_inp = m_ctrlComm.GetInput(); //读缓冲区safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量len = safearray_inp.GetOneDimSize(); //得到有效数据长度for(k = 0;k < len;k++){safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组}if(rxdata[0] == 'r'&&rxdata[1] == 'e'&&rxdata[2] == 'c'&&rxdata[3] == 'i'&&rxdata[4] == 'v'&&rxdata[5] == 'e'){m_TestFlag = "已被成功接收";}else{m_ctrlComm.SetOutput(COleVariant("recive"));}for (k=0;k<5;k++){top[k]=rxdata[k];}for(k=0;k<4;k++){down[k]=rxdata[len-4+k];}if(top[0] == 'b' && top[1] == 'e' && top[2] == 'g' && top[3] == 'i' && top[4] == 'n' && down[0] == 'o' && down[1] == 'v' && down[2] == 'e' && down[3] == 'r'){for(k=0;k<len-9;k++){rxtemp[k] = rxdata[k+5];}for(k=0;k<len-9;k++){jm1[k] = (rxtemp[k] -len+9);}for(k = 0;k < len-9;k++) //将数组转换为Cstring型变量{BYTE bt = *(char*)(jm1+k); //字符型strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放m_strRXData += strtemp;}}}UpdateData(FALSE); //更新编辑框内容(主要是接收编辑框中的)}void CSerilDlg::OnFasong(){long siz,k;CString SendAll,sendal;UpdateData(TRUE); //读取编辑框内容siz = strlen( m_strTXData) ;char cha[20480] ;char cha1[20480];char cha2[20480];strcpy(cha, m_strTXData);for (k=0;k<siz;k++){cha1[k] = cha[k] +siz ;}CString str(cha1,siz);SendAll = "begin" + str + "over";m_ctrlComm.SetOutput(COleVariant(SendAll)); //发送数据m_TestFlag = "数据已发送";UpdateData(FALSE); //读取编辑框内容}void CSerilDlg::OnOpenseril(){// TODO: Add your control notification handler code herem_ctrlComm.SetCommPort(comseril); //选择com口if ( m_ctrlComm.GetPortOpen() ){m_ctrlComm.SetPortOpen(FALSE);// 关闭串口// AfxMessageBox("cannot open serial port");AfxMessageBox("串口已关闭");}else{m_ctrlComm.SetPortOpen(TRUE);//打开串口AfxMessageBox("串口打开成功");SetDlgItemText(IDC_OPENSERIL,"关闭串口"); //显示串口已经关闭m_ctrlComm.SetSettings("115200,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据// m_TestFlag = "未测试";UpdateData(FALSE);}}void CSerilDlg::OnCloseupCom(){comseril = m_serilcom.GetCurSel();}void CSerilDlg::OnClear(){m_strRXData = "";UpdateData(FALSE); //更新编辑框内容// TODO: Add your control notification handler code here}void CSerilDlg::OnClearsend(){// TODO: Add your control notification handler code herem_strTXData = "";UpdateData(FALSE);}、Seril.h内代码// serilDlg.h : header file////{{AFX_INCLUDES()#include "mscomm.h"//}}AFX_INCLUDES#if !defined(AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_) #define AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// CSerilDlg dialogclass CSerilDlg : public CDialog{// Constructionpublic:CSerilDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CSerilDlg)enum { IDD = IDD_SERIL_DIALOG };CButton m_Opensril;CComboBox m_serilcom;CString m_strRXData;CString m_strTXData;CMSComm m_ctrlComm;CString m_TestFlag;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSerilDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CSerilDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnClear();afx_msg void OnClearsend();afx_msg void OnCloseupCom();afx_msg void OnFasong();afx_msg void OnComm();afx_msg void OnOpenseril();DECLARE_EVENTSINK_MAP()//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_)日期:2013-4-10。
VC串口通信新解
VC串口通信新解VC串口通信是一古老的话题,本文主要着重于PC与单片机的串口通信。
随着硬件技术的发展,尤其是单片机的通信能力越来越强,过往很多年非常经典的、工作得很好的串口程序,在结合硬件特点后,能效率更高。
同样是UART口,PC与早期的单片机是不对等的,PC端UART controller + DMA ,只用开个读写缓冲,收发基本是全自动的,有完善的流控机制。
单片机早期的大多是UART控制器,无硬件流控(可用GPIO 仿),UART也不支持DMA。
软件上常用查询、中断(效率高一些),没有DMA,还是要软件来搬运数据。
近年来,单片机的UART通信能力不断增强,基本与PC的UART对等,比如TI 的MSP430、CC2530等,片上支持UART+DMA,支持硬件流控,功能强大。
有意思的是,有些笔记本上省去了UART口。
但UART口对于上下位机应用,尤其在工控行业有广泛的应用。
早期的C语言,可直接操作端口,能象单片机那样来操作UART 口,软件上降格与单片机对等,程序工作很稳定。
VC编写的串口程序,网上有很多,比如串口助手,很经典、适应性很强,不怎么挑下位单片机,不管单片机支持DMA+UART与否,都可稳定工作。
单片机支持UART +DMA 最大的意义就是在发送一串字节时,字节间的interval是可控的,这样就非常有利于interval_timeout的实施。
只要字节间隔小于interval_timeout, 就认为是同属于一个数据幀。
这样就便于通信协议的实施。
当然采用定时中断也能实现,如果只是偶尔配置一下下位单片机参数,数据量不大,没问题。
若用于下位机周期性的上报数椐,定时中断就太频繁,再加上下位机若同时是一网关,就影响吞吐量。
说到这里,着重提一下PC与单片机通信的数据幀的实现:数据格式有二进制和ASCII码两种,如果是ASCII码格是式,要简单许多,很容易定义一个专用的数据幀开始标志,相应地对字节间的interval要求比较宽松。
Vc++串口通信
TMOD:工作在方式2
PCON:只有工作在方式1、2、3时,如果PCON的SMOD为高电平,则通信整度加倍。
SMOD — — —
计算定时器初值:定时器初值是由波特率=2SMOD×fosc/[32×12(256-X)]计算得到。
---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性:
---- CommPort 设置并返回通讯端口号,缺省为COM1。
---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
中断设置:
SETB ES ;开串行中断
SETB EA ;中断启动
串行中断优先级由中断优先控制寄存器IP中的PS决定。
二、VC编程实现串口通信软件
好,串口通信的基本概念和通信规则我们已经大概的有一个了解了,相信大家都已经熟记在心了。下面,我们开始编写上位机了。先让我们来了解一下串口通信上位机编写的方法有哪些以及要用到哪些技术,其实到现在为止我自己也是一窍不通,也没有具体的书参考,先我们还是这样画葫芦画下去吧,本人对VC的研究也不是很透彻,还得去学好C++,不过一步一步慢慢来吧,告诉自己坚持到底,要坚持到底!
RB8:接收数据位。方式0不使用这位。方式1下,如果SM2=0,RB8的内容是接收到的停止位。在方式2或方式3下,存放接收到的第9位数据。
TI:发送中断标志位。在方式0下,发送完第8位数据时,TI=1。在其它方式下,开始发送停止位时,TI=1。在任何工作方式下TI必须由软件清0。
RI:接收中断标志位。在方式0下,接收完第8位数据时,RI=1。在其它方式下,接收到停止位时,RI=1。在任何工作方式下RI也必须由软件清0。
VC_串口通信
目录打开串口 (2)关闭串口 (3)串口配置与串口属性 (4)串口配置 (4)串口属性 (6)缓冲区控制 (7)读写串口 (8)读串口操作 (8)写串口操作 (9)异步I/O操作 (10)超时设置 (11)通信状态和通信错误 (13)打开串口代码示例: (14)串口的读写代码示例: (15)在“创意天地中级”开发过程中,关于串口通信的开发采用的是Windows串口通信相关API函数。
在32位windows系统中,串口和其他通信设备都是作为文件处理的。
串口的打开、关闭、读取和写入所有的函数与操作文件的函数完全一致。
打开串口通信会话以调用CreateFile()开始。
CreateFile()为读访问、写访问或读写访问“打开”串口。
按照windows的通常做法,CreateFile()返回一个句柄,随后在打开端口的操作中使用。
CreateFile()函数非常复杂,复杂性的原因之一是他是通用的。
可以使用CreateFile打开已经存在的文件,创建新文件和打开根本就不是文件的设备,例如串口、并口、和调制解调器。
CreateFile()函数声明如下:HANDLE CreateFile(LPCTSTR lpszName, //lpszName:指定要打开的串口逻辑名,用字符串表示,例如”COM1”,表示串口1DWORD fdwAccess, //fdwAccess:用来指定串口访问的类型。
与文件一样,串口也是可以被打开一并读取写入或者两者兼有。
GENERIC_READ为读取访问,GENERIC_WRITE为写访问const GENERIC_READ = 0x80000000h;const GENERIC_WRITE = 0x40000000h;因为大部分串口通信都是双向的,所以在设置中通常将两个标识连接起来使用,即fdwAccess = GENERIC_READ|GENERIC_WRITE DWORD fdwShareMode, //fdwShareMode:指定该端口的共享属性。
vc串口通讯控件MSComm编程详解
vc串口通讯控件MSComm编程详解在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和皿信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU 发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
在该控件的对象库中也可以找到这些常量。
常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。
利用VC中的通讯控件开发串形通信程序
利用VC中的通讯控件开发串形通信程序随着信息技术的不断发展和更新,人们对通信技术的要求也越来越高。
在通信领域中,串行通信技术已经成为了一种非常重要的通信技术。
串行通信方式就是将一串字符传输到另一台计算机上,这种通信方式在嵌入式系统、工业自动化、智能控制等领域得到了广泛应用。
针对这种需求,VC中提供了通讯控件,开发人员可以利用通讯控件来实现串行通信程序的开发。
VC中的通讯控件可以为应用程序提供方便的串行通信功能,它包括文本框、串口组合框、串口设置、读写按钮等,提供了多种通信方式和参数配置。
通讯控件支持多线程,可以同时进行多个设备的通信。
通讯控件使用方便,开发人员只需要添加相应的控件到界面并进行相应的配置即可实现串行通信。
串口通信是串行通信中最常使用的通信方式之一。
它通过串口将数据传输到计算机上,串口通信一般包括了以下四个参数:波特率、数据位、停止位和奇偶校验位。
开发人员在开发串口通信程序时需要根据通讯控件提供的相关参数进行配置。
针对串口通信,我们可以通过VC中的通讯控件进行实现。
以下是开发串口通信程序的具体步骤:首先,我们需要在VC中新建MFC应用程序,进入对话框编辑器进行界面的设计。
在界面中添加文本框、串口组合框、串口设置和读写按钮等控件。
在串口数据库中可以选择相应设备的名称和相关参数进行配置。
其次,我们需要在代码中添加串口通信的实现。
在实现中,我们可以通过串口对象打开、关闭串口,读取、写入数据等操作。
在实现串口通信时,我们需要使用如下代码:CSerialPort m_SerialPort; //实例化串口对象m_SerialPort.Open(...); //打开串口...... //具体的读写操作等m_SerialPort.Close(); //关闭串口在实现串口通信时,我们需要对错误进行判断和处理,例如在读取数据时如果没有接收到数据,需要进行超时处理。
最后,我们需要对程序进行调试和测试,通过测试验证程序是否能够稳定运行。
基于VC的串口通信的实现
四 ! 结束语 本设计使用 a’cc 提供的串行通信控件 [:’699 实 现 了 串 行通信 # 通过对串口的连接就能实现计算机与计算机之间的联 系 # 使用方便 # 灵活 ! 对串口通信程序 ’699=0><7; 进行测试时 # 将一台计算机的串口连接在一起 # 首先分别启动两个串口通信 程序 ’699=0><7; ! 然后对这两个串口通信程序 ’699=0><7; 进 行设置 # 一个作为发送方 # 端口设置为端口 $ # 例 如 # 发 送 字 符 串 设置为 $!ij# ( 一个作为接收方 # 端口设置为端口 ! ! 其他均设置 为 默 认 情 况 #单 击 %确 定 &按 钮 后 回 到 主 菜 单 #在 发 送 方 按 %自 动 发 送 &按 钮 或 %手 动பைடு நூலகம்发 送 &按 钮 后 #接 收 方 按 %开 始 接 收 &按 钮 后 # 接收方就可以在自己的接收回显编辑框中看见已接收的数据 !
一 # 前言 在 &’()*+, 应用程序的开发中 ! 常常需要面临与外围数据 源设备通信的问题 " 通过串行通信口 ! 可以设计相应的串口通信 程序 ! 完成计算机与计算机之间的数据通信任务 " 串行端口的本 质功能是作为 -./ 和串行设备间的编码转换器 " 当数据从 -./ 经过串行端口发送出去时 ! 字节数据转换为串行的位 " 在接收数 据时 ! 串行的位被转换为字节数据 " 在实验室和工业应用中 ! 串 口是常用的计算机与外部串行设备之间的数据传输通道 ! 由于 串行通信方便易行 ! 所以应用广泛 " 依据不同的条件实现对串口 的灵活编程控制是我们所需要的 " 串行口在 &’( 0! 中是作为文 件 来 进 行 处 理 的 !而 不 是 直 接 对 端 口 进 行 操 作 !对 于 串 行 通 信 ! &’( 0! 提供了相应的文件 123 函数与通信函数 ! 通过了解这些 函数的使用 ! 可以编制出符合不同需要的通信程序 " 实现串行通 信 的 方 法 有 三 种 " 方 法 一 # 使 用 4-55 提 供 的 串 行 通 信 控 件 67-*88 $ 方 法 二 # 在 单 线 程 中 实 现 自 定 义 的 串 口 通 信 类 $ 方 法 三 多线程下实现串行通信 " 本设计中采用第一种方法来实现对 串行通信的编程 ! 即使用 4-55 提供的串行通信控件 67-*88 ! 通过对串口的连接就能实现计算机与计算机之间的联系 ! 使用 方便 ! 灵活 " 二 ##$%&’’ 控件串口编程基本流程 4-559:% 提供的 67-*88 控件通过串行端口发送和接收数 据 ! 为应用程序提供串行通信功能 " 3 & 在当前 4516789 中插入 /0+122 控件 打开 %.;*<=>?@AB)) ?* .;*<=>?CA-*8D*(=(?, E() -*(?;*F,CA G=H’,?=;=) B>?’I=J -*(?;*F, CAK 菜 单 选 择 -*8D*(=(?,L6’>;*,*M? -*88N(’>E?’*(, -*(?;*FOI=;,’*( 9:% 命 令 插 入 到 当 前 的 .;*<=>? 中 " 结 果 就 添 加 了 类 -67-*88 的 相 关 文 件 8,>*88:P 和 8,>*88:>DD 也一并加入 .;*<=>? 中 " 如果 .;*<=>? 中的视类是基于 -M*;84’=+ 的 ! 那么创建 -6! 7-*88 类是相当简单的 " 只需在 -M*;84’=+ 对应的对话框窗体 中插入 67-*88 控件 ! 再在视类的 -FE,,&’QE;) 中为该控件声明 一 个 变 量 即 可 ! 本 文 中 设 为 8R-*8 " 这 样 在 程 序 运 行 中 ! 该 67-*88 控件都将是有效的 " 在对话框中创建 67-*88 控件的 过程也是相类似的 " 如果视类不是基于 -M*;84’=+ 的 ! 那么就需 要建立一个 67-*88 控件 " 创建的方法与普通的 B>?’I=J 控件 的创建相类似 " ! & 初始化并打开串口 对串口进行初始化一般说来要完成以下几个设置 # 设定通信端口号 ! 即 -*88.*;? 属性 " 设定通信协议 ! 即 SE()7PET’(H 属性 " 设定传输速率等参数 ! 即 7=??’(H, 属性 " 设定其他参数 ! 有必要时再加上其他的属性设定 " 打开通信端口 ! 即将 .*;?3D=( 属性设为 UG/V " $ & 关闭串口 在使用完 67-*88 通信对 象 后 ! 需 要 将 通 信 端 口 关 闭 " 当 然如果窗体注销 !67-*88 控件注销同样可以完成这一功能 " 可 以下面的语句来实现这个功能 #
vc串口通信编程详解
vc串口通信编程详解
串口通信简介
串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。
一般完成这种功能的电路,我们称为串行接口电路。
串口通信结构
串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
串口是计算机上一种非常通用的设备通信协议。
大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。
可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接。
VC++串口通信详解
VC++串口通信详解串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
本文以VC++为平台进行串口通信编程串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式串行通信的操作方式1.同步方式同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回MTIMEOUTS timeOver;//COMMTIMEOUTS结构用于设置读写函数的等待时间。
2.memset(&&timeOver,0,sizeof(timeOver));3.DWORD timeMultiplier,timeConstant;4.timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;5.timeOver.ReadTotalTimeoutConstant=timeConstant;6.SetCommTimeouts(hComport,&&timeOver);7.……8.ReadFile(hComport,//串口句柄9. inBuffer,//缓冲10. nWantRead,//每次调用ReadFile时,函数试图读出的字节数11. &&nRealRead,//实际读出的字节数12. NULL);//代表ReadFile将采用同步文件读写的方式如果所规定的待读取数据的数目nWantRead较大且设定的超时时间也较长,而接收缓冲区中数据较少,则可能引起线程阻塞。
解决这一问题的方法是检查COMSTAT结构的cbInQue 成员,该成员的大小即为接收缓冲区中处于等待状态的数据的实际个数。
如果令nWantRead 的值等于COMSTAT.cbInQue,就能较好地防止线程阻塞。
VC串口通信资料汇集整理(PDF)
用MFC实现串口编程龚建伟评论:本文既写了在Windows中怎样用VC控件MSComm,又说明了API 技术编程方法,在写用MSComm控件时,数据类型的转换说得不是太明白,初次涉猎串口编程的朋友恐怕看了还是编不出来;直接从底层编写的部分值得一读,说得较为详细,但你得先从VC教本上看一看什么是线程。
一.串行通信的基本原理二.串口信号线的接法三.16位串口应用程序的简单回顾四.在MFC下的32位串口应用程序㈠使用ActiveX控件㈡使用32位的API通信函数本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用ActiveX控件或Win API.并给出用Visual C++6.0编写的相应MFC32位应用程序。
关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。
计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。
实际工作中利用串口完成通信任务的时候非常之多。
已有一些文章介绍串口编程的文章在计算机杂志上发表。
但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。
笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。
希望对各位需要编写串口通信程序的朋友有一些帮助。
一.串行通信的基本原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从CPU 经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
基于VC的串口通信的设计与实现-精品
课程论文首页基于VC++的串口通信的设计与实现中文摘要:在visual C++6.0平台下,利用MSComm控件编写串口通信程序,实现了串口通信参数设置与显示、打开和关闭串口、接收和发送数据、自动发送、十六进制发送与显示、清空接收区和发送区内容的功能。
关键词:串口 MSComm1 串口通信1.1 基本概念串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输,如图1所示。
图1 串行通信串行数据传送的特点是:数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。
与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。
但是串行通信传送速度比并行通信慢得多,并行通信时间为T,则串行时间为NT。
正是由于串行通信的接线少、成本低,因此它在数据采集和控制系统中得到了广泛的应用,产品也多种多样。
1.2 工作模式通过单线传输信息是串行数据通信的基础。
数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模式:单工、半双工和全双工。
(1)单工形式。
单工形式的数据传送是单向的。
通信双方中,一方固定为发送端,另一方则固定为接收端。
信息只能沿一个方向传送,使用一根传输线,如图2所示。
单工形式一般用在只向一个方向传送数据的场合。
例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。
还有在某些通信信道中,如单工无线发送等。
图2 单工形式(2)半双工形式。
半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。
在任何时刻只能由其中的一方发送数据,另一方接收数据。
因此半双工形式既可以使用一条数据线,也可以使用两条数据线,如图3所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工业控制领域(如DCS系统),经常涉及到串行通信问题。
为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。
在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。
VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。
应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。
以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的V ARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。
笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。
以下将结合实例,给出实现串行通信的几种方法。
1 Windows API通信函数方法
与通信有关的Windows API函数共有26个,但主要有关的有:
CreateFile() 用“comn”(n为串口号)作为文件名就可以打开串口。
ReadFile() 读串口。
WriteFile() 写串口。
CloseHandle() 关闭串口句柄。
初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。
以下给出API实现的源代码。
2 利用端口函数直接操作
这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:
int _inp(unsigned shot port)
该函数从端口读取一个字节,端口号为0~65535。
写端口的函数原型为:
int _outp(unsigned shot port, int databyte)
该函数向指定端口写入一个字节。
不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述。
3 MSComm控件
MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。
下面详细说明该类应用方法。
3.1 MSComm控件的属性
CommPort:设置串口号,类型short :1-comm1 2-comm2.
Settings:设置串口通信参数,类型CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。
PortOpen:设置或返回串口状态,类型BOOL:TURE打开,FALSE关闭。
InputMode:设置从接收缓冲区读取数据的格式,类型long:0-Text 1-Bin。
Input:从接收缓冲区读取数据,类型V ARIANT。
InBufferCount:接收缓冲区中的字节数,类型:short。
InBufferSize:接收缓冲区的大小,类型:short。
Output:向发送缓冲区写入数据,类型:V ARIANT。
OutBufferCount:发送缓冲区中的字节数,类型:short。
OutBufferSize:发送缓冲区的大小,类型:short。
InputLen:设置或返回Input读出的字节数,类型:short。
CommEvent:串口事件,类型:short。
3.2 程序示例
串口初始化
if (!m_comm.GetPortOpen())
m_comm.SetPortOpen(TURE); /*打开串口*/
m_comm.SetSettings( "4800,n,8,1 "); /*串口参数设置*/
m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/
m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/
接收数据
m_comm.SetInputLen(1); /*每次读取一个字符
V ARINAT V1=m_comm.GetInput();
/*读入字符*/
m_V1=V1.bstrval;
发送字符m_comm.SetOutput(Colevariant ( "Hello "); /*发送“Hello” */
3.3 注意
SetOutput方法可以传输文本数据或二进制数据。
用SetOutput方法传输文本数据,必须定义一个包含一个字符串的Variant。
发送二进制数据,必须传递一个包含字节数组的Variant 到Output 属性。
正常情况下,如果发送一个ANSI 字符串到应用程序,可以以文本数据的形式发送。
如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。
此处望引起读者注意,笔者曾经在此犯错。
4 VC++类CSerial
4.1 串行通信类CSerial简介
Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。
以下为该类定义的说明部分。
class CSerial
{
public:
CSerial();
~CSerial();
BOOL Open( int nPort = 2, int nBaud = 9600 );
BOOL Close( void );
int ReadData( void *, int );
int SendData( const char *, int );
int ReadDataWaiting( void );
BOOL IsOpened( void ){ return( m_bOpened ); }
protected:
BOOL WriteCommByte( unsigned char );
HANDLE m_hIDComDev;
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
BOOL m_bOpened;
}
4.2 串行通信类Cserial 成员函数简介
1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。
2. CSerial:: Open这个成员函数打开通信端口。
带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。
3. CSerial:: Close函数关闭通信端口。
类析构函数调用这个函数,所以可不用显式调用这个函数。
4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。
它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。
5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。
6. CSerial:: ReadData函数从端口接收缓冲区读入数据。
第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。