VC编程实现串口通信软件

合集下载

基于VC6.0MFC的简单串口通信软件编程

基于VC6.0MFC的简单串口通信软件编程

基于VC6.0MFC的简单串⼝通信软件编程(⼀)基于对话框编程基本步骤:1.新建基于对话框的⼯程;2.拖曳所需的基本控件,构成界⾯;3.使⽤类向导(CLASS WIZARD)创建与基本控件对应的成员变量、成员函数,确定与函数相应的消息或事件——即触礁发该函数执⾏的条件(如单击等)。

(⼆)使⽤mscomm控件:1.基本设置:m_com.SetCommPort(1); //选择COM1m_com.SetInBufferSize(1024); //设置输⼊缓冲区的⼤⼩,Bytesm_com.SetOutBufferSize(256); //设置输出缓冲区的⼤⼩,Bytesif(!m_com.GetPortOpen()) //打开串⼝m_com.SetPortOpen(TRUE);m_com.SetInputMode(1); //设置输⼊⽅式为⼆进制⽅式m_com.SetSettings("4800,s,8,1");m_com.SetRThreshold(1); //为1表⽰有⼀个字符引发⼀个事件 m_com.SetInputLen(0);2.似乎每次设置m_com.SetSettings("4800,s,8,1"),必须先关再开串⼝才有效。

设置的校验位似乎只对发送数据有效,对接收数据⽆效。

3.虽然m_com.SetRThreshold(1)设置接收到⼀个字符就引发⼀个事件(触发执⾏函数),但执⾏函数读取到的数据可能不⽌1Byte,如另⼀串⼝连续发送多个字节,当串接收到第⼀个字节后就触发函数,但在函数去输⼊缓冲区读取数据时可以读到8Byte。

(三)MFC的⼀些基本使⽤:1.Unsigned char 与char不同,在执⾏加减时,char型当作带符号数(可能为负)。

2.当控件对应的变量是控件类时,可能通过该类的成员函数来获取数据或执⾏操作:如m_com是mscomm控件的变量,可以执⾏m_com.SetPortOpen(FALSE)来关闭串⼝。

用VC开发串口通信dll控件

用VC开发串口通信dll控件

在标准的.BAS 模块中,还需定义该 DLL 函数的调用方式,具体如下: Option Explicit Public Declare Function ComOpen Lib "Comdll.dll" (ByVal port As Long) As Long Public Declare Function ComClose Lib "Comdll.dll" () As Long Public Declare Function SendDataToCom Lib "Comdll.dll" (ByRef Cmd As Byte, ByVal CmdLen As Long) As Long Public Declare Function SetCallBack Lib "Comdll.dll" (ByVal port As Long, ByVal func As Long) As Long Public Declare Function GetComData Lib "Comdll.dll" (ByRef buf As Byte) As Long
四、动态链接库函数的 VB 调用示范 1 、VB 测试程序 以下程序示范了在 VB 中如何调用由 VC++编写的动态链接库中的函数。因为动态链接库中使用了回调函数,在 VB 代码中必须将回 调函数放到标准的.BAS 模块中,不可放在窗体模块中,也不能将其附加到类模块中。CALLBACK 函数只是触发同一工程中一个窗体上的 定时器控件,对串口数据进行采集,其定义如下: Sub CallBackFunc(ByVal port As Long) Form1.Timer1.Interval = 1 Form1.Timer1.Enabled = True End Sub

vc 使用mscomm控件实现串口通讯

vc 使用mscomm控件实现串口通讯

vc 使用mscomm控件实现串口通讯2009-07-07 08:34mscomm控件是微软发布的串口通讯控件,可以被多种开发工具使用,本章简单介绍vc环境下该控件的使用情况.1、控件的装载。

新建一个mfc工程,选择project-add to project-components and controls打开components and controls gallery对话框,双击 registered actives controls ,做出如下图的选择:点插入按钮后,就可把把该控件安装到controls面板上,同时创建串口类,我们从controls面板上把该控件添加到应用程序对话框就可以使用该控件设计通讯程序了。

2、初始化并打开串口。

m_ctrlComm.SetCommPort(1); //选择串口1if(!m_ctrlComm.GetPortOpen())//如果串口没有打开,则打开串口m_ctrlComm.SetPortOpen(TRUE);m_ctrlComm.SetSettings("38400,n,8,1");//波特率38400,无校验,8个数据位,1个停止位m_ctrlComm.SetInputMode(1);//以二进制方法检取数据m_ctrlComm.SetRThreshold(1);//参数为1表示当串口接收缓冲区有多于或等于1个字符时,将出发一个//接收数据的OnComm事件m_ctrlComm.SetInputLen(0);//设置当前接收缓冲区的数据长度为0m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据3、串口关闭。

