上位机与单片机之间的通讯
用Delphi实现上位机和单片机的串行通信
![用Delphi实现上位机和单片机的串行通信](https://img.taocdn.com/s3/m/f9813ae019e8b8f67c1cb916.png)
上位机与 8c1 95 单片机 的串行通信方法 。
1 实现 方 法
1 上位机 与 8 1 片机 的 串行通 信 硬 件 连 接 . %5 单 如图 1 所示 , 采用 的是 R 22串行 总线标 准 。 S3
2通信流程 由上位机与 8c1 . 95 单片机通过一
系 列应答 联络 后 , 从后 者 获取 串行数据 。其 流程 如图
储 及实 时控制 。工程 实 际 中, 般还要 实现 单片 机与 一
上位机的串行通信 , 使上位机能对现 场数 据进 行汇 集 、 理 和 分 析 。Brn 整 oad公 司推 出 的 D l i 目前 l ep 是 h
流 行的软 件开 发工具 , 文就是介 绍用 D lh来 实现 本 e i p
TheRe l a i n o e ilCo ai to fS ra z mmu ia i n t e Up e - o p tr n c to bewe n p rc m ue a d M ir c n r l r b p y n l hiS fwa e n c o o t o l y Ap l ig Dep o t r e
T s meh d i s l ,e a l a d es- o t n p a t a d i h shg e p l a o au i h to i e r h b e n ay t a s ln , n t a ih r p i t n v e s mp r a ci l Ke wo d :e a m a y r s s r c rmmiain u p rc mp tr Dep i mit ̄nr l r i l c  ̄ ; p e- o u e ; lh : co t 1 o o. e
本文使用串行通信控件 M Cm , S o m 实现上位机与
单片机多机串口的通信
![单片机多机串口的通信](https://img.taocdn.com/s3/m/bd588357be23482fb4da4c88.png)
摘要本文详细介绍了基于RS-485总线的单片机与多台单片机间的串行通信原理、实现方法和相应的通信硬件、软件设计。
该设计是由单片机与单片机组成的主从控制系统,其中单片机做为上位机对下位单片机是实现控制和监视功能。
它包括通信和控制两个功能模块。
单片机作为下位机在整个系统中属于从属地位,主要用来接收上位机的命令。
由于此通信的单片接口是RS232的9针接口,且下位机数目有限(32台)。
所以本设计采用了RS485总线以及RS232转RS485的协议芯片以满足长距离多机通信,本文讨论了总线接口转换、主从式通信协议设计方法,给出了采用中断式处理的通信过程流程图,并叙述了设计过程中必备的绘图软件Protel DXP的应用,以及编辑源代码软件keil uVision2的应用,实现了单片机对多个单片机组成采集终端的通信与管理。
关键词:单片机单片机RS-485 通信AbstractThe communication 、realized method and corresponding design of hardware and software between 单片and multiple MCUs based on RS-485 is described in detai in the article. This design instroduces a pincipal and subordinate control system which is composed of 单片and single chip. Divided from its function, it includes two parts: communication and control, in which 单片is used as master, and MCUs is used as slave so as to receive the single order from the master.The bus interface conversion and the design of master-slave communication protocol is introduced and The program flowchart of communication with interrupt process is also given. In the process of design, the use of unnecessary painter software and code editor software is depicted so that realize the communication and administration between 单片and multiple MCUs which composed collection terminal.Keywords: 单片MCUs RS-485 communication目录第一章绪论 (1)第二章课题实施方案 (2)2.1 系统硬件设计 (2)2.2 系统软件设计 (3)第三章硬件电路设计 (9)3.1 C51单片机结构 (9)一CPU结构 (10)二ROM存储器 (11)三I/O端口 (11)四定时器/计数器 (12)五中断系统 (13)3.1.2 51单片机引脚功能及其连接 (13)3.1.3 51 中断系统 (15)3.1.4 C-51的串行通信 (15)3.2.1串行接口RS232结构与引脚功能 (21)3.3 Protel DXP 2004原理图设计 (23)3.3.1 Protel 2004的基本操作 (23)3.3.2绘制原理图 (25)3.3.3制作芯片原理图库 (27)第四章软件电路设计 (30)4.1 系统的通信协议 (31)4.2 C51编程实现单片机与单片机之间的串行通信 (31)4.3 Windows集成开发环境uVision2 (35)4.3.1启动uVision2 (35)4.3.2创建程序 (36)总结 (41)致谢 (42)参考文献 (43)第一章绪论单片机由于其具有控制功能强、设计灵活和性能价格比高的特点。
单片机和上位机协议
![单片机和上位机协议](https://img.taocdn.com/s3/m/037e1d722a160b4e767f5acfa1c7aa00b52a9d30.png)
单片机和上位机协议一、引言随着科技的快速发展,单片机在各个领域得到了广泛的应用。
而单片机与上位机之间的通信协议也成为了重要的研究方向。
本文将探讨单片机与上位机之间的通信协议,包括协议的基本原理、常见的协议类型以及它们的应用场景等。
二、单片机与上位机之间的通信协议基本原理单片机与上位机之间的通信协议是为了实现两者之间的数据交换和通信而设计的。
协议的基本原理是通过一定的规则和约定,实现数据的传输和解析。
常见的单片机与上位机通信协议包括串口通信、USB通信、以太网通信等。
其中,串口通信是最常见和简单的通信方式。
它通过串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。
串口通信具有成本低、易于实现等优点,广泛应用于各个领域。
三、常见的单片机与上位机通信协议类型1. 串口通信协议串口通信协议是最常见和简单的通信方式。
它使用串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。
常见的串口通信协议包括RS232、RS485等。
RS232是一种标准的串行通信接口,广泛应用于计算机、工业自动化等领域;RS485是一种多点通信协议,支持多个设备同时通信,适用于工业控制系统等应用场景。
2. USB通信协议USB通信协议是一种高速、可靠的通信方式。
它通过USB接口将单片机与上位机连接起来,实现数据的传输和通信。
USB通信协议具有带宽大、速度快等优点,广泛应用于外设设备、嵌入式系统等领域。
常见的USB通信协议包括USB1.1、USB2.0、USB3.0等。
3. 以太网通信协议以太网通信协议是一种广域网通信协议,它通过以太网接口将单片机与上位机连接起来,实现数据的传输和通信。
以太网通信协议具有传输速度快、可靠性高等优点,广泛应用于局域网、互联网等领域。
常见的以太网通信协议包括TCP/IP、UDP等。
四、单片机与上位机通信协议的应用场景单片机与上位机通信协议在各个领域都有着广泛的应用。
在工业控制领域,单片机与上位机通信协议被用于监控系统、物联网等方面。
单片机与单片机通信原理
![单片机与单片机通信原理](https://img.taocdn.com/s3/m/de838929dcccda38376baf1ffc4ffe473368fdbb.png)
单片机与单片机通信原理
单片机与单片机之间的通信原理是通过串行通信或并行通信进行的。
串行通信是指将数据按位顺序传输,而并行通信则是同时传输多个位。
在串行通信中,需要使用UART(通用异步收发器)进行通信。
UART将数据转换为适合传输的格式,并通过一个线路将数据发送到接收方。
在发送数据时,发送方将数据发送到UART
的发送缓冲区中,UART会按照设定的速率将数据按位发送。
接收方的UART会接收到发送方发送的数据,将其保存在接
收缓冲区中,然后应用程序可以从接收缓冲区中读取数据。
在并行通信中,通常使用I2C(双线串行总线)或SPI(串行
外围接口)进行通信。
I2C通信使用两根线路:数据线(SDA)和时钟线(SCL)。
发送方通过SDA线将数据发送给接收方,同时使用SCL线提供时钟信号。
接收方通过SCL线接收时钟
信号,并从SDA线上读取数据。
SPI通信需要至少四根线路:时钟线(SCK)、主设备输出(MOSI)、主设备输入(MISO)和片选线(SS)。
在SPI
通信中,主设备通过时钟线提供时钟信号,通过MOSI线发送数据给从设备,并通过MISO线接收从设备传输的数据。
片选线用于选择将要进行通信的从设备。
无论是串行通信还是并行通信,单片机之间的通信都需要事先约定好通信协议和参数设置,以确保数据的准确传输。
通信协
议可以包括数据格式、波特率等。
同时,通信的双方也需要进行数据的校验和错误处理,以防止数据传输中的错误或丢失。
PC机与单片机之间的串行通讯、数据的发送和接收
![PC机与单片机之间的串行通讯、数据的发送和接收](https://img.taocdn.com/s3/m/7bdfcffabd64783e08122b55.png)
PC机与单片机之间的串行通讯、数据的发送和接收【摘要】本文以MCS-51单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收。
在Windows98下利用VB的串行通讯控件可实现PC机与单片机之间的通讯。
其数据的发送和接收采用红外线通信方式,其优点是:省去了有线通信信号线的直接连接,使用简单,移动方便,微机与单片机无直接连接,属完全隔离状态,两者间不会因为电平的不同而造成数据传输的失误,抗干扰能力强。
本设计主要应用AT89C51作为控制核心,并与LED数码显示管、双向可控硅、红外发射与接收相结合的系统,充分发挥了单片机的性能。
其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点,具有一定的使用和参考价值。
【关键字】MSC-51(单片机),红外,RS-232,电平转换器,串行通信半双工【Abstract】This text take one-chip computer MCS-51 for example , introduce a serial communication, data’s sending and receiving . Under the Windows98 we make use of a communication control of VB to achieve the communication of the machine of PC and one-chip computer. Its data’s sending and receiving adopts the method of the infrared ray communication, its advantage is that it exclude the direct link of signal line of with-wired communication ,and usage are simple, and move is convenience etc. The tiny machine have no direct conjunction with single a machine, belonging to the complete insulation appearance, can't result in the error that data deliver both because give or get an electric shock even and different, the antijam ability is strong.This design is a system that it applies AT89C51 as control core and combine the LED figures manifestation tube, MAX232CPE level changer, infrared’s sending and receiving. The system completely exerts the function of one-chip computer. Its advantage is that the hardware circuit is simple; the software function is perfect; the control system is dependable; the rate of price and function is high etc. So the system has certainly consult value.【Keyword】MSC-51(One-chip computer), infrared, RS-232, Level changer, serial communication,half duplex目录前言3第一章系统分析4 1.1 系统功能的概述 5 1.2 系统要求及主要内容 5 1.3 系统技术指标 5第二章系统总体设计6 2.1硬件设计思路 6 2.2软件设计思路 7第三章硬件电路设计7 3.1 单片机模块设计 8 3.2 红外通信(发射与接收)电路的设计 14 3.3 PC机模块的设计 17第四章串行口通信技术20 4.1 单片机串行口通信 21 4.2 PC机串口通信 24第五章软件设计25 5.1 单片机通信程序设计 25 5.2 PC机通信程序设计 29第六章系统调试30 6.1 硬件调试 30 6.2 软件调试 31 6.3 综合调试 33 6.4 故障分析及解决方案 33 6.5 结论与经验 34结束语35附录36 附录1 电路原理图 36 附录2程序流程图 38 附录3程序清单 41 附录4元器件清单 44 附录5 英文资料 45 附录6 中文翻译 52参考文献56前言单片机的英文名称是Micro Controller unit,缩写为MCU,又称为微控制器,它是一种面向控制的大规模集成电路芯片。
上位机和单片机串口编程---API函数编程
![上位机和单片机串口编程---API函数编程](https://img.taocdn.com/s3/m/885e2f90dbef5ef7ba0d4a7302768e9951e76ee1.png)
上位机和单片机串口编程---API函数编程上位机和单片机串口编程不用MSComm控件,那看起来只能是使用Windows API了,因为MFC貌似没有什么类封装了串口API函数的。
用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高,而且对于那些纯绿色软件追求者来说,没有ActiveX控件比什么都重要――呵呵,我也是这么认为。
API编写串口,过程一般是这样的:1、创建串口句柄,用CreateFile;2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);3、然后对串口进行相应的读写操作,这时候用到ReadFile 和WriteFile函数;4、读写结束后,要关闭串口句柄,用CloseFile;下面依次大致讲讲个步骤的过程:第一步,从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(__G),而且在调用CreateFile的时候请注意它的参数。
CreateFile函数原型如下:HANDLE CreateFile(__ lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,__ITY___TES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );lpFileName是你需要创建的端口号,默认情况下是COM1;dwDesiredAccess是表明你想让你创建的串口以何种方式存在于你的应用程序中,因为串口通常是可读可写的,所以这里必须设置为___READ|___WRITE;dwShareMode是用来设置串口共享属性的,因为串口属于临界资源,当然不能共享,所以这里也必须设置为0;lpSecurityAttributes是设置安全模式,一般采用默认的安全模式就可以了,选择NULL;dwCreationDisposition是设置是否打开新的“文件”(上面说过了,Windows是把串口等端口当作文件来处理的),因为串口属于硬件端口,当然不能随便重复创建,所以这里必须告诉Windows,每次创建的时候必须使用已经存在的串口,所以这里设置OPEN___G;dwFlagsAndAttributes,这个参数可以设置的值比较多,大家若需要深入了解可以查找MSDN,这里因为我们接下去要做的是异步通讯,所以需要设置FILE_FLAG___PED;最后一个参数hTemplateFile是指定模板文件,串口没有模板,选择NULL;所以最后我们设置的CreateFile函数如下:m_hCom=CreateFile(m_sPort,___READ|___WRITE,0,上位机和单片机串口编程NULL,OPEN___G,FILE_FLAG___PED,NULL);在创建完串口后,最后进行句柄测试:if(m_hCom==___HANDLE_VALUE){AfxMessageBox(“打开串口失败!");return;}上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。
单片机与PC机串行通信系统硬件及上位机程序设计【精选】
![单片机与PC机串行通信系统硬件及上位机程序设计【精选】](https://img.taocdn.com/s3/m/076f1bd40d22590102020740be1e650e52eacfd6.png)
目录1 引言 (1)1.1 单片机与PC机串行通信研究背景 (1)1.2 单片机与PC机串行通信研究目的和意义 (1)2 串口通信基础 (1)2.1 两种常用接口方式 (2)2.1.1 并行接口 (2)2.1.2 串行接口 (2)2.2 RS-232串行接口标准 (2)3 系统总体设计 (3)3.1 系统指标设计 (3)3.1.1 通信协议设定 (3)3.1.2 系统实现描述 (3)3.2 总体方案设计 (3)4 硬件接口电路设计 (4)4.1 主要芯片 (4)4.1.1 AT89C51 (4)4.1.2 单电源转换芯片MAX232 (6)4.1.3 74LS245LED驱动芯片 (7)4.2 LED显示器 (7)4.2.1 LED显示器工作原理 (8)4.2.2 LED显示器接口 (8)4.3 系统设计 (8)5 PC机程序设计 (9)5.1 MSComm控件 (9)5.1.1 MSComm控件处理通信的方式 (9)5.1.2 MSComm控件的主要属性 (10)5.2 应用界面设计流程 (10)5.2.1 创建项目文件 (10)5.2.2 加入串口通信控件 (11)5.2.3 设计窗体界面 (12)5.3 代码实现 (12)6 仿真调试及结果分析 (15)7 结语 (17)参考文献 (18)致谢 (19)2.1 两种常用接口方式2.1.1 并行接口并行接口是指8位数据同时通过并行线进行传送,这样数据的传输率能得到极大的提高。
但在并行传输中,干扰会随线路长度的增加而增加,产生传输错误。
因此,并行传输主要应用在近距离数据传输中,如连接打印机端口。
并行接口主要使用36针接头和25针D形接头,目前以25针D形接头为主[4]。
2.1.2 串行接口串行口也是计算机的一种标准接口,PC机一般至少有两个串行口Com1和Com2。
串行口不同于并行口,它的数据和控制信息是一位接一位在一根传输线上传送的,这样串行口较并行口能够进行远距离传送信息。
上位机串口通信编程
![上位机串口通信编程](https://img.taocdn.com/s3/m/3eb7cc65f342336c1eb91a37f111f18583d00ce4.png)
上位机串⼝通信编程摘要本⽂主要描述了利⽤PC机与AT89C51单⽚机之间的通信程序设计实现温度显⽰。
并详述了在VC6.0环境下,上位机利⽤MSCOMM通信控件与单⽚机之间串⼝通信实现温度显⽰。
由单⽚机采集⼀个温度信号,将采集到的温度信号传送给PC机显⽰,PC机⽤VC6.0编写程序,单⽚机程序⽤C语⾔编写,最后⽤PROTUES软件进⾏仿真实现温度显⽰。
关键词:单⽚机MSCOMM控件VC6.0 AT89C51 温度显⽰⽬录摘要1 引⾔ (1)2 结构设计与⽅案选择 (2)2.1设计任务 (2)2.1.1单⽚机的选择 (2)2.1.2电平转换 (2)2.1.1单⽚机的选择 (2)2.1.3单⽚机与pc机通信原理 (2)2.2软件⽅案选择 (2)2.2.1 上位机编程⽅案选择 (3)2.2.2 单⽚机编程⽅案选择 (3)2.3 总体⽅案选择 (2)3 硬件设计 (8)3.1单⽚机主要特性 (5)3.2 MAX232电平芯⽚介绍10 (10)3.3 硬件电路设计图 (11)3.3.1 PC机与单⽚机通信接⼝电路设计框图 (11)3.3.2整体设计原理图 (11)4软件设计 (12)4.1上位机程序设计 (12)4.2下位机程序设计 (13)5 软硬件调试部分 (21)5.1 PROTEUS软件仿真 (21)5.1.1 Protues简介 (21)5.1.2 Protues仿真电路图 (22)5.2 VC软件仿真 (21)结束语 (27)致谢 (28)参考⽂献 (29)1引⾔随着⼈们⽣活⽔平的不断提⾼,单⽚机控制⽆疑是⼈们追求的⽬标之⼀,它所给⼈带来的⽅便也是不可否定的,要为现代⼈⼯作、科研、⽣活、提供更好的更⽅便的设施就需要从单⽚机技术⼊⼿,⼀切向着数字化控制,智能化控制⽅向发展。
现代化集中管理需要对现场数据进⾏统计、分析、制表、打印、绘图、报警等,同时,⼜要求对现场装置进⾏实时控制,完成各种规定操作,达到集中管理的⽬的。
基于单片机的PCI总线通信功能设计
![基于单片机的PCI总线通信功能设计](https://img.taocdn.com/s3/m/9d6883e8e87101f69f319519.png)
基于单片机的PCI总线通信功能设计————————————————————————————————作者:————————————————————————————————日期:郑州大学毕业设计(论文)题目:基于ARM的PCI总线通信功能设计指导教师:职称:学生姓名:学号:专业:院(系):完成时间:2011年5月25日年月日摘要本文详细介绍了基于AT91RM9200单片机的PCI总线通信功能的设计,包括硬件设计和软件设计两部分.通信功能的设计着重于单片机与上位机之间通过PCI总线进行的数据传送.本次设计在于用比较容易掌握的单片机来实现PCI控制器的功能,在PCI总线的简单运用场合,大大简化了设计的复杂程度。
设计的实现是利用单片机的I/O口与PCI 总线的控制信号线以及地址/数据信号线等直接相连,用对单片机的编程来控制数据的传输.文中介绍了PCI总线的基本概念,一些重要信号的定义,以及PCI总线事务的时序。
单片机部分介绍了型号的选择,选择了AT91RM9200单片机的理由和AT91RM9200单片机的基本知识.本次设计选择AM29LV160和57V561620作为AT91RM9200外接存储器。
设计的结果是成功的完成了原理图绘制和PCB版图的设计,和实验仿真。
关键词:PCI总线单片机AbstractThis paper introduces in detail the communication function design of the PCI bus based on AT91RM9200 MCU, including hardware design and software design。
Communication function design focuses on the data transfer between SCM and PC by PCI bus。
The design is to use MCU to realize the function of PCI controller,which is easier to master。
单片机上位机编程语言
![单片机上位机编程语言](https://img.taocdn.com/s3/m/e2ba0aabf9c75fbfc77da26925c52cc58bd690bd.png)
单片机上位机编程语言
在单片机与上位机之间进行通信和交互时,上位机编程语言通常使用高级语言来编写上位机软件。
以下是一些常用的上位机编程语言:
1.C/C++:C语言是一种常用的编程语言,C++则是对其进行
了扩展。
它们广泛应用于嵌入式系统开发,包括单片机与
上位机通信。
通过C/C++,可以编写出高效、可移植的上
位机软件。
2.Python:Python 是一种易学易用的脚本语言,非常适合快
速开发上位机应用。
它具有丰富的库和框架,可以用于串
口通信、数据处理和界面开发等方面,为单片机上位机编
程提供了很大的灵活性。
3.Java:Java 是一种广泛使用的高级编程语言,具有跨平台
性和丰富的库。
Java 可以用于上位机应用的开发,支持串
口通信、网络通信和图形界面的编程,具有良好的可扩展
性和可维护性。
除了上述常用的编程语言外,还有许多其他语言,如LabVIEW、Delphi、Qt等,都可以用于上位机开发。
选择合适的语言取决于项目需求、开发经验和个人喜好。
需要注意的是,上位机编程语言通常与单片机的通信协议(如串口、SPI、I2C等)保持一致,以确保单片机与上位机之间的正常数据交互。
利用上位机修改单片机点阵显示内容的程序
![利用上位机修改单片机点阵显示内容的程序](https://img.taocdn.com/s3/m/cbd58174b80d6c85ec3a87c24028915f814d845b.png)
利用上位机修改单片机点阵显示内容的程序一、引言在现代科技发展的今天,单片机已经成为了各行各业不可或缺的一部分。
单片机的应用范围非常广泛,其中点阵显示是单片机常见的应用之一。
而利用上位机修改单片机点阵显示内容的程序则是其中的一个重要应用,本文将深入探讨这一技术。
二、概述单片机点阵显示是一种常见的图形显示方式,通过控制单片机的输出引脚,可以实现对点阵的控制。
而利用上位机修改单片机点阵显示内容的程序,则是通过PC机与单片机进行通信,利用上位机软件对单片机点阵显示内容进行修改。
这一技术的应用范围非常广泛,可以用于LED广告屏、数字显示屏等。
三、技术原理1. 通信协议为了实现上位机与单片机的通信,需要选择合适的通信协议。
常见的通信协议包括串口通信、USB通信等。
在选择通信协议的还需要考虑通信速度、稳定性等因素。
2. 上位机程序设计上位机程序设计是利用上位机软件编写程序,实现对单片机点阵显示内容的修改。
在程序设计中,需要考虑界面友好性、稳定性、用户操作便捷等因素。
3. 单片机程序设计单片机程序设计是指在单片机上编写程序,实现与上位机的通信和对点阵的控制。
需要考虑通信协议的解析、指令的执行、数据的传输等。
四、实现步骤1. 确定通信协议根据具体的应用场景,选择合适的通信协议,例如串口通信、USB通信等。
2. 编写上位机程序利用上位机软件编写程序,实现与单片机的通信和点阵显示内容的修改。
3. 编写单片机程序在单片机上编写程序,实现与上位机的通信和对点阵的控制。
4. 调试测试进行整体系统的调试测试,检查通信稳定性、数据传输准确性等。
五、个人观点利用上位机修改单片机点阵显示内容的程序是一项非常有意义的技术,它可以大大提高生产效率和便利性。
在实际应用中,需要充分考虑通信稳定性、数据传输的准确性和用户操作的便捷性,以实现更好的用户体验和应用效果。
六、总结通过本文的介绍,我们了解了利用上位机修改单片机点阵显示内容的程序的技术原理和实现步骤。
基于单片机串口通信的上位机和下位机实践
![基于单片机串口通信的上位机和下位机实践](https://img.taocdn.com/s3/m/9d82889f4b73f242326c5fb2.png)
基于单片机串口通信的上位机和下位机实践标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]基于单片机串口通信的上位机和下位机实践串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
首先亮出C#的源程序吧。
主要界面:只是作为简单的运用,可以扩展的。
源代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Timers;namespace 单片机功能控制{public partial class Form1 : Form{public Form1(){InitializeComponent();}SerialPort sp = new SerialPort();private void button1_Click(object sender, EventArgs e) {String str1 = comboBox1.Text;//串口号String str2 = comboBox2.Text;//波特率String str3 = comboBox3.Text;//校验位String str4 = comboBox5.Text;//停止位String str5 = comboBox4.Text;//数据位Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型 Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型 groupBox3.Enabled = true;//LED控制界面变可选try{if (button1.Text == "打开串口"){if (str1 == null){MessageBox.Show("请先选择串口!", "Error"); return;}sp.Close();sp = new SerialPort();sp.PortName = comboBox1.Text;//串口编号sp.BaudRate = int2;//波特率switch (str4)//停止位{case "1":sp.StopBits = StopBits.One;break;case "1.5":sp.StopBits = StopBits.OnePointFive; break;case "2":sp.StopBits = StopBits.Two;break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}switch (str3){case "NONE":sp.Parity = Parity.None; break;case "ODD":sp.Parity = Parity.Odd; break;case "EVEN":sp.Parity = Parity.Even; break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}sp.DataBits = int5;//数据位sp.Parity = Parity.Even;//设置串口属性sp.Open();//打开串口button1.Text = "关闭串口";textBox1.Text = Convert.ToString(sp.PortName) + "已开启!"; }else{sp.Close();button1.Text = "打开串口";groupBox3.Enabled = false;//LED控制界面变灰色textBox1.Text = Convert.ToString(sp.PortName) + "已关闭!"; }}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void Form1_Load(object sender, EventArgs e) {//初始化textBox1.Text = "欢迎使用简易的串口助手!";groupBox3.Enabled = false;//LED控制界面变灰色 groupBox6.Enabled = false;groupBox7.Enabled = false;groupBox8.Enabled = false;button3.Enabled = false;button6.Enabled = false;timer1.Start();try{foreach (string com inSystem.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称boBox1.Items.Add(com);//默认设置comboBox1.SelectedIndex = 0;//选择第一个com口comboBox2.SelectedIndex = 4;//波特率4800comboBox3.SelectedIndex = 0;//校验位NONEcomboBox4.SelectedIndex = 0;//停止位为1comboBox5.SelectedIndex = 0;//数据位为8}catch{MessageBox.Show("找不到通讯端口!", "串口调试助手"); }}private void timer1_Tick(object sender, EventArgs e){label6.Text = DateTime.Now.ToString();}private void button2_Click(object sender, EventArgs e) {try {if (button2.Text == "开启"){groupBox6.Enabled = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;button3.Enabled = true;textBox2.Text = String.Empty; button2.Text = "关闭";}else{groupBox6.Enabled = false;button3.Enabled = false;button2.Text = "开启";textBox2.Text = String.Empty; }}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button3_Click(object sender, EventArgs e){groupBox6.Enabled = true;label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败,请选择发送的数据!");elsesp.WriteLine(textBox2.Text);//往串口写数据}private void checkBox1_CheckedChanged(object sender, EventArgs e){try {if (checkBox1.Checked){checkBox1.Checked = true; checkBox2.Checked = false; checkBox3.Checked = false; checkBox4.Checked = false; checkBox5.Checked = false; checkBox6.Checked = false; checkBox7.Checked = false; checkBox8.Checked = false; label7.Text = "准备发送"; textBox2.Text = "1";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox2_CheckedChanged(object sender, EventArgs e) {try {if (checkBox2.Checked){checkBox1.Checked = false;checkBox2.Checked = true;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "2";radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void checkBox3_CheckedChanged(object sender, EventArgs e) {try{if (checkBox3.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = true;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "3";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox4_CheckedChanged(object sender, EventArgs e) {try{if (checkBox4.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = true;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "4";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox5_CheckedChanged(object sender, EventArgs e) {try{if (checkBox5.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = true;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "5";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox6_CheckedChanged(object sender, EventArgs e) {try{if (checkBox6.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = true;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "6";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void checkBox7_CheckedChanged(object sender, EventArgs e) {try{if (checkBox7.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = true;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "7";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox8_CheckedChanged(object sender, EventArgs e) {try{if (checkBox8.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = true;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "8";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button5_Click(object sender, EventArgs e) {try{if (button5.Text == "开启"){radioButton1.Checked = false;radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;groupBox7.Enabled = true;button6.Enabled = true;textBox2.Text = String.Empty; button5.Text = "关闭";}else{groupBox7.Enabled = false;button6.Enabled = false;button5.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button6_Click(object sender, EventArgs e) {label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败。
51单片机与上位机通讯程序设置
![51单片机与上位机通讯程序设置](https://img.taocdn.com/s3/m/7fd41800ba1aa8114431d908.png)
51单片机与上位机实现串口通讯程序实例1. 发送:向总线上发命令2. 接收:从总线接收命令,并分析是地址还是数据。
3. 定时发送:从内存中取数并向主机发送.经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。
程序如下://这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的#include< reg51.h>#include< stdio.h>#include< string.h>#define INBUF_LEN 4 //数据长度unsigned char inbuf1[INBUF_LEN];unsigned char checksum,count3 , flag,temp,ch;bit read_flag=0;sbit cp=P1^1;sbit DIR=P1^2;int i;unsigned int xdata *RAMDATA; /*定义RAM地址指针*/unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;void init_serialcomm(void){SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收PCON=0x00;ES=1;TMOD=0x21; //定时器工作于方式2,自动装载方式TH0=(65536-1000)%256;TL0=(65536-1000)/256;TL1=0xfd;TH1=0xfd;ET0=1;TR0=1;TR1=1;// TI=0;EA=1;// TI=1;RAMDATA=0x1F45;}void serial () interrupt 4 using 3{if(RI){ RI=0;ch=SBUF;TI=1; //置SBUF空switch(ch){case 0x01 :printf("A"); TI=0;break;case 0x02 :printf("B"); TI=0;break;case 0x03 :printf("C"); TI=0;break;case 0x04 :printf("D"); TI=0;break;default :printf("fg"); TI=0;break;}}//向串口发送一个字符void timer0() interrupt 1 using 3{ // char i;flag++;TH0=0x00;TL0=0x00;if(flag==10){// cp=!cp;// for(i=0;i<6;i++)P2=0x25;TI=1;temp=*RAMDATA;printf("%c",temp);TI=0;// RAMDATA--;flag=0;}}//主程序main(){init_serialcomm(); //初始化串口//向6264中送数据{*RAMDATA=0x33;}while(1){*RAMDATA=0x33;;}}调试过程中遇到的问题:1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“akjdfaklfj”);函数直接发送即可。
单片机通讯协议(非常经典)
![单片机通讯协议(非常经典)](https://img.taocdn.com/s3/m/ed655879a417866fb84a8e51.png)
这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我 们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软 件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全 部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据 。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部 分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。
以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断 中进行。数据包的格式如下:
0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D
其中0x55,
0xAA,
0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据
} else if(state_machine == 10) {
if(0x0D == rcvdat) // 判断是否接收到帧尾结束符 {
retval = 0xaa; // 置标志,表示一个数据包接收到 } state_machine = 0; // 复位状态机 }
此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节 处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据 包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据 已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的 标志位来进行协议的解析处理。
基于汇编语言的MSP430单片机与上位机间串行通讯的实现
![基于汇编语言的MSP430单片机与上位机间串行通讯的实现](https://img.taocdn.com/s3/m/239206472b160b4e767fcfdd.png)
I p e e to ra m m u c to t e M S 3 m lm n fSe ilCo nia i n bewe n P4 0 SCM nd a
Up r M a h ne Ba e n s m b y La ua e pe c i s d o As e l ng g
0 引言
的连 接 图 , 图 1所 示 , 用 到 了 MC 的 U A T 如 只 U S R 0模 块 和 L C 35的第二路转 换模块 , 中, R i T 18 其 T 2n脚与 MC U的 U X 0 T D 引脚连接 , X ot 与 MC R 2u脚 U的 U X 0引脚 连接。为了控 制和 R D
监 视 串 口通 讯 的工 作 情 况 , L C 35的脚 外 接 了一 个 开 关 和 在 T 18
随着电子技术 和集成 电路 制造工艺 的飞速发展 , 来越多 越
的控制 系统采用 了单 片机作为控 制核心 J 。在这些 系统 中 , 单 片机往往作为下位机使用 , C机常作 为上位 机使用 , 了使上 P 为
下 位 机 间能 实 现 对 话 , 要 建 立 上 下 位 机 间 的通 讯 联 系 。 由于 需
与 上 位 机 间 的硬 件 连 接 , 定 义 的 通 讯 协 议 的 基 础 上 , 用 汇 编 语 言 开 发 出 了单 片机 与 上 位 机 间 串行 通 讯 的程 序 。 调 试 在 采 实验 表 明硬 件 设 计 与软 件 开发 达到 了预 期 的 功 能 要 求 。 关键词 : P 3 MS 4 0单 片机 ; 串行 通 讯 ; 汇编 语 言 ; 讯 协 议 通 中 图分 类 号 :P 7 . T 23 5 文 献 标 识码 : B 文 章 编 号 :0 2—14 ( 00 0 07 0 10 8 1 2 1 )6— 0 5— 2
S7-400系列PLC与上位机通信的实现
![S7-400系列PLC与上位机通信的实现](https://img.taocdn.com/s3/m/2c9e6c0de87101f69e3195e3.png)
维普资讯
经验交流
资源较 为丰富 ,本设计采用液 晶显示模块 与单 片机直接接 口的方 式。
仪器仪表用户
茧
图4 主程序流程图
进行设计。
5 结 束语
在对 电路软硬件进行设计后 ,经过精心的仿真调试 ,整个系统 运行 良好,可 以正确显示相应信息,实现了人机对话,给上位 D P S 主控脉冲 电源的正确可靠运行打下 了基础。同样.此 电路设计思路 也可 以应用到其他的显示模块接 1设计和应用系统中。此外,本设 2 1 计扩展 的双 口R M 接 口与上位 D P进行数据通 讯被证 明是一种 A S 很好 的解决方法,能在很大程度 上提高数据传输速度和可靠性 本 文系统设计简洁 实用,希望 能对其他 类似 设计起到 一定的参考作
i t i. n de al
K y wo d :Pr Da e PC:0 e rs O v : c mm u i a i u c i n nc l 0n f n t s o
匣 终筮銮逾
一
Hale Waihona Puke 1 引 言 S MA I 740 系列 P C是 西门子公司生产的用 于中、高 I T C S —0 L 档性能范围的可编程控制器 。该系列产品采用模块化及无风扇 的设 计,坚 固耐用。具有容易扩 展和广泛的通讯能 力,易于实现的分布 式结构 以及用户友好的操作等特点,这些都使得 SMA I 74 O I T C S— O 成为中、高档件能控 制领域 中首选 的理想解决方案 。 { 对于大多数控制系统 来说,仅仅实现控制是不够的,在许 多 日 情况下 也需要组态监控界面对系统进行监控。通过监控可 以增加人 机交瓦的能力,使操作人员实时地监控系统工作情况井使系统操作 变 得 办 便 。在 两 r 子 工 控 系 统 中 , 通 常 口 以采 用 组 态 软件 J 丁 Wi C 、 Po ol 以及 Po ae 几种方法 米实现 P C 与上 n C rT o 、 rD v 等 L
c++ builder实现模拟器测控系统单片机与上位机之间的串口通汛
![c++ builder实现模拟器测控系统单片机与上位机之间的串口通汛](https://img.taocdn.com/s3/m/785f990b03d8ce2f006623e5.png)
髦塑釜凰C ++B ui l der 实现模拟器测控系统单片机与L 位机之间的串口通汛底(石家庄宝石电子集团,伟河北石家庄050035)[}商要]由于各种类型模拟器的研制和推广,作为模拟器测控平台的模拟器测控系统,就显得越来越重要模拟器测控系统作为与各类模拟器配套的测控平台。
实现了对开关量、模拟量的测量,实现了对指示灯、数码管、电压仪表、电机权袁和彩屏仪表的控制。
饫键词]串行通讯;B or l andC ++B uil der (B C B );W i nA PI由于各种类型模拟器的研制和推广,作为模拟器测控平台的模拟器测控系统,就显得越来越重要。
模拟器测控系统作为与各类模拟器配套的测控平台,实现了对开关量、模拟量的测量,实现了对指示灯、数码管、电压仪表、电机仪表和彩屏仪表的控制。
为了实现工控机和外围数据源设备通讯的问题,因计算机和单片机(如M C S 一51)都具有串行通讯口,可以设计相应的串行口通讯程序,完成二者之间的数据通讯任务,在模拟器测控系统中利用串行通讯从而使上位机以图形方式反映模拟开关的位置、指示灯状态和各仪表信息。
1串行通讯的基本原理串行端口的本质功能作为CP U 和串行设备建的编码转换器。
当数据从CP U 经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
在W i ndow s 环境下,串口是系统资源的一部分。
应用程序要使用串口进行通讯,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
串口通行程序的流程如图1:图1串u 通{,f 丁J ≠的流程|{葺j2串口通信在模拟器测控系统中的应用测控系统采用上下位机结构,其结构图如图3所示。
各测控模块相对独立,每个模块内嵌单片机,可自主完成测量、控制和通讯功能。
各测控模块以单片机为核心,分别完成信号的测量和对各种设备的控制,并通过R S232C 串行总线与上位机通讯。
串口通信协议制定
![串口通信协议制定](https://img.taocdn.com/s3/m/daa4afecd4bbfd0a79563c1ec5da50e2524dd1c0.png)
串口通信协议制定篇一:单片机与上位机通信协议的制定单片机与上位机通信协议的制定单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。
下行协议,即由上位机向单片机发送数据。
而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议!下行协议由四个字节构成上表是简单的上位机对单片机的控制指令下述函数是C#中封装的串口通信类中的发送函数的封装public void SerSendCommu(byte orderDef, byte data)//参数1为命令字,参数二为要发送的数//据,需要时可直接调用{Byte[] BSendTemp = new Byte[SEND_LENTH];BSendTemp[0] = PRE;BSendTemp[1] = orderDef; BSendTemp[2] = data; BSendTemp[3] = END;this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);}下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断 ISR(USART_RXC_vect)//串口接收中断 {unsigned char status,data;status = UCSRA; //**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的//值即会改变** data = UDR;if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接收指令 {if((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0){rx_buffer[rx_counter]=data; rx_counter++;switch(rx_counter) {case 1:if(data!=USART_BEGIN_STX)rx_counter=0;break; case 4:rx_counter=0;if(data==USART_END_STX) Uart_RecvFlag=1; break; }} }}在单片机主循环程序的最前部分进行指令译码if(Uart_RecvFlag)//接收到命令{switch(rx_buffer[1]) {case 0xAA://单片机状态命令控制;ucWorkStatue=rx_buffer[2];//指令数据 break;case 0xDD://PWM值修改指令 OCR2=rx_buffer[2];break;case 0xFF://初始温度设定 break; }Uart_RecvFlag=0;}//随后进行执行指令switch(ucWorkStatue){case 1://空闲模式 break;case 2://测量模式,但不输出 break;case 3://测量模式,由串口输出break;case 4://PWM输出测试break; default:break;}这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;//串口发送缓冲区变量声明volatile unsigned char tx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区 volatile unsigned chartx_wr_index=0,tx_rd_index=0,tx_counter=0;//rx_wr_index 写指针,rx_rd_index读指针,rx_counter缓冲区数据个数//USART发送函数void USART_Transmit(unsigned char data)//发送数据函数{while(tx_counter==TX_BUFFER_SIZE);//输出缓冲区满,等待asm("cli");if(tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0)) {tx_buffer[tx_wr_index]=data;if(++tx_wr_index==TX_BUFFER_SIZE) tx_wr_index=0;++tx_counter;}elseUDR = data;asm("sei");}//发送中断服务程序ISR(USART_TXC_vect)//USART发送数据中断 {if(tx_counter) {--tx_counter;UDR=tx_buffer[tx_rd_index];if(++tx_rd_index==TX_BUFFER_SIZE){tx_rd_index=0;} } }在C#编写的上位机中,利用串口接收事件响应方法定义serialPort1.ReceivedBytesThreshold = RECEIVE_LENTH;在时间响应事件中调用协议分析处理函数serialPortCaculate()来分析协议private voidserialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){bel_dispzedNum.Invoke(newMethodInvoker(delegate { //匿名方法 int inNumSData=0;try {inNumSData = this.serialPort1.BytesToRead;b_serial_bufin_diplay.Text =inNumSData.ToString();//串行数据处理 //图像显示byte dataID = 0x00;double temp = this.serialPortCaculate(ref dataID);switch(dataID) {case TEMVAL:break; default:this.serialPort1.DiscardInBuffer()break; }} catch { }}));}///////接收转换协议,接收数据时直接调用private double serialPortCaculate(ref byte dataID){Byte[] BReceiveTemp = new Byte[RECEIVE_LENTH];for (int i = 0; i < RECEIVE_LENTH; i++)//接收定长数据字符串{BReceiveTemp[i] =Convert.ToByte(this.serialPort1.ReadByte());篇二:RS232串口通信协议RS-232串口通信协议RS-232是个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.注册MSComm控件
众所周知,C++Builder本身并不提供串行通讯控件MSComm,但我们却可以通过注册后直接使用它。
启动C++Builder5.0后,然后选择C++Builder主菜单中的Component菜单项,单击Import Active Control命令,弹出Import Active窗口,选择Microsoft Comm Control6.0,再选择Install按钮执行安装命令,系统将自动进行编译,编译完成后即完成MSComm控件在C++Builder中的注册,系统默认安装在控件板的Active页,接下来我们就可以像使用C++Builder本身提供的控件那样使用新注册的MSComm控件了。
(前提条件是你的机子上安装了Visual Basic,或者有它的库)
2.具体实现
新建一个工程Project1,把注册好的MSComm控件加入到窗体中,然后再加入5个ComboBox用来设置串口的属性,4个Button分别用来"打开串口" "关闭串口""发送数据""保存数据" ,2个Memo控件分别用来显示接收到的数据和发送的数据。
再加入一个Shape控件用来标明串口是否打开。
ComboBox1用来设置串口号,通过它的Items属性设置1,2,3,4四个列表项分别表示COM1,COM2,COM3,COM4口。
ComboBox2用来设置波特率,ComboBox3用来设置奇偶校验位,ComboBox4用来设置数据位,ComboBox5用来设置停止位。
他们的缺省值分别是9600,n,8,1。
Button1用来打开串口,Button2用来关闭串口,Button3用来发送数据,Button4用来保存数据。
Memo1用来显示发送的数据,Memo2显示接收的数据。
Shape1的Shape属性设置为stCircle。
下面给出部分源码:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
if(MSComm1->PortOpen==true)
{
Button1->Enabled=false;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=true;
Shape1->Brush->Color=clGreen;
}
else
{
Button2->Enabled=true;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=false;
Shape1->Brush->Color=clRed;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender) / /打开串口
if(MSComm1->PortOpen!=true)
{
MSComm1->CommPort=StrToInt(ComboBox1->Text);//选择串口号
MSComm1->Settings=
ComboBox2->Text+","+
ComboBox3->Text+","+
ComboBox4->Text+","+
ComboBox5->Text; file://设置串口的属性波特率、奇偶校验、数据位和、//停止位。
MSComm1->InputMode=0;//设置传入数据的格式,0表示文本形式
MSComm1->PortOpen=true;//打开串口
Button1->Enabled=false;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=true;
Shape1->Brush->Color=clGreen;
}
}
void __fastcall TForm1::Button2Click(TObject *Sender) / /关闭串口
if(MSComm1->PortOpen!=false)
{
MSComm1->PortOpen=false;
Button1->Enabled=true;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=false;
Shape1->Brush->Color=clRed;
}
else
{
Button1->Enabled=false;
Button2->Enabled=true;
Shape1->Brush->Color=clRed;
}
}
MSComm控件的Input和Output属性在Object Inspector中是看不到的,而且在C++Builder环境下这两个属性已不在是VB、VC中的原类型,而是OleVariant
类型,也就是Ole万能变量,这就需要我们在发送接收数据时要把数据转换成Ole 类型。
void __fastcall TForm1::Button3Click(TObject *Sender) file://发送Memo2中的数据
{
MSComm1->Output=StringToOleStr(Memo2->Text); file://把AnsiString型转化成//Ole形式。
}
通过OnComm事件接收数据,必须把MSComm的RThreshold属性设置为大于0,只有这样在接收到字符时才会产生一个OnComm事件。
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
AnsiString str; file://声明一个AnsiString类型的变量
OleVariant s; file://声明一个用于接收数据的OleVariant变量。
if(MSComm1->CommEvent==comEvReceive)
// 接收缓冲区中是否收到Rthreshold个字符。
{
if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出
{
s=MSComm1->Input;//接收数据
str=s.AsType(varString); file://把接收到的OleVariant变量转换成AnsiString类型Memo1->Text=Memo1->Text+str;//把接收到的数据显示在Memo1中。
}
}
}
要保存数据应该再加入一个SaveDialog模块
void __fastcall TForm1::Button4Click(TObject *Sender)
file://把Memo1中的数据保存在指定的文件中
{
AnsiString filename1;
SaveDialog1->Filter="Text files (*.txt)|*.txt|All files (*.*)|*.*";//文件类型过滤器SaveDialog1->FilterIndex=2;
if(SaveDialog1->Execute())
{
filename1=SaveDialog1->FileName;
Memo1->Lines->SaveToFile(filename1);//把收到的数据保存在文件filename1中}
}
四、结束语
上面给出了C++ Builder中利用MSComm控件进行串行通信编程的实现和部分源码,有了上面的参照读者可以根据实际需要编写出具有发送文件和接收文件功能的程序。