VisualC++网络编程案例实战之串口通信编程应用(精选)
用Visual C++实现串口通讯
![用Visual C++实现串口通讯](https://img.taocdn.com/s3/m/1be49bd076a20029bd642d62.png)
学校logo[请输入论文题目]专业:[请输入专业]班级:[请输入班级]学生姓名:[请输入姓名]指导教师:[请输入指导教师]完成时间:2013年3月29日用VC 6.0实现串行通信的三种方法---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。
---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
依据不同的条件实现对串口的灵活编程控制是我们所需要的。
---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。
串行通信程序开发环境为VC++ 6.0。
---- Windows下串行通信---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。
串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。
与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTA T,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。
以下将结合实例,给出实现串行通信的三种方法。
---- 实现串行通信的三种方法---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
用VisualBasic实现串口通信的三种方法
![用VisualBasic实现串口通信的三种方法](https://img.taocdn.com/s3/m/1ddbcd6925c52cc58bd6bea2.png)
comm2. InBufferSize = 512 ′设置接收缓冲区为 512 字节
comm2. SThreshold = 1
′发送缓冲区空触发发送事件
comm2. RThreshold = 0
′禁止接收事件
′打开 COM1 ,COM2
comm1. Portopen = True
comm2. Portopen = True
以上五种属性对串口完成基本的设置和操作 ,下面的三 种属性是描述如何利用 VB 提供的事件驱动机制来实现通 信。
CommEvent :返回通信过程中产生的错误信息及事件 ,了 解通信状况 。
SThreshold :设置并返回不触发 OnComm 事件时发送缓冲 区被允许的最少字符数 。当缓冲区的字符少于设置的值时 , 则触发 OnComm 事件 ,并把 CommEvent 设为 MSCOMMM—EV— SEND。当 SThreshold = 0 则禁止发送触发 OnComm 事件 , 当 SThreshold = 1 则发送缓冲区为空时就触发 OnComm 事件 。利 用这一属性 ,就可完成发送数据后的一系列操作 。如 :对刚发 送的数据进行处理 ,当串口是和 MODEM 通信时 ,发送完数据 后可进行拆除线路联接 、挂机等操作 。
′读取接收缓冲区的所有字符
comm1. OutBufferSize = 512 ′设置发送缓冲区为 512 字节
comm1. InBufferSize = 512 ′设置接收缓冲区为 512 字节
comm1. SThreshold = 0
′禁止发送事件
comm1. RThreshold = 1 ′每一个字符到接收缓冲区都
WINDOWS 的 HELP 文件 WINSDK. HLP 中包含了完整的 WINDOWS API 函数信息 ,可用该文件查看联机函数 、数据结 构及错误信息 。
vc串口编程实例 -回复
![vc串口编程实例 -回复](https://img.taocdn.com/s3/m/6aff0460cdbff121dd36a32d7375a417866fc1cf.png)
vc串口编程实例-回复VC串口编程实例,是指使用VC(Visual C++)进行串口编程的实例。
串口编程是指通过串口(在计算机中又称通信端口)与外部设备进行数据的收发和通信。
串口编程在很多应用中都非常常见,例如与嵌入式设备、传感器、单片机等进行通信。
本文将以串口编程为主题,详细介绍如何在VC中进行串口编程的步骤和相关实例。
第一步,准备工作。
在进行串口编程之前,需要准备好一些必要的工作和工具。
首先,我们需要一台计算机和一个可用的串口接口。
然后,我们需要安装一个适合的集成开发环境(IDE)。
在本例中,我们选择使用VC进行编程。
确保已经安装好VC及其相关的开发工具和库。
第二步,创建工程。
在VC中创建一个新的工程。
在创建工程的界面中,选择“Windows桌面应用程序”作为项目类型。
输入一个项目名称,选择工作空间的目录。
点击“确定”按钮创建工程。
第三步,设置串口参数。
在VC中进行串口编程,首先需要设置串口的参数,包括波特率、数据位、停止位和校验位等。
通过设置这些参数,我们可以控制串口的通信速度和数据的可靠性。
在VC的代码中使用DCB 结构体来设置这些参数。
下面是一个示例代码段:c++DCB dcbSerialParams = { 0 };dcbSerialParams.DCBlength = sizeof(dcbSerialParams); GetCommState(hSerial, &dcbSerialParams); 获取串口配置参数dcbSerialParams.BaudRate = 9600; 设置波特率dcbSerialParams.ByteSize = 8; 设置数据位dcbSerialParams.StopBits = ONESTOPBIT; 设置停止位dcbSerialParams.Parity = NOPARITY; 设置校验位SetCommState(hSerial, &dcbSerialParams); 设置串口配置参数在上述代码中,首先定义一个DCB结构体变量dcbSerialParams,用于保存串口参数。
Visual Basic串口通信程序设计实例
![Visual Basic串口通信程序设计实例](https://img.taocdn.com/s3/m/9cd2617e2e3f5727a4e96213.png)
第6章Visual Basic串口通信程序设计典型实例利用Visual Basic开发串口通信程序既可以使用MSComm控件也可以调用Windows API 函数。
不过,只要MSComm可以被选用,它几乎总是我们推荐的选择,因为MSComm的功能和API调用一样好甚至比它还好且使用起来更加简单。
在本章提供的串口通信程序设计中,除了PC机与PC机串口通信外,PC机与单片机、PC机与智能仪表、PC机与PLC、PC机与GSM短信模块等串口通信任务的实现均采用MSComm控件。
6.1 PC机与PC机串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。
本设计通过两台PC机串口三线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。
6.1.1 设计目的1)掌握PC机与PC机串口通信的线路连接方法。
2)利用MSComm控件和VB-API函数实现PC机与PC机串口通信的程序设计方法。
6.1.2 设计用软、硬件本设计用到的硬件和软件清单见表6-1。
6.1.3 硬件线路线路说明:在计算机通电前,按图6-1所示将2台PC机通过串口线连接起来:PC机A 串口COM1端口的TXD与PC机B串口COM1端口的RXD相连;PC机A串口COM1端口的RXD与PC机B串口COM1端口的TXD相连;PC机A串口COM1端口的GND与PC机B串口COM1端口的GND相连。
6.1.4 设计任务利用MSComm控件和Visual Basic API函数编写程序实现PC机与PC机串口通信。
图6-1 PC机与PC机串口通信线路任务要求:两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。
深入分析VisualC++进行串口通信编程的详解
![深入分析VisualC++进行串口通信编程的详解](https://img.taocdn.com/s3/m/9034ecc95122aaea998fcc22bcd126fff7055dc8.png)
深⼊分析VisualC++进⾏串⼝通信编程的详解利⽤Visual C++在windows环境下设计异步串⾏通信程序可以使⽤不同的⽅法。
⼀种⽅法可以使⽤windows系统提供的串⾏⼝API函数;另⼀种⽅法可以直接使⽤Microsoft公司提供的ActiveX控件MSCOMM.OCX。
利⽤MSCOMM.OCX控件进⾏串⾏⼝程序设计相对⽐较简单,只要对该控件的属性、事件和⽅法进⾏设置和操作,就能完成简单的串⾏通信功能。
⽽直接使⽤windows系统提供的串⾏⼝API函数则相对较为灵活。
试验中,可根据⾃⼰的情况任意其中⼀种进⾏编程。
以下针对如何使⽤windows系统提供的串⾏⼝API函数进⾏编程做简要介绍在windows系统,串⾏⼝和其它通信设备都是作为⽂件进⾏处理的。
串⾏⼝的打开、关闭、发送和接收所⽤的函数都与操作⽂件的函数相同。
总体来说,利⽤Visual C++进⾏异步串⾏通信程序设计通常可以分为4个⼤阶段,它们是串⾏⼝打开阶段、串⾏⼝状态值读取和属性设置阶段、串⾏数据的发送与接收阶段,以及串⾏⼝关闭阶段。
在对串⾏⼝进⾏所有的操作之前,⾸先要将其打开。
串⾏⼝的打开可以使⽤CreateFile函数,CreateFile函数将返回⼀个句柄,在随后与该串⾏⼝相关的各种操作中使⽤。
与⽂件操作相同,在利⽤CreateFile打开串⾏⼝时,也可以将串⾏⼝指定为“读访问权限”、“写访问权限”或“读写访问权限”。
复制代码代码如下:HANDLE CreateFile(LPCTSTR lpFileNameDWORD dwDesiredAccessDWORD dwSharedModeLPSECURITY_ATTRIBUTES lpSecurityAttributesDWORD dwCreationDispositionDWORD dwFlagsAndAttributesHANDLE hTemplateFile);在调⽤成功时,CreateFile返回打开⽂件的句柄,该句柄将在以后与该串⼝相关的各个调⽤函数中使⽤。
VS编程,C#串口通讯,通过串口读取数据的一种方法
![VS编程,C#串口通讯,通过串口读取数据的一种方法](https://img.taocdn.com/s3/m/558c8f2fae45b307e87101f69e3143323968f5a2.png)
VS编程,C#串⼝通讯,通过串⼝读取数据的⼀种⽅法⼀、可能需要的软件:1、虚拟串⼝vspd(Virtual Serial Port Driver,⽤来在电脑上虚拟出⼀对串⼝,模拟通讯。
2、友善串⼝调试助⼿,⽤来发送、读取数据。
⼆、思路1、查询本机所有的串⼝2、判断需要的串⼝是否存在本机的串⼝中3、设置串⼝的参数,如波特率、奇偶校验等。
4、打开串⼝,5、通过串⼝读取数据,处理数据6、关闭当前窗⼝时,将串⼝⼀并关闭。
7、可以写⼀个定时器,来循环执⾏1、2两步,并判断串⼝是否打开,以保持串⼝通讯正常。
三,代码1、查询本机所有的串⼝///<summary>///获取本机串⼝列表///</summary>///<param name="isUseReg"></param>///<returns></returns>private List<string> GetComlist(bool isUseReg){List<string> list = new List<string>();try{if (isUseReg){RegistryKey RootKey = Registry.LocalMachine;RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");String[] ComNames = Comkey.GetValueNames();foreach (String ComNamekey in ComNames){string TemS = Comkey.GetValue(ComNamekey).ToString();list.Add(TemS);}}else{foreach (string com in SerialPort.GetPortNames()) //⾃动获取串⾏⼝名称list.Add(com);}}catch{MessageBox.Show("串⾏端⼝检查异常!", "提⽰信息");// System.Environment.Exit(0); //彻底退出应⽤程序}return list;}2、判断需要的串⼝是否存在本机的串⼝中///<summary>///判断是否存在当前串⼝///</summary>private void StartSerialPortMonitor(){List<string> comList = GetComlist(false); //⾸先获取本机关联的串⾏端⼝列表if (comList.Count == 0){MessageBox.Show("当前设备不存在串⾏端⼝!", "提⽰信息");// System.Environment.Exit(0); //彻底退出应⽤程序}else{string targetCOMPort = "COM8";//判断串⼝列表中是否存在⽬标串⾏端⼝if (!comList.Contains(targetCOMPort)){MessageBox.Show("提⽰信息", "当前设备不存在配置的串⾏端⼝!");//System.Environment.Exit(0); //彻底退出应⽤程序}}}3、设置串⼝的参数,如波特率、奇偶校验等。
Visual Basic串口通信程序设计实例
![Visual Basic串口通信程序设计实例](https://img.taocdn.com/s3/m/c310f97102d276a201292e16.png)
第6章Visual Basic串口通信程序设计典型实例利用Visual Basic开发串口通信程序既可以使用MSComm控件也可以调用Windows API 函数。
不过,只要MSComm可以被选用,它几乎总是我们推荐的选择,因为MSComm的功能和API调用一样好甚至比它还好且使用起来更加简单。
在本章提供的串口通信程序设计中,除了PC机与PC机串口通信外,PC机与单片机、PC机与智能仪表、PC机与PLC、PC机与GSM短信模块等串口通信任务的实现均采用MSComm控件。
6.1 PC机与PC机串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信.本设计通过两台PC机串口三线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收.6.1.1 设计目的1)掌握PC机与PC机串口通信的线路连接方法。
2)利用MSComm控件和VB-API函数实现PC机与PC机串口通信的程序设计方法。
6.1。
2 设计用软、硬件本设计用到的硬件和软件清单见表6-1。
6.1.3 硬件线路线路说明:在计算机通电前,按图6—1所示将2台PC机通过串口线连接起来:PC机A串口COM1端口的TXD与PC机B串口COM1端口的RXD相连;PC机A串口COM1端口的RXD与PC机B串口COM1端口的TXD相连;PC机A串口COM1端口的GND与PC机B串口COM1端口的GND相连。
6.1。
4 设计任务利用MSComm控件和Visual Basic API函数编写程序实现PC机与PC机串口通信。
216图6-1 PC机与PC机串口通信线路任务要求:两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123",单击“发送字符"命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。
基于VC的串行通信技术应用实例
![基于VC的串行通信技术应用实例](https://img.taocdn.com/s3/m/53139cea760bf78a6529647d27284b73f2423618.png)
基于VC的串⾏通信技术应⽤实例 在⼯业控制中,串⼝是常⽤的计算机与外部串⾏设备之间的数据传输通道,由于串⾏通信⽅便易⾏,所以应⽤⼴泛。
本⽂将介绍在Windows平台下串⾏通信的⼯作机制和⽤Visual C++设计串⾏通信程序的编程⽅法及通信⽅式。
VC中实现串⾏通信的编程技术 以下我们将介绍VC中⼏种实现串⾏通信的编程技术: 利⽤VC++的标准通信函数 利⽤VC++的标准通信函数_inp和_outp可实现串⼝通信。
下⾯是⼀个串⼝初始化的程序: void init_com(PORT) {char i; outp(PORT+3,0x80); outp(PORT,0x0C); outp(PORT+1,0); outp(PORT+3 ,0x3a); outp(PORT+3 ,0x03); i=inp(PORT+5) && 0xfe; outp(PORT+5,i);} 使⽤串⾏通信控件MSComm 串⾏通信控件MSCOmm32.OCX提供了使⽤RS-232来进⾏数据通信的所有协议,VC为该控件提供了标准的事件处理函数、过程,并通过属性和⽅法提供了串⾏通信的设置。
它使⽤户能够⽅便地访问Windows串⾏通信驱动程序的⼤多数特性,包括输⼊、输出缓冲区的⼤⼩及决定何时使⽤流控制命令挂起数据传输等。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串⼝属性进⾏设置,MSComm控件共有27个属性。
以下是通过设置控件属性对串⼝进⾏初始化的实例: BOOL CSampleDlg:: PortOpen() { BOOL m_Opened; ...... m_Serial.SetCommPort(2); // 指定串⼝号 m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置 m_Serial.SetInBufferSize(1024); // 指定接收缓冲区⼤⼩ m_Serial.SetInBufferCount(0); // 清空接收缓冲区 m_Serial.InputMode(1); // 设置数据获取⽅式 m_Serial.SetInputLen(0); // 设置读取⽅式 m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串⼝ return m_Opened;} 打开所需串⼝后,我们需要考虑串⼝通信的时机。
Visual Basic 串口通讯编程
![Visual Basic 串口通讯编程](https://img.taocdn.com/s3/m/abddfe20dd36a32d73758166.png)
Visual Basic 串口通讯编程对于串行口的应用,相信大家多少知道一些,例如,它可以连接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事情。
但是,对于串行口的理论,可能了解一二有所剩无几了。
什么是串行口?它是如何工作的?为什么用串行口?您知道吗?一、关于串行口发明计算机的人,肯定注意到了一点,那就是计算机必须与外界进行信息的交换,所以他们为计算机设计了外设口。
要与显示器相连,于是设计了显示口;要与硬盘相连,于是设计了IDE口;要与打印机相连,于是设计了打印口。
那么,有没有用最少数量的线(线多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?当然,这就是诞生于设计大师们手中的串......对于串行口的应用,相信大家多少知道一些,例如,它可以连接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事情。
但是,对于串行口的理论,可能了解一二有所剩无几了。
什么是串行口?它是如何工作的?为什么用串行口?您知道吗?一、 关于串行口发明计算机的人,肯定注意到了一点,那就是计算机必须与外界进行信息的交换,所以他们为计算机设计了外设口。
要与显示器相连,于是设计了显示口;要与硬盘相连,于是设计了IDE口;要与打印机相连,于是设计了打印口。
那么,有没有用最少数量的线(线多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?当然,这就是诞生于设计大师们手中的串行口。
串行口所需要的线的确很少,一根公共地线无论如何也得要,然后,一根发送数据的线和一根接收数据的线,共三根线就行了。
也许您还会问,“能不能再少些呢?两根,一根,干脆一根都不要,成吗?”当然行,红外接口不就是一根线都没有吗?也许当时搞无线通讯的天才就是像您这么想的,不过这已经超出了今天我们讨论的范围。
既然是通讯,那么就必须有两台设备才行。
常用的串行线是怎样制作的呢?在计算机后边,您最少会看到一个串行口(笔记本电脑通常为一个,台式计算机通常为二个),采用的是梯型DB-9或DB-25插座,即采用9根线或25根线的插座,这是因为有的外设需要像数据准备、载波检测、请求发送等联络信号(对这些信号线感兴趣的先生/女士,可以查阅有关串行口的资料)。
c语言怎么写串口通信编程
![c语言怎么写串口通信编程](https://img.taocdn.com/s3/m/ecd6c3d5dbef5ef7ba0d4a7302768e9951e76e3a.png)
c语言怎么写串口通信编程串口通信是一种广泛应用于嵌入式系统和电子设备之间的通信方式。
无论是嵌入式开发还是电子设备控制,串口通信都是常见的需求。
在C语言中,实现串口通信需要通过操作串口的硬件寄存器和使用相应的通信协议来实现数据的发送和接收。
本文将一步一步介绍如何使用C语言编写串口通信程序。
第一步:打开串口要开始串口通信,首先需要打开串口。
在C语言中,可以使用文件操作函数来打开串口设备。
通常,串口设备被命名为/dev/ttyS0,/dev/ttyS1等,具体名称取决于系统。
下面是一个打开串口设备的示例代码:cinclude <stdio.h>include <fcntl.h>include <termios.h>int open_serial_port(const char *port) {int fd = open(port, O_RDWR O_NOCTTYO_NDELAY);if (fd == -1) {perror("open_serial_port");return -1;}设置串口属性struct termios options;tcgetattr(fd, &options);cfmakeraw(&options);cfsetspeed(&options, B9600);tcsetattr(fd, TCSANOW, &options);return fd;}int main() {const char *port = "/dev/ttyS0";int fd = open_serial_port(port);if (fd == -1) {打开串口失败,处理错误return -1;}串口已打开,可以进行数据的读写操作return 0;}在上面的代码中,open_serial_port函数用于打开指定的串口设备并进行一些必要的设置。
Visual C++与串口通信
![Visual C++与串口通信](https://img.taocdn.com/s3/m/f0298dc09ec3d5bbfd0a7437.png)
V i s u a l C++与串口通信利用Visual C++编制串行通信程序有3种方法:一是采用Win32应用程序编程接口(API)所提供的串行通信函数,用SDK思路编写;二是用ActiveX通信控件MSComm开发串行通信程序;三是采用C++的MFC思路,将Win32串口通信的API函数封装在一个类中实现串行通信。
在实践中,使用Visual C++串口控件MSComm实现通信的方法比调用API动态链接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,从而大大提高了编程效率,也减少了因编程不当而导致的系统不稳定。
采用C++的MFC思路的方法较为繁琐,不仅要了解Win32串行通信的API函数,还要掌握多线程编程,但控制灵活,既涉及到底层编程、纠错能力强,又有C++风格,一般多为专业C++开发人员所采用。
5.1 串行接口串行接口一般包括RS232/422/485,其技术简单成熟,性能可靠,价格低廉,所要求的软硬件环境或条件都很低,广泛应用于计算机及相关领域,遍及调制解调器(Modem)、串行打印机、各种监控模块、PLC、摄像头云台、数控机床、单片机及相关智能设备,甚至路由器也不例外(通过串口设置参数)。
在计算机测控系统中,主控机一般采用PC或IPC,通过串口与测控模块相连,测控模块再连接相应的传感器和执行器,形成一个简单的双层结构的计算机测控系统。
这种结构主要用于单独的中小型企业或部门,如果属于综合型企业或部门,如电力系统监控、高速公路监控和收费系统,则可以此为基础结构进行扩充。
用集线器将众多双层监控系统连接起来,再用交换机将若干集线器连接起来,统一接上路由器,从而与Internet互联,形成一个庞大的计算机测控网络。
由此可见,尽管现代计算机的新接口层出不穷,各种网络也日新月异,其规模也越来越大,但是,其基础结构却有不少是串行通信系统,串行通信也成了其中的核心技术。
5.1.1 串口通信的基本概念1.并行通信与串行通信终端与其他设备(例如,其他终端、计算机和外部设备)通过数据传输进行通信。
vc串口编程实例
![vc串口编程实例](https://img.taocdn.com/s3/m/6a20ee8850e79b89680203d8ce2f0066f5336436.png)
我了,今天就总结这么多,下一篇打算说说vc++在绘图方面的使用。
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
vc串 口 编 程 实 例
今天总结一下使用vc++操作串口的程序,使用vc++编写的串口程序,大致分为一下几种 1.使用Win32 API函数编写串口程序; 2.使用VC++自带的控件MScomm控件; 3.网上有许多程序爱好者自己编写了串口通信类,我们可以下下来使用;
c语言串口通信范例
![c语言串口通信范例](https://img.taocdn.com/s3/m/e5a61303580102020740be1e650e52ea5518ced7.png)
一个c语言的串口通信程序范例标签:分类:最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c,一些资料,找来做个记录,也许大家用的着include <>include <>include <>include <>define COM232 0x2f8define COMINT 0x0bdefine MaxBufLen 500define Port8259 0x20define EofInt 0x20static int comportaddr;static char intvectnum;static unsigned char maskb;static unsigned char BufferMaxBufLen;static int CharsInBuf,CircIn,CircOut;static void interrupt far OldAsyncInt;static void interrupt far AsyncIntvoid;void Init_COMint ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity {unsigned char High,Low;int f;comportaddr=ComPortAddr;intvectnum=IntVectNum;CharsInBuf=0;CircIn=0;CircOut=0;f=Baud/100;f=1152/f; High=f/256;Low=f-High256;outpComPortAddr+3,0x80; outpComPortAddr,Low; outpComPortAddr+1,High;Data=Data-5|Stop-14;ifParity==2 Data=Data|0x18;else ifParity==1 Data=Data|0x8; outpComPortAddr+3,Data; outpComPortAddr+4,0x0a; outpComPortAddr+1,0x01; disable;OldAsyncInt=getvect IntVectNum ; setvect IntVectNum, AsyncInt ; enable;maskb=inpPort8259+1;ifIntVectNum==0x0coutpPort8259+1,maskb&0xef; else outpPort8259+1,maskb&0xf7;}static void interrupt far AsyncIntvoid{disable;ifCharsInBuf<MaxBufLenBufferCircIn=inpcomportaddr;ifCircIn<MaxBufLen-1 CircIn++;else CircIn=0;ifCircIn==CircOut CircOut++;else CharsInBuf++;enable;outpPort8259,EofInt;}void Restorevoid{setvectintvectnum,OldAsyncInt; outpPort8259+1,maskb;}int GetCharInBufunsigned char Char {int Flag;Flag=-1;ifCharsInBuf>0{Char=BufferCircOut;ifCircOut<MaxBufLen-1CircOut++; else CircOut=0;CharsInBuf--;Flag=0;}return Flag;}int SendCharunsigned char Char{ifinpcomportaddr+5&0x20==0 return -1; outpcomportaddr,Char;return 0;}main{int i,c;unsigned char InChar;Init_COMCOM232,COMINT,1200,8,1,0; while1{ifkbhit{ifInChar=getch==27break; else whileSendCharInChar; }ifGetCharInBuf&InChar==0 printf"%c",InChar;}Restore;}接收程序:include <>include <>include <>include <>include <>include <>define RXD 0 .;void putbunsigned char ch.{unsigned char ch;ch=inportbportaddr+RXD;putbch;incount++; n";exit1;}else{printf"The used port is :COM%d\n",ComNum; };Getportaddrport; .elsedefine __CPPARGSendifdefine SER_RBF 0define SER_THR 0define SER_IER 1define SER_IIR 2define SER_LCR 3define SER_MCR 4define SER_LSR 5define SER_MSR 6define SER_DLL 0define SER_DLH 1define SER_BAUD_1200 96 define SER_BAUD_2400 48 define SER_BAUD_9600 12 define SER_BAUD_19200 6 define SER_GP02 8 define COM_1 0x3F8define COM_2 0x2F8 // base port address of port 1/define COM_3 0x3E8define COM_4 0x2E8define SER_STOP_1 0 // 1 stop bit per character/define SER_STOP_2 4 // 2 stop bits per character/define SER_BITS_5 0 // send 5 bit characters/define SER_BITS_6 1 // send 6 bit characters/define SER_BITS_7 2 // send 7 bit characters/define SER_BITS_8 3 // send 8 bit characters/define SER_PARITY_NONE 0 // no parity/define SER_PARITY_ODD 8 // odd parity/define SER_PARITY_EVEN 24 // even parity/define SER_DIV_LATCH_ON 128 // used to turn reg 0,1 into divisor latch/ define PIC_IMR 0x21 // pic's interrupt mask reg./define PIC_ICR 0x20 // pic's interupt control reg./define INT_SER_PORT_0 0x0C // port 0 interrupt com 1 & 3/define INT_SER_PORT_1 0x0B // port 0 interrupt com 2 & 4/define SERIAL_BUFF_SIZE 128 // current size of circulating receive buffer/ void interrupt far Old_Isr__CPPARGS; // holds old com port interrupt handler/ char ser_bufferSERIAL_BUFF_SIZE; // the receive buffer/int ser_end = -1,ser_start=-1; // indexes into receive buffer/int ser_ch, char_ready=0; // current character and ready flag/int old_int_mask; // the old interrupt mask on the PIC/int open_port; // the currently open port/int serial_lock = 0; // serial ISR semaphore so the buffer/// isn't altered will it is being written/// to by the ISR//-------------写串口-----------------/void interrupt far Serial_Isr__CPPARGS{serial_lock = 1;ser_ch = inpopen_port + SER_RBF;if ++ser_end > SERIAL_BUFF_SIZE-1ser_end = 0;ser_bufferser_end = ser_ch;++char_ready;outpPIC_ICR,0x20;serial_lock = 0;}int Ready_Serial{returnchar_ready;}/--------------读串口--------------/ int Serial_Read{int ch;whileserial_lock{}if ser_end = ser_start{if ++ser_start > SERIAL_BUFF_SIZE-1ser_start = 0;ch = ser_bufferser_start;printf"%x",ch;if char_ready > 0--char_ready;returnch;}elsereturn0;}/--------------写串口-----------------/ Serial_Writechar ch{whileinpopen_port + SER_LSR & 0x20{}asm clioutpopen_port + SER_THR, ch;asm sti}/-----------初始化串口---------------/Open_Serialint port_base, int baud, int configuration {open_port = port_base;disable;outpport_base + SER_LCR, SER_DIV_LATCH_ON;outpport_base + SER_DLL, baud;outpport_base + SER_DLH, 0;outpport_base + SER_LCR, configuration;outpport_base + SER_MCR, SER_GP02;outpport_base + SER_IER, 1;if port_base == COM_1 || port_base==COM_3{Old_Isr = _dos_getvectINT_SER_PORT_0;_dos_setvectINT_SER_PORT_0, Serial_Isr;printf"\nOpening Communications Channel Com Port 1/3...\n";}else{Old_Isr = _dos_getvectINT_SER_PORT_1;_dos_setvectINT_SER_PORT_1, Serial_Isr;printf"\nOpening Communications Channel Com Port 2/4...\n";}old_int_mask = inpPIC_IMR;outpPIC_IMR, port_base==COM_1 old_int_mask & 0xEF : old_int_mask & 0xF7 ; enable;}/-------------关闭串口--------------/Close_Serialint port_base{outpport_base + SER_MCR, 0;outpport_base + SER_IER, 0;outpPIC_IMR, old_int_mask ;if port_base == COM_1{_dos_setvectINT_SER_PORT_0, Old_Isr;printf"\nClosing Communications Channel Com Port 1.\n"; }else{_dos_setvectINT_SER_PORT_1, Old_Isr;printf"\nClosing Communications Channel Com Port 2.\n"; }}/-------------发送应用----------------/ void mainint argc,char argv{char ch,press;int done=0;FILE fp;argc=2;//argv1="c:\\";ifargc<2{printf"\nUsage:display ";// exit1;}iffp=fopenargv1,"r+b"==NULL{printf"cannot open the file\n";// exit0;}fseekfp, 0, SEEK_SET;Open_SerialCOM_1,SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1; printf"com:1;bps:9600;parity:even;bits:8;stop bit:1";printf"press any key to begin sending";getch;//Serial_Write''; //该语句可用于发送单个字符whiledone&&ch = EOF //发送文件开始{ch = fgetcfp;//ifch==EOF Serial_Write27;Serial_Writech;delay30;if kbhit{press=getch;if press==27{Serial_Write27;done=1;}}}Close_SerialCOM_1;fclosefp;}下面介绍最重要的MFC:CWnd:窗口,它是大多数“看得见的东西”的父类Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口,比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单CMenu不是从窗口派生的; CDocument 文档,负责内存数据与磁盘的交互;最重要的是OnOpenDocument读入,OnSaveDocument写盘,Serialize读写CView视图,负责内存数据与用户的交互;包括数据的显示、用户操作的响应如菜单的选取、鼠标的响应;最重要的是OnDraw重画窗口,通常用CWnd::Invalidate来启动它;另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息;CDialog对话框CWinApp应用程序类;似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立;最常用函数InitInstance:初始化;CGdiObject及子类,用于向设备文本画图;它们都需要在使用前选进DC;CPen笔,画线CBrush刷子,填充CFont字体,控制文字输出的字体CBitmap位图CPalette调色板CRgn区域,指定一块区域可以用于做特殊处理;CFile文件;最重要的不外是Open打开,Read读入,Write写CString字符串;封装了C中的字符数组,非常实用;CPoint点,就是x,y对CRect矩形,就是left,top,right,bottomCSize大小,就是cx,cy对宽、高。