m_ctrlComm.SetPortOpen(FALSE);4、数据发送strSendFrame = "10 40 01 41 16 ";CStringToCByteArray(strSendFrame,cbaSendBuf);//转换为字节流cbaLastSendFrameBuf.Copy(cbaSendBuf);ucLastSendCtlCode = cbaSendBuf[1];pView->m_ctrlComm.SetOutput((COleVariant)cbaSendBuf);//串口发送5、数据接收响应mscomm控件的oncomm事件处理接收到的数据。

VC编程实现串口通信软件

VC编程实现串口通信软件

一、VC编程实现串口通信软件首先,我们来大概的回忆一下单片机的串口通信。

8051单片机的串行接口由数据缓冲寄存器SBUF、移位寄存器、串行控制寄存器SCON组成。

8051单片机的串行接口是一个可编程的全双工通信接口,通过软件编程可以作为通用异步接收和发送器使用,也可作为同步移位寄存器,还可实现多机通信。

其帖格式有8位、10位和11位,通过T1或T2设置各种波特率。

1.1 串行口工作原理在发送和接收数据前,先对串行口进行初始化设置,要明确串行口的工作方式、波特率等。

1.发送数据发送数据,由累加器A送入发送缓冲寄存器SBUF,在发送控制器控制下组成帧结构,并自动以串行方式从TXD输出,每发送完一帧TI置位,可以通过中断方式或查询方式来了解数据的发送情况。

值得注意的是TI只能用软件复位。

2.接收数据单片机每接收完一帧数据,RI置位,通过中断或查询方式来了解数据的接收情况,然后用MOV A,S BUF指令,将接收缓冲寄存器(SBUF)的值送累加器A。

RI与TI一样,也只能用软件复位。

1.2串行口工作方式8051单片机通过编程可选择4种串行通信工作方式。

1.方式0在方式0下,串行口用作同步移位寄存器,以8位数据为1帧,先发送或接收最低位,每个机器周期发送或接收1位,其波特率为fosc/12。

串行数据由RXD端输入或输出,同步移位脉冲由TXD端送出。

方式0数据发送与接收是无起始位和停止位,先发送或接收最低位,数据格式为:—D0 D1 D2 D3 D4 D5 D6 D72.方式1在方式1下,串行口为10位通用异步接口,数据格式为:——0 D0 D1 D2 D3 D4 D5 D6 D7 1 ——发送数据:当执行MOV SBUF,A指令,CPU将1字节的数据写入发送缓冲寄存器SBUF,数据从引脚TXD端输出,当发送完1帧数据后,TI标志置1,可用中断或查询方式来了解数据发送情况,TI只有通过软件复位。

接收数据:接收时,先使REN置1,使串行口处于允许接收状态,RI标志为0,串行口采样到RXD由1到0时,确认是起始位0,就开始接收1帧数据。

VC串口通信实例 MSComm

VC串口通信实例 MSComm

VC串口通信实例 MSComm计算机与外界的信息交换称为通信。

基本的通信方式有并行通信和串行通信两种。

串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。

随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。

串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。

串行通信的距离可以从几米到几千米。

利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。

如电话、传真、视频和各种控制等。

串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。

二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。

三是利用现在网络上面提供的一些串口通讯控件进行编写。

这三种方法都没有同Windows服务联系起来。

串行接口输入输出过程描述串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。

控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。

状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。

数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。

在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。

输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。

当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。

串行通信数据的收发方式分为异步通信方式与同步通信方式。

本文档中详细描述了这次实现的应用程序中的串口通信服务的原理和工作流程,还列举出了相关的核心代码。

用简洁的语言来描述了各个模块的逻辑实现。

利用VC中的通讯控件开发串形通信程序

利用VC中的通讯控件开发串形通信程序

由于需要我们开发了前置机应用程序,实现功能就是将前置机里存放的信息取出来用计算机进行处理,该程序是利用VC在WIN98下开发而成,对串口的访问是通过VC中的通讯控件主要完成的。

通讯程序开发不仅涉及对串口的访问,还牵涉多线程编程24小时运行等问题,是编程中令人头疼的问题。

本文中只介绍利用控件对串口的访问。

为了说明控件的应用,这里特编制两台计算机通过串口进行信息交换的小程序,来介绍通讯控件的具体运用。

1.控件程序的实现启动Microsoft 5.0,利用Appwizards建立一个新的基于对话框的project,选名commtest,其中第二步选择ActiveX Control选项,证明支持控件功能,其他都选择缺省,这样就建立了一个基于对话框的应用程序。

然后将通讯控件加入应用之中,在对话框资源上点击鼠标右键,选择Insert ActiveX Control然后在控件选择对话框中选择Microsoft Communictions Control,V ersion5.0,然后选择Insert插入一个类似电话机的控件,然后点击该控件就可以修改和设置控件特性。

按Add to Project选项中Registered ActiveX Control选项然后在控件选择对话框中选择Microsoft Communictions Control,V ersion5.0,将通讯控件两个程序Mscomm.h和Mscomm.cpp加入project当中。

这样就把通讯控件加入了应用程序当中,可以应用该控件进行编程了。

2.通讯控件的各属性的含义:w10 属性设定值说明ComPort1串口号Settings9600,n,8,1串口的参数设置,依次为波特率、奇偶校验、数据位数、停止位数InBufferSize1024接收缓冲区大小InputLen0从接收缓冲区读取的字节数,0表示全部读取InputMode1接收数据的类型,0表示文本类型,1表示二进制类型OutBufferSize1024发送缓冲区大小RThreshold1设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件SThreshold0设定在触发OnComm事件前发送缓冲区内所允许的最少字符数,0表示发数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件通讯控件的属性很多,这里只是介绍其中的几种,可以根据自己的需求选择加以设置调整,对于其他属性可以查看VC帮助和联机手册。

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤
void CCommTestDlg::OnBnClickedButtonSend() {
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
void CCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
10. 添加关闭串口按钮的消息响应函数 void CCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口 1 已关闭")); } 11. 添加发送按钮消息响应函数 void CCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容 } 12. 接收数据 void CCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data[1024]={0}; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符 {

用vc的串口通信实验报告

用vc的串口通信实验报告

高级Internet编程实验报告实验题目: 串口通信班级:学号:姓名:日期: 2015-6-8一、实验要求把两台计算机的串口通过串口线连在一起, 通过串口实现两台计算机通讯。

可以利用高级语言、C语言编程实现, 要求程序界面友好, 有发送和接收功能, 其接收和发送内容可在屏幕上显示。

二、实验原理串口通讯把数据的字节分解成单个的二进制比特流依次传输, 其结构简单,连接线少, 应用非常广泛。

实现串口通信的方法很多。

如: 利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。

本文主要采用ActiveX控件Microsoft CommunicationsControl(MSComm)编程, Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。

利用已有的AxtiveX控件, 只需要编写少量的代码, 就可以轻松高效地完成任务。

以下对ActiveX控件属性进行简单介绍, 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_comm), 通过该对象便可以对串口属性进行设置, MSComm控件共有27个属性, 这里只介绍其中几个常用属性:CommPort: 设置并回通讯端口号, 缺省为COMl。

Settings: 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen:设置并返回通讯端口的状态, 也可以打开和关闭端口。

Input: 从接收缓冲区返回和删除字符。

Output: 向发送缓冲区写一个字符串。

InputLen:设置每次Input读入的字符个数, 缺省值为0, 表明读取接收缓冲区中的全部内容。

InBufferCount: 返回接收缓冲区中已接收到的字符数, 将其置0可以清除接收缓冲区。

InputMode: 定义Input属性获取数据的方式(为0: 文本方式;为1: 二进制方式)。

RThreshold和SThreshold:表示在OnComm事件发生之前, 接收缓冲区或发送缓冲区中可以接收的字符数。

用VC++写上位机软件实现单片机串口通讯

用VC++写上位机软件实现单片机串口通讯

ucSet = (unsigned char) ((FC_RTSCTS&FC_RTSCTS) ! = 0);
ucSet = (unsigned char) ((FC_RTSCTS&FC_XONXOFF) ! = 0);
if (!SetCommState(m_hIDComDev, &dcb)‖
int _inp(unsigned shot port)
该函数从端口读取一个字节,端口号为0~65535。
写端口的函数原型为:
int _outp(unsigned shot port, int databyte)
该函数向指定端口写入一个字节。
不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬
!SetupComm(m_hIDComDev,10000,10000)‖
m_OverlappedRead. hEvent ==NULL‖
m_OverlappedWrite. hEvent ==NULL)
{
DWORD dwError = GetLastError();
if (m_OverlappedRead. hEvent != NULL)
}
}
1.2 接收例程
DCB ComDcb; //设备控制块
HANDLE hCom; //global handle
hCom = CreateFile ("COM1",GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
GetCommState(m_hIDComDev, &dcb);

vc++_串口上位机编程实例 附vc串口通信(接收)

vc++_串口上位机编程实例  附vc串口通信(接收)

VC++串口上位机简单例程(源码及详细步骤)VC++编写简单串口上位机程序串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。

编译环境:VC++6.0操作系统:VMWare虚拟出来的Windows XP程序实现功能:1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。

PC的COM口编号可以通过如下方式修改:当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。

COM1口可用的话,会提示串口初始化完毕。

否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。

2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC 转换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。

(见文章末尾图)3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。

程序的编写:1、打开VC++6.0建立基于对话框的MFC应用程序Test,2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control, version 6.0->Insert,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。

VC实现串口通信项目源码

VC实现串口通信项目源码

VC实现串口通信项目源码以下是一个基于VC++实现串口通信的简单项目源码:```#include <windows.h>#include <iostream>using namespace std;//串口通信类class SerialPortprivate:HANDLE hSerial; // 串口句柄public:SerialPorhSerial = NULL;}bool openPort(const char* portName)//打开串口hSerial = CreateFileA(portName,GENERIC_READ,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hSerial == INVALID_HANDLE_VALUE)cerr << "Failed to open serial port!" << endl;return false;}//配置串口参数DCB dcbSerialParams = { 0 };dcbSerialParams.DCBlength = sizeof(dcbSerialParams);cerr << "Failed to get serial parameters!" << endl; CloseHandle(hSerial);return false;}dcbSerialParams.BaudRate = CBR_9600; // 波特率设置为9600 dcbSerialParams.ByteSize = 8; // 数据位设置为8 dcbSerialParams.StopBits = ONESTOPBIT; // 停止位设置为1 dcbSerialParams.Parity = NOPARITY; // 校验位设置为无cerr << "Failed to set serial parameters!" << endl; CloseHandle(hSerial);return false;}//设置读写超时时间CloseHandle(hSerial);return false;}return true;}bool closePor//关闭串口if (hSerial != NULL && hSerial != INVALID_HANDLE_VALUE) CloseHandle(hSerial);hSerial = NULL;return true;}return false;}bool writeData(const char* data, int dataSize)//向串口写数据DWORD bytesWritten;if (!WriteFile(hSerial, data, dataSize, &bytesWritten, NULL)) cerr << "Failed to write data!" << endl;return false;}if (bytesWritten != dataSize)cerr << "Failed to write all data!" << endl;return false;}return true;}bool readData(char* buffer, int bufferSize)//从串口读数据DWORD bytesRead;if (!ReadFile(hSerial, buffer, bufferSize, &bytesRead, NULL)) cerr << "Failed to read data!" << endl;return false;return true;}};int maiSerialPort serialPort;//打开串口if (!serialPort.openPort("COM1"))return 1;}//从用户输入获取数据char sendBuffer[256];cout << "Enter data to send: ";cin.getline(sendBuffer, sizeof(sendBuffer));//发送数据至串口if (!serialPort.writeData(sendBuffer, strlen(sendBuffer) + 1))serialPort.closePort(;return 1;//从串口接收数据char recvBuffer[256];if (!serialPort.readData(recvBuffer, sizeof(recvBuffer)))serialPort.closePort(;return 1;}//输出接收到的数据cout << "Received data: " << recvBuffer << endl;//关闭串口serialPort.closePort(;return 0;```这个项目实现了一个简单的串口通信程序,通过命令行交互,用户可以输入要发送的数据,程序将数据发送到串口,然后从串口接收并打印接收到的数据。

利用VC中的通讯控件开发串形通信程序

利用VC中的通讯控件开发串形通信程序

利用VC中的通讯控件开发串形通信程序随着信息技术的不断发展和更新,人们对通信技术的要求也越来越高。

在通信领域中,串行通信技术已经成为了一种非常重要的通信技术。

串行通信方式就是将一串字符传输到另一台计算机上,这种通信方式在嵌入式系统、工业自动化、智能控制等领域得到了广泛应用。

针对这种需求,VC中提供了通讯控件,开发人员可以利用通讯控件来实现串行通信程序的开发。

VC中的通讯控件可以为应用程序提供方便的串行通信功能,它包括文本框、串口组合框、串口设置、读写按钮等,提供了多种通信方式和参数配置。

通讯控件支持多线程,可以同时进行多个设备的通信。

通讯控件使用方便,开发人员只需要添加相应的控件到界面并进行相应的配置即可实现串行通信。

串口通信是串行通信中最常使用的通信方式之一。

它通过串口将数据传输到计算机上,串口通信一般包括了以下四个参数:波特率、数据位、停止位和奇偶校验位。

开发人员在开发串口通信程序时需要根据通讯控件提供的相关参数进行配置。

针对串口通信,我们可以通过VC中的通讯控件进行实现。

以下是开发串口通信程序的具体步骤:首先,我们需要在VC中新建MFC应用程序,进入对话框编辑器进行界面的设计。

在界面中添加文本框、串口组合框、串口设置和读写按钮等控件。

在串口数据库中可以选择相应设备的名称和相关参数进行配置。

其次,我们需要在代码中添加串口通信的实现。

在实现中,我们可以通过串口对象打开、关闭串口,读取、写入数据等操作。

在实现串口通信时,我们需要使用如下代码:CSerialPort m_SerialPort; //实例化串口对象m_SerialPort.Open(...); //打开串口...... //具体的读写操作等m_SerialPort.Close(); //关闭串口在实现串口通信时,我们需要对错误进行判断和处理,例如在读取数据时如果没有接收到数据,需要进行超时处理。

最后,我们需要对程序进行调试和测试,通过测试验证程序是否能够稳定运行。

基于VC的串口通信的实现

基于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 控件注销同样可以完成这一功能 " 可 以下面的语句来实现这个功能 #

VC6.0MFC串口通信编写全过程

VC6.0MFC串口通信编写全过程

其于MFC 的串口调试助手编辑过程一、新建打开VC6.0 文件 新建 工程 MFC AppWiard(exe)位置(选择保存工程位置) 工程名称(输入工程名XXXX )确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图:二、往生成的基本框架中添加控件1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。

2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。

4、对以上四个控件编程步骤如下:a 、右击串口通信控件 建立类向导Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定b、右击编辑框、属性、常规、ID:中输入ID号,此编辑框用于接收显示数据的其ID 号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入;同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。

基于VC的串口通信的设计与实现-精品

基于VC的串口通信的设计与实现-精品

课程论文首页基于VC++的串口通信的设计与实现中文摘要:在visual C++6.0平台下,利用MSComm控件编写串口通信程序,实现了串口通信参数设置与显示、打开和关闭串口、接收和发送数据、自动发送、十六进制发送与显示、清空接收区和发送区内容的功能。

关键词:串口 MSComm1 串口通信1.1 基本概念串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,以每次一个二进制的0、1为最小单位逐位进行传输,如图1所示。

图1 串行通信串行数据传送的特点是:数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。

与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。

但是串行通信传送速度比并行通信慢得多,并行通信时间为T,则串行时间为NT。

正是由于串行通信的接线少、成本低,因此它在数据采集和控制系统中得到了广泛的应用,产品也多种多样。

1.2 工作模式通过单线传输信息是串行数据通信的基础。

数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模式:单工、半双工和全双工。

(1)单工形式。

单工形式的数据传送是单向的。

通信双方中,一方固定为发送端,另一方则固定为接收端。

信息只能沿一个方向传送,使用一根传输线,如图2所示。

单工形式一般用在只向一个方向传送数据的场合。

例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。

还有在某些通信信道中,如单工无线发送等。

图2 单工形式(2)半双工形式。

半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。

在任何时刻只能由其中的一方发送数据,另一方接收数据。

因此半双工形式既可以使用一条数据线,也可以使用两条数据线,如图3所示。

visual c++串口通信与工程应用实践

visual c++串口通信与工程应用实践

visual c++串口通信与工程应用实践Visual C++是一款强大的集成开发环境,可以用于开发串口通信和工程应用。

它提供了一套丰富的工具和函数库,可以方便地进行串口通信和工程应用的开发。

需要掌握相关的编程技巧和串口通信协议知识,才能更好地实践和应用。

下面是一些实践的步骤:1. 配置串口:在Visual C++中,可以使用WinAPI函数SetCommState和GetCommState来配置串口的波特率、数据位、停止位等参数。

需要定义一个DCB结构体来保存串口的配置信息,然后使用GetCommState获取当前串口的配置信息,修改对应的参数,最后使用SetCommState来设置新的配置。

2. 打开串口:使用WinAPI函数CreateFile来打开串口。

需要提供串口的名称(如"COM1")、访问权限和共享模式等参数。

打开成功后,会返回一个句柄,可以用于后续的读写操作。

3. 读取串口数据:使用ReadFile函数从串口中读取数据。

可以设置一个缓冲区来保存读取的数据,并指定读取的字节数。

ReadFile函数会阻塞,直到有足够的数据可供读取。

4. 写入串口数据:使用WriteFile函数将数据写入串口。

可以将要发送的数据保存到一个缓冲区,然后指定要发送的字节数。

WriteFile函数会阻塞,直到所有数据都被发送。

5. 关闭串口:使用CloseHandle函数关闭串口句柄。

以上是串口通信的基本步骤,可以根据具体的应用需求和功能进行扩展。

在工程应用中,可以根据串口通信的需求来设计和开发相应的功能模块,例如数据采集、控制命令发送等。

可以使用Visual C++的其他功能,如图形界面设计和多线程编程,来增强应用的用户体验和性能。

VC编写串口调试助手(含VC6工程源文件)

VC编写串口调试助手(含VC6工程源文件)

纯业余者用VC(MFC)编写串口调试助手1.序毕业到现在,转眼就做射频开发10年了,一直从事直放站、干放等通信边缘行业,从低噪放、锁相源、选频、功放到整机,射频就那么点东西,而且越来越集成化,软件无线电是必然趋势。

做射频从业面会越来越窄,我知道所有人都会说,当你成为专家的时候,一切就都不是问题,可有几个真正的专家,再者说,射频需要经验的积累,只有实际项目做的越多越广,经验也就积累得越多,并不是一朝一夕能达到的。

前不久突然觉得,我的射频模块控制要是也是自己来编程控制多好啊!那就得学单片机编程,学习上位机编程了,可我都不会啊,要不就先来整整上位机,windows面的。

大学唯一学的编程语言是C语言,可根本不能理解用C做什么,还都还给老师10多年了,这怎么办?从BASIC,C/C++,JAVA,PASCAL搜索了一圈,还是选C++吧,毕竟是C语言发展而来,用VC环境,身边有可以请教的人。

在网上转悠了很久,发现《windows程序设计》是必看,《MFC Windows程序设计》是学MFC最经典的书籍。

OMG,这些书啊,都是上千页的,白天都在上班,哪有时间看哦,只有先下载下来作为参考资料了。

扯远了啊。

这也不行那也不行,怎么办呢?干脆硬着头皮上吧,找几个实例照搬,再修修改改加深理解吧。

第一个目标,自己编写个串口调试助手,掌握串口通信编程,这样上位机的编写就有希望了。

好了,目标定下来了。

网上下载了个串口调试助手,确定基本功能:1.自动寻找串口,并自动添加到下拉框中共选择;2.有波特率、数据位、停止位、校验位的选择设置;3.串口打开控制按钮;4.发送、清除按钮;5.接收是自动实现的;6.有定时自动发送功能;7.有传送文件功能;8.有状态栏显示,指示串口状态,设置参数和发送接收显示。

下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。

开发平台Visual C++6.0英文版,电脑是i7-2670Q四核8G存1G独显的笔记本,装的win7 64位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。

VC串口通讯控件MSComm编程详解

VC串口通讯控件MSComm编程详解
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功 能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的 API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编 程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具 体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven) 方法,一是查询法。
Detect,接收线信号检测)
ComEventRxOver 1008 接收缓冲区溢出。在接收缓冲区中没有空间
ComEventRxParity 1009 奇偶校验错。硬件检测到奇偶校验错误 7
ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区

ComEventDCB 1011 检取端口 DCB(Device Control Blick)时发生了没
发器)不支持该事件
ComEvEOF
7 收到了 EOF 字符(ASCII 字符 26)
Error 消息(MSComm 控件)下表列出了 MSComm 控件可捕获的错误消息:
常量

描述
ComInvalidPropertyValue 380
无效的属性值
ComSetNotSupported
383
属性只读
ComGetNotSupported
1。建立 mfc 工程,都会撒。
将 控 件 加 进 来 : 打 开 “Project->Add To Project->Components and

vc++mfc串口通信

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、VC编程实现串口通信软件首先,我们来大概的回忆一下单片机的串口通信。

8051单片机的串行接口由数据缓冲寄存器SBUF、移位寄存器、串行控制寄存器SCON组成。

8051单片机的串行接口是一个可编程的全双工通信接口,通过软件编程可以作为通用异步接收和发送器使用,也可作为同步移位寄存器,还可实现多机通信。

其帖格式有8位、10位和11位,通过T1或T2设置各种波特率。

1.1 串行口工作原理在发送和接收数据前,先对串行口进行初始化设置,要明确串行口的工作方式、波特率等。

1.发送数据发送数据,由累加器A送入发送缓冲寄存器SBUF,在发送控制器控制下组成帧结构,并自动以串行方式从TXD输出,每发送完一帧TI置位,可以通过中断方式或查询方式来了解数据的发送情况。

值得注意的是TI只能用软件复位。

2.接收数据单片机每接收完一帧数据,RI置位,通过中断或查询方式来了解数据的接收情况,然后用MOV A,S BUF指令,将接收缓冲寄存器(SBUF)的值送累加器A。

RI与TI一样,也只能用软件复位。

1.2串行口工作方式8051单片机通过编程可选择4种串行通信工作方式。

1.方式0在方式0下,串行口用作同步移位寄存器,以8位数据为1帧,先发送或接收最低位,每个机器周期发送或接收1位,其波特率为fosc/12。

串行数据由RXD端输入或输出,同步移位脉冲由TXD端送出。

方式0数据发送与接收是无起始位和停止位,先发送或接收最低位,数据格式为:—D0 D1 D2 D3 D4 D5 D6 D72.方式1在方式1下,串行口为10位通用异步接口,数据格式为:——0 D0 D1 D2 D3 D4 D5 D6 D7 1 ——发送数据:当执行MOV SBUF,A指令,CPU将1字节的数据写入发送缓冲寄存器SBUF,数据从引脚TXD端输出,当发送完1帧数据后,TI标志置1,可用中断或查询方式来了解数据发送情况,TI只有通过软件复位。

接收数据:接收时,先使REN置1,使串行口处于允许接收状态,RI标志为0,串行口采样到RXD由1到0时,确认是起始位0,就开始接收1帧数据。

当停止位到来时,RB8位置1,同时,中断标志位RI也置1,用中断或查询方式,通知CPU从SBUF取走接收到的数据。

3.方式2和方式3方式2和方式3均为11位异步通信方式,只是波特率的设置方法不同,数据格式为:—0 D0 D1 D2 D3 D4 D5 D6 D7 D8 1 ——发送数据:发送前,先要根据能信协议由软件设置TB8,然后将要发送的数据写入SBUF即可启动发送器。

接收数据:接收时,先使REN置1,使串行口处于允许接收状态,RI标志为0。

在满足这个条件的前提下,再根据SM2的状态和所接收到的RB8的状态,才能决定此串行口在信息到来后是否会使RI置1。

如果置1,在中断方式下将申请中断,接收数据。

当SM2=0时,不管RB8为0还是为1,RI都置1,此串行口将接收发来的信息。

当SM2=1,且RB8为1时,表示在多机能信情况下,接收的信息为地址帧,此时RI置1。

串行口将接收发来的地址。

当SM2=1,且RB8为0时,表示接收到的信息为数据帧,便不是发给本从机的,此时RI不置1,因而S BUF中所接收的数据帧将丢失。

4.多机通信在方式2和方式3下,有一个专门用于多机通信的功能,这一功能使它可以方便地应用于集散分布系统中,这种系统采用一台主机和多台从机之间通信。

多机通信的实现,主要靠主、从机之间正确地设置与判断多机通信控制位SM2和发送或接收的第9位数据位。

在硬件上,所有从机的TXD接主机的RXD,所有从机的RXD接主机的TXD。

在编程序前,首先要给从机地址编号,如分别为00H、01H、02H等,主机设置在工作方式2或方式3,TB8=1,从机初始化时设置SM2=1,处于方式2或方式3的允许接收状态。

主机与从机通信前,主机先发送一个地址字节(地址字节和数据字节可用第9位数据位来区别,第9位为1表示发送的是地址)给从机,从机接收到主机发来的信息时,第9位RB8若为1,则置位中断标志位RI,并在中断后判断主机送来的地址与本机是否相同,若相同,则被寻址的从机设置成SM2=0,准备接收即将从主机送来的数据帧,未被选中的从机保持SM2= 1的状态。

当主机发送数据时,应置TB8为0,此时,虽各从机处于接收状态,但由于TB8=0,所以只有SM2=0的从机才接收数据,其余从机保持SM2=1状态。

1.3 串行口控制串行口控制与串行口控制寄存器SCON、电源控制寄存器PCON、串行口发送/接收缓冲区SBUF中断允许寄存器IE、中断优先级、定时控制寄存器TCON及方式控制寄存器TDOM有关。

1.串行控制寄存器SCONSCON是一个可位寻址的专用寄存器,地址为98H,用于串行数据通信的控制,位功能如下:SM0 SM1 SM2 REN TB8 RB8 TI RISM0、SM1:串行口工作方式选择位。

工作方式的选择如表8.1所示下。

表8.1 串行口工作方式SM0 SM1 工作方式功能波特率0 0 0 同步移位寄存器FOSC/120 1 1 8位格式2SMOD/32×T1溢出率1 02 9位格式FOSC/32 或FOSC/641 1 3 9位格式2SMOD/32×T1溢出率SM2:多机通信控制位。

在方式2或方式3下,如果SM2=1,当RB8=1(RB8为收到的第9位数据),接收数据送SBU F,并产生中断请求(RI=1),否则丢失8位数据。

在方式2或方式3下,如果SM2=0,无论RB8=0或1,接收数据装入SBUF,并产生中断(RI =1)。

在方式1下,如果SM2=1,则只有接收到有效的停止位时,才激活RI;如果SM2=0,接收一帧数据,停止位进处RB8,数据进入SBUF,才激活RI。

在方式0下,SM2只能为0。

REN:允许接收位。

由软件置位或清0。

REN=1,允许接收;REN=0,禁止接收。

TB8:发送数据位。

在方式2或方式3下,将要发送的第9位数据放在TB8中。

可根据需要由软件置位或复位。

在多机通信中,TB8=0表示主机发送的是数据,TB8=1表示主机发送的是地址。

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。

2.串行口波特率设置串行口波特率设置与串行口工作方式及定时控制寄存器TCON、方式控制寄存器TDOM及电源控制寄存器有关。

(1).T溢出率的计算在串行通信方式1和方式3下,使用定时器T作为波特率发生器。

T可以工作于方式0、方式1和方式2,由于定时器方式2是具有自动重装功能的8位定时器,因此常选用它。

溢出周期=(12/fosc)*(256--X) ;式中X为定时器初值,fosc为晶振频率。

溢出率=1/溢出周期(2).波特率的计算(1)方式0和方式2的波特率方式0的波特率=fosc/12方式2的波特率=(2SMOD/64)×fosc(2)方式1和方式3的波特率方式1和方式3的波特率=2SMOD×fosc/[32×12(256-X)](3).波特率的设置TMOD:工作在方式2PCON:只有工作在方式1、2、3时,如果PCON的SMOD为高电平,则通信整度加倍。

SMOD ———计算定时器初值:定时器初值是由波特率=2SMOD×fosc/[32×12(256-X)]计算得到。

中断设置:SETB ES ;开串行中断SETB EA ;中断启动串行中断优先级由中断优先控制寄存器IP中的PS决定。

二、VC编程实现串口通信软件好,串口通信的基本概念和通信规则我们已经大概的有一个了解了,相信大家都已经熟记在心了。

下面,我们开始编写上位机了。

先让我们来了解一下串口通信上位机编写的方法有哪些以及要用到哪些技术,其实到现在为止我自己也是一窍不通,也没有具体的书参考,先我们还是这样画葫芦画下去吧,本人对VC的研究也不是很透彻,还得去学好C++,不过一步一步慢慢来吧,告诉自己坚持到底,要坚持到底!方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。

此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。

换句话说,只需要设置和监视MSComm控件的属性和事件。

---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性:---- CommPort 设置并返回通讯端口号,缺省为COM1。

---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。

---- Input 从接收缓冲区返回和删除字符。

---- Output 向发送缓冲区写一个字符串。

---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。

---- InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。

---- InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。

---- RThreshold 和SThreshold 属性,表示在OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。

---- 以下是通过设置控件属性对串口进行初始化的实例:BOOL CSampleDlg:: PortOpen(){BOOL m_Opened; ...... m_Serial.SetCommPort(2);// 指定串口号m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置m_Serial.SetInBufferSize(1 024); // 指定接收缓冲区大小m_Serial.SetInBufferCount(0); // 清空接收缓冲区m_Ser ial.InputMode(1); // 设置数据获取方式m_Serial.SetInputLen(0); // 设置读取方式m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串口return m_Opened; } ---- 打开所需串口后,需要考虑串口通信的时机。

相关文档
最新文档