用VC 写上位机软件实现跟单片机通信

合集下载

上位机与单片机之间的通讯

上位机与单片机之间的通讯

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://设置串口的属性波特率、奇偶校验、数据位和、//停止位。

如何实现VC应用程序与PLC的数据交换

如何实现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++和MFC的上位机与PLC的通讯系统

基于VC++和MFC的上位机与PLC的通讯系统

要:本文介绍了用VC++和MFC开发的上位机和PLC的通讯系统,给出了系统的通讯原理和系统的软件设计方法。

实践证明整个系统运行稳定,实用性和可扩展性强。

关键词:PLC;VC++;MFC;通讯模式1 概述PLC(Programmable Logic Controller)作为新一代工业控制器,以其高性能价格比在工业测控系统中获得了广泛应用。

随着微电子及控制技术的不断发展,PLC已逐渐成为一种智能型、综合型控制器,由PLC 构成的集散控制是现代工业控制的一个重要组成部分。

在众多的小型集散控制系统中,若使用专业工控组态软件,如INTOUCH、FIX等,制作上位机的监控界面,而以专用的PLC通信接口模块以及其厂家推荐的DDE Server作为联系上位机和PLC的桥梁,则成本较高、投资较大。

所以上位机直接与PLC的通讯是一种很好的技术方案。

在Windows环境下开发与工业PLC通讯,可以利用C并借助Windows SDK提供的应用程序接口函数来完成软件的设计,但这样开发的程序很复杂;也可以利用Visual Basic提供的通讯控件来开发串行通讯程序,程序的编制十分简单,但在现实中,许多大的应用系统都是基于VC++平台开发的,VC++是现今最复杂、但也是最强大的一种Windows应用程序开发工程软件。

它在图形处理和数据库管理等方面具有较强的优势,并且用它来实现底层的通讯控制有着更快的效率,使用MFC设计的界面与Visual Basic设计的界面一样简练。

因此我们利用VC++6.0提供的通讯控件MSComm,以MFC来设计界面编制程序,构造与PLC的通讯系统。

系统中的PLC为西门子公司的S7-200系列CPU226型。

2 系统的通讯原理西门子S7-226型PLC是一种模块化结构的小型PLC,具有较高的性能价格比,它带有两个RS485通讯口,而上位机即工控机的串行口是RS232,所以采用西门子公司专用的PC/PPI编程电缆作为上下位机的连接电缆,它实现了RS232和RS485的转换,并且具有隔离抗干扰功能。

基于VC++6.0的PC机和单片机的接口设计

基于VC++6.0的PC机和单片机的接口设计
摘要 : 于 3 基 2住 W id ws 作 系统 的 P 机 和 单 片机 间 的 串行 通 信 是 一 种 常 见 的 通 信 方 式 。P 机 与 多单 片机 结合 的 测控 系统 越 no 操 C C
来越 占主 导地 位 。 如何 更好 的在 W id w 平 台下 实 现 P 机 与单 片机 的通 信 设 计 , 为测 控 系统 中一 个 关 键技 术 问 题 。 为此 . 细 阐 述 no s c 成 详 了两 种 程 序 设 计 的 方 法 。 即 , V + . 在 C+ 6 0中使 用 W id wsP 函数 编 写程 序 和 使 用 vc +自带 的 Mi oot m nct n C nrl no A I + c sfCo mu i i s o t 控 r ao o
t eho n d ti f rho O dein omm u c ton pr g a . Th ti.s h ndo s WO m t dsi ealo w t s g c nia i o rm a su e t e wi w APIfnc on t r rm t u t O p og a w h VC ++6 0 orus he i i et
( ia c n lg a Unv rc, a 1 0 2 ia x ’nt h oo i ie i, e c l S、 Xi n7 0 3 . n ) Ch
Ab t c : r lc mm u i a o f C n CM a e n o ea n y tm f3 i i ak n ff i a o r s o d n d . i i mo e sr tsi o a ea nct no i P adS b sdo p rt gss i e o 2 b t s i d o  ̄z ir c re p n ig mo e t s l r

[转载]c语言实现单片机的tcpip通信

[转载]c语言实现单片机的tcpip通信

[转载]c语⾔实现单⽚机的tcpip通信repost原⽂地址:c语⾔实现单⽚机的tcp/ip通信作者:谢绝关注#include "system.h"#include "tcpip.h"#include "drivers.h"// 定义应⽤:1 表⽰开启功能,0 表⽰关闭功能#define cTCP_RS232 1 // TCP <-> RS232 的应⽤,只⽤于服务模式#define cTCP_ADAC 1 // TCP <-> Audio, 主要⽤于服务,也可以⽤于客户。

要求⾼带宽: > 912Kbit// 分配本地⽤户⾃定义服务模式应⽤TCP端⼝号,不能与知名端⼝相同!如:23, 80// 注意:对不同的TCP事件使⽤不同的本地端⼝号,有助于快速查找TCP事件⽽不需要判断IP是否相同!// 这样做能使本地快速响应。

#define cTCP_ListenPort_TEST 0x1000 // 4096#if cTCP_RS232 == 1#define cTCP_ListenPort_RS232 0x2000 // 8192#endif#if cTCP_ADAC == 0#define cTCP_ListenPort_ADAC 0x3000 // 12288#endif// 客户应⽤模式的本地TCP端⼝号。

不能与知名端⼝相同!如:23, 80// 注意:对不同的TCP事件使⽤不同的本地端⼝号(包括:本地侦听端⼝),有助于快速查找TCP事件⽽// 不需要判断IP是否相同!这样做能使本地快速响应。

#if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1)#define cTCP_ActivePort_ADAC 0x3001 // 12289#endif// 分配系统应⽤临时缓冲区(按 wrod 存储)UINT16 guwAppBuf[cAppSizeMax];//--------------------------------------------------------------------------------------main(){#if TCP_ACTIVE_OPEN == 1UINT16 temp[2];#endif// 1. Hardware initialize: SPCE061ASP_IO_INIT();// 2. Open and Enable Hardware interrupt 2Hz and Clear WatchDog!SP_OpenTime2();// 3. Hardware initialize: RTL8019ASRTL8019AS_RESET();RTL8019AS_INIT();// 4. vIP4 TCP/IP initializemsip_Init();// 5. We listen test portmsip_Listen(cTCP_ListenPort_TEST); // ⽤于侦听来⾃链路测试的TCP包#if cTCP_RS232 == 1SP_UART_INIT(C_UART_Baud_115200); // Hardware initialize: UART of SPCE061Amsip_Listen(cTCP_ListenPort_RS232); // ⽤于侦听来⾃RS232的TCP包#endif#if cTCP_ADAC == 1// SP_ADAC_INIT(cSample_4096); // Open ADAC// SP_ADAC_INIT(cSample_8192); // Open ADAC// SP_ADAC_INIT(cSample_16384); // Open ADAC// SP_ADAC_INIT(cSample_32768); // Open ADAC// SP_CLOSE_FIQ(); // 关闭FIQ中断,同时也禁⽌了ADACmsip_Listen(cTCP_ListenPort_ADAC); // ⽤于侦听来⾃远端的Audio的TCP包#endif#if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1)// for test audio, wo active link remote: 192.168.0.60temp[0] = ((192<<8)|168);temp[1] = ((0<<8)|30);msip_Connect(cTCP_ActivePort_ADAC, temp, cTCP_ListenPort_ADAC);#endif// 6. We do TCP/IP Check Looploop:// 接收新的以太包,并处理if ((guwEthLen = ether_Receive()) != 0){switch (cptEthHdrBuf->EthType){case cEthType_Arp:msip_Arp_In();break;case cEthType_Ip:msip_Input();}}// ARP表⽼化处理if (guwMsg_Route & cM_ARP_TIME){msip_Arp_Time();}// TCP事件轮询if (guwMsg_Route & cM_TCP_PERIODIC){msip_Periodic();}goto loop;}// SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB//--------------------------------------------------------------------------------------//// |--------------| |-----|----------|------| |------|--------|// |⼯业设备|RS232| <---> |RS232|核⼼嵌⼊板|TCP/IP| <---> |TCP/IP|普通PC机|// |--------------| |-----|----------|------| |------|--------|////-------------------------------------------------------------------------------------void userapp(){switch (gptConn->LocalPort){#if cTCP_RS232 == 1case cTCP_ListenPort_RS232:goto link_rs232;#endif#if cTCP_ADAC == 1 // ADAC ⼯作时:由于双向通讯,所以Listen和Active处理是⼀样的!case cTCP_ListenPort_ADAC:goto link_adac_listen;#endif#if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1) // ADAC ⼯作时:由于双向通讯,所以Listen和Active处理是⼀样的!case cTCP_ActivePort_ADAC:goto link_adac_active;#endifcase cTCP_ListenPort_TEST:goto test_net;default:return;}#if cTCP_RS232 == 1link_rs232: // 与RS232透明传输通讯:本系统的⼀个应⽤。

上位机串口通信编程

上位机串口通信编程

上位机串⼝通信编程摘要本⽂主要描述了利⽤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引⾔随着⼈们⽣活⽔平的不断提⾼,单⽚机控制⽆疑是⼈们追求的⽬标之⼀,它所给⼈带来的⽅便也是不可否定的,要为现代⼈⼯作、科研、⽣活、提供更好的更⽅便的设施就需要从单⽚机技术⼊⼿,⼀切向着数字化控制,智能化控制⽅向发展。

现代化集中管理需要对现场数据进⾏统计、分析、制表、打印、绘图、报警等,同时,⼜要求对现场装置进⾏实时控制,完成各种规定操作,达到集中管理的⽬的。

单片机上位机编程语言

单片机上位机编程语言

单片机上位机编程语言
在单片机与上位机之间进行通信和交互时,上位机编程语言通常使用高级语言来编写上位机软件。

以下是一些常用的上位机编程语言:
1.C/C++:C语言是一种常用的编程语言,C++则是对其进行
了扩展。

它们广泛应用于嵌入式系统开发,包括单片机与
上位机通信。

通过C/C++,可以编写出高效、可移植的上
位机软件。

2.Python:Python 是一种易学易用的脚本语言,非常适合快
速开发上位机应用。

它具有丰富的库和框架,可以用于串
口通信、数据处理和界面开发等方面,为单片机上位机编
程提供了很大的灵活性。

3.Java:Java 是一种广泛使用的高级编程语言,具有跨平台
性和丰富的库。

Java 可以用于上位机应用的开发,支持串
口通信、网络通信和图形界面的编程,具有良好的可扩展
性和可维护性。

除了上述常用的编程语言外,还有许多其他语言,如LabVIEW、Delphi、Qt等,都可以用于上位机开发。

选择合适的语言取决于项目需求、开发经验和个人喜好。

需要注意的是,上位机编程语言通常与单片机的通信协议(如串口、SPI、I2C等)保持一致,以确保单片机与上位机之间的正常数据交互。

基于VC++的上位机与PLC的通讯

基于VC++的上位机与PLC的通讯

万方数据 万方数据24)。

RcvTBL。

PORT激活初始化或结束接收信息的服务。

通过指定端口(PORT)接收的信息存储于数据缓冲区(TBL)。

RcV缓冲区的格式如图2所示。

数据缓冲区的第一个数据指明了接收的字节数。

下面是部分程序,//端口初始化图2Rcv缓冲区格式MOVB16#09.SMBl30/,选定串口l,初始化自由口,选择9600波特率,8位数据位,无校验MOvB16#B0,SMBl87,/初始化Rcv信息控制信息MOVB42,sMBl89溅信息结束信息为42(…)MOVB10,sMBl94,,没定最大字符数为10ATcHINT_l,24/,接收完成事件接到中断lENI//允许用户中断RcvvBlOO,1//端口1的接收信箱缓冲区指向vBl00臌£理接收数据的中断程序lLDSMO.OMOVW+O.VW200MOVW+O.VW202BTIvBl03,vw202胛B103为高6位数字量MOVW+64.VW200}IVW202.VW200B.ⅡvBl04,vw202脚B104为低6位数字量+IVW202.VW200M0vwvw200,vwl00,/结果存vwloo单元CRErI’I,,中断返回4结论本文利用vc++6.0开发了的串口通讯程序。

充分利用了PLc和上位机本身资源的优势实现二者的通信。

上述方法和程序已经成功地应用于某冶炼厂的锌精馏过程锌液流量计算机控制系统中,实际运行情况表明,这种通信方法简单、稳定、可靠,到达了预期的效果。

参考文献[1]Joecampbeu.串行通信c程序员指南[M】.北京:清华大学社出版社.1995.f2]樊昌信等.通信原理p川.北京:国防工业出版社,1995.【3】王华,叶爱亮,祁立学,曹凌云.Ⅵsualc++6.o编程实例与技巧[M].北京:机械工业出版社,1999.第一作者简介:李建军,男,1968年生,衡阳人,工学硕士,副教授。

研究领域:电力电子、电子测量、高等教育病理学。

VC++MSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。

具体步骤如下:一.建立应用程序工程“串口通信_韩季方01”1.打开VC++6.0-》建立对话框MFC应用程序:串口通信_韩季方01—》添加基本控件如图1。

0.图1。

02.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6。

0"控件—》点击“Insert”—》提示“…”确认即可-》弹出图1.3—》点击“OK”—》再点击“Close”。

下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。

图1。

1 图1。

2图1.3图1.4 3。

编辑控件及其属性设置:如表1。

0控件控件ID Caption 需要添加的变量及变量类型静态文本IDC_STATIC 接收显示静态文本IDC_STATIC 发送输入编辑框IDC_EDIT_RXDATA m_strEditRXDataValue CString编辑框IDC_EDIT_TXDATA m_strEditTXDataValue CString 按键IDC_BUTTON_MANUALSEND 发送IDC_MSCOMM1 m_ctrlcomm control MSComm控件表1.04。

添加变量及其类型方法如图1.5图1.5二.初始化串口:设置MSComm控件属性打开Class Wizard—》Member Variables-》选IDC_MSCOMM1-》点击“Add Varialbe…"—》添加变量m_ctrlComm。

如图1。

5。

之后,在工作空间打开文件如图2。

0—》在函数OnInitDialog中添加代码如图2.1.图2.0图2。

STM32开发--VisualStudioC++编写串口上位机

STM32开发--VisualStudioC++编写串口上位机

STM32开发--VisualStudioC++编写串⼝上位机
打算使⽤Visual Studio编写⼀个串⼝上位机程序,然后进⾏测试。

原来的上位机各种BUG,受不了了。

⾃⼰写⼀个得了。

⼀、创建 MFC ⼯程
选择MFC应⽤:
应⽤程序类型选择 基于对话框:
⽣成效果:
⼆、设置控件
找到“⼯具箱”,就可以将相应的控件拖拽⾄应⽤程序对话框中
常⽤控件有: Button, Edit Control, Static Text,Group Box,Combo Box等。

最后简单的上位机界⾯如下:
三、⽰例
花了两天时间,做了个半成品。

发送数据,没能输⼊。

接收数据,没有滑轮可以上下滑动。

是否选择⼗六进制没有、保存窗⼝没有。

没时间懒得弄了,之后⼜需要再做开发。

⽰例下载:
参看:
参看:。

最详细的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,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。

3、删除确认、取消和提示框,添加“电话”、进程、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局。

基于VC++6.0的PC机与多台单片机的串行通信

基于VC++6.0的PC机与多台单片机的串行通信
高, 在许 多场台 采 用单机控制 已不 能满足现 场要 求 , 因而必须 采 用多机 控制 的形式 。串行通信 作 为计算 机之 间常用 的通信方 法之 一 , 由于其 通信编 程 灵活 、 硬 件简洁 并遵循 统 一的标 准 , 在工业 控 制 领域 得 而 到 了广 泛 的应 用 。 U 0 S现 己成为 当今 计算 机操 widW
西北 农林科技大学学报 ( 自然科 学版)
V 1ON . o 3 o2 .
Ap . 2 0 r 02
基于 V C+ +6 0的 P . C机 与 多 台单 片 机 的 串行 通 信
宋 向荣 , 韩克敏 , 陈梦华
( 西北 农 林 科 技大 学 水 利 与 建筑 工 程 学 院 , 西 橱 陵 7 Z 0 ) 陕 1 1 0

端加 MA 3 x22以实现 TT 电平和 R 一3 L S 22电平 之 问的转换 。 下位 机要实 时检测 和控制 被控对象 , 随 并 时向上位 机 传送 数据 , 又不 断从 上位 机 接 收新 的指 令, 以完成 上位机 发送给 它 的命 令。 上位 机既要 从下 位机 取得数据 , 进行数据 分析 汇总处理 , 又要 向下位
2 多机通信原理[ 】 ]
上 位机 发 送信 息 可被 各 下 位机 接 收 , 下位 机 而 只能对 上位 机发送 信息 , 下位 机 问不能 直接 通信 。 各 下位 机 系统 由初始 化程 序 将 串行 口设 置 成工作方 式 3S 一1RE ,M , N一1处于 接 受状 态 。当 上位机 和某 ,
[ 关键词] 多机 串行通信 ; 通信协议 ; Vc+十60 MS o m 控件 .; C m [ 中图分类号] T 2 3 5 P 7 . [ 文献标 识码 ] A [ 文章编 号] 002 8 (0 2 0 ~1 3o 1 0- 7 2 20 )20 2一4

基于VC6.0的多台MSP430单片机和PC机串口通讯实现方案

基于VC6.0的多台MSP430单片机和PC机串口通讯实现方案

中 , 定 一 个 明确 而合 理 的通 讯 协 由于 单 片 机 多 应 用 于 实 时 性 较 强 的 确 议 是关 键 , 括 对 数 据格 式 、 讯 方 控 制 场 合 , 此 , 应 将 及 时 响 应 和 包 通 因 式、 传送 速 度 、 送 步 骤 、 纠 错 方 控 制对 象 的动 作 放 在 优 先 考 虑 的位 传 检
波特 率 为 9 0 , 部 时钟 为 A L 。 60外 C K
软侔 计
下位机 程序设计
主要 由数据发送和数据接 收子 程 序 组 成 设 计 单 片机 通 信 程序
系统通讯协议
在 P 机 和 多 台 单 片 机 的 通 讯 时 ,必 须 充 分 发 挥 单 片 机 的效 率 。 C
率 的整数倍, 这一组 合也能使 MS 4 0 P 机 发 送 单 片 机 接 收 的 时候 也 相 P 3 C 正常 工 作 而且 还可 以使 其 通 讯 协 议 似 的协 议 规 定 。
工作在最大 的波特 率 。 采用这 一技
术 ,即使用 手表晶振 ( 7 8 z, 3 6 H ) 波 2 特率也可 以达到 4 D 和 9 0 , 80 6 0 选择
维普资讯 http://www.cqvቤተ መጻሕፍቲ ባይዱ
Di &pi¨s设计应用 e n Apc n s g lr c。
基于V 6 的多台M 3 单片机和 C. 0 40 S P P C机串口 通讯实现方案
S r l ei a Com m u i a i e h d B t e C d M S 4 0 nc t onM t o e we n P an P 3
MS 4 0 19单 片机支 持 两种 不 P 3F6
代码 效率 。 数字控 制 的振 荡器 提供 快 同的 串行协议 , 通用 同步 协议 ( S T U AR 速从所有低 功耗模式 苏醒 到活动模式 协 议 ) 同 步 协 议 ( P 协议 ) 用 控 和 SI , 的能 力时 间少 于 6 。 P 3 F6 msMS 4 0 19带 制寄存器 U T 表 1 C L( )中的控 制位 有两个 1 定时器 ( 6位 带看 门狗功 能 ) S N 来 选 择所 需 的模 式 。Y C O 、 YC SN = :

基于VC的PC机与单片机无线串行通信的实现

基于VC的PC机与单片机无线串行通信的实现

据 为 无 线 发 送 数 据 此 端 应 置 为 逻辑 “ ” 1。 当上 位 机 串 口 无 数 据 发 出 时 , T D R端 的 功 能 为 指 示 上 位 机 是 否 可 以 接 收 计算 机 的 数 据 : 上 位 机 准 备 好 接 收 模 块 的 数 据 时 此 当
端 为 逻 辑 “ ” 当 上 位 机 不 能 接 收模 块 的 数据 时此 端 为 逻 辑 “” 0, 1。
端 5 G D) 地 (N :
端 6 R D)模 块 外 部 红 色指 示灯 驱动 (E : 端 7 GR E N)模 块 外 部 绿 色 指示 灯 驱 动 ( EE :
端 8 G D) 地 (N :
2无线 通信 模块 及 其连 接
本 设 计 采 用 无 线 通 信 模 块 来 实 现无 线 数 据 传 输 , 品 为 北 京 产 捷 麦 通 信 器 材 公 司 生 产 的 F 1 M, 采 用 F K 调 制 方 式 , 信 距 2D 它 s 通 离 1 M, 口为 r K 接 r L电平 , 以直 接 和 单 片 机 的 异 步 通 信 口连 接 。 可
(. fr t nSi c n etnt t o b i iesyo i c dT cn lg , i h ag0 0 5 ,hn;,otrdaeI i t 1 n mao c n eadp c Ist e f Io i e i Hee Un rt f S e ea eh oo y a u n 50 4C ia P s aut mtue u v i cn n s z 2 g t
c t n h w o n a e u e o o a o o t lk fc mmu i a o o t l n at S mm e l e t eP a d o e h p c mp t r i s n c t n c n r l g p r M Co i oi o t r a z C n —c i o u e . i h n

用VB编写上位机实例

用VB编写上位机实例

标签:无标签VB编写上位机实例用VB编写上位机实例16:14:22 UTC+0800Sun Apr 1 2007用编写第一个串口通信上位机程序Visual 是一个可视化窗口环境的编程软件,目前使用Visual 可以快速简单编写单片机中的串口通信上位机程序。

下面我们以一个完整的通信试验为例子完成如何用Visual 编写单片机串口通信程序。

打开安装好后的Visual 主程序界面。

选择“标准EXE”。

如图1显示,建立Visual Basic的编程环境。

图1在菜单的[工程]选项中选择[部件],如图2。

把Visual Basic的串口通信控件Microsoft Comm control 调入工作菜单。

图2在打开[部件]对话框中,选择Microsoft Comm control 的选项框,点击[确定]。

图3图3可以在图示3中可以看通信控件Microsoft Comm control 的文件是在C:\WINNT\system32\文件。

如果大家在首次调用通信控件Microsoft Comm control 控件时无法在控件对话框中找到,请直接在系统目录中搜索名为文件。

然后通过浏览加入VB的工作界面中。

添加完控件回到编程界面。

如下图4。

图4通过右边的菜单把一些必要的控件放在窗体中。

然后点击窗体中的Timer控件按F4弹出属性窗口进行设置。

其具体设置如下:Timer定时器控件设置属性,(通过按F4键可弹出此窗口)Mscomm通信控件参数属性设置(通过单击控件的右键属性可弹出此窗口)本文用到的其他控件:CommandButton控件和TextBox控件按默认属性设置不变。

以上设置完成,回到编程窗体区中,任意双击。

会显示Visual Basic的程序窗体的Load事件程序。

在代码窗口中输入:Private Sub Form_Load()= True'窗体的加载时,就打开通信端口,通信端口的参数也可以在此指定='窗体的加载时,同时定时器控件事件End Sub这样设置目的是当程序在打开是,首先打开通信控件MSComm,注意这里的串口通信参数中的波特率设置是默认参数的。

基于VC的多功能电力仪表上位机管理软件

基于VC的多功能电力仪表上位机管理软件
R e n Y u m a o ( C o l l e g e o f E l e c t r o n i c I n f o r m a t i o n , H a n g z h o u D i a n z i U n i v e r s i t y , H a n g z h o u , Z h e j i a n g , 3 1 0 0 1 8 C h i n a )

仟 逸
基于VC的多功能电力仪表上位机管理软件
任玉茂 胡炜薇 秦会斌( 杭州电 子 科技大学新型 电 子器件 与应用 研究所, 浙 江 杭州 3 1 0 0 1 8 )
摘 要: 为实现多功能电力仪表各项数据的实时检测, 方便用户在一台主机上对多个下位机进行查看和管理, 现开发出一款 上位机管理软
压、 电流、 功率、 电能等多项数据, 数据自 动厣 j 新。 不同的下位机可选择显示, 下位机的信号网络、 电压变比、 电流变比等参数可手动更改, 软 关键词: 多功能电力仪表; 上位机; M S C O M M 控件; 参数设置; 电能清零

PC Ma na g e me nt So f t wa r e Fo r M ul t i f unc t i o n I ns t r um e nt Ba s e 0 n V C
件。 该软件 基于M F C 平 台, 利用M s c O M M 通信控 件, 通 过4 8 5 总线 与单片机 进行 通信 。 软件将 采 集到的数据 处理整合 , 在一个界 面上 同时显 示电 件 同时还 集成 了 电能值一键 清零 的功 能。 该软件 使 用简便 , 传 送数据 快速 准确 , 现 已投 入市场运 用。
A b s t r a c t: I n o r d e r t o r e a l i z e t h e r e a l — t i m e d e t e c t i o n o f M u l t i f u n c t i o n I n s t r u m e n t , w e h a v e r e s e a r c h e d a n d

c++ builder实现模拟器测控系统单片机与上位机之间的串口通汛

c++ builder实现模拟器测控系统单片机与上位机之间的串口通汛

髦塑釜凰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 串行总线与上位机通讯。

用Delphi实现上位机与单片机串行通信源代码及效果图

用Delphi实现上位机与单片机串行通信源代码及效果图

用Delphi实现上位机与单片机串行通信效果图及源代码只公布下位机(单片机)程序//***************************************************************************** ***********************////本设计使用AT89C2051单片机,//时钟频率为11.0592MHz,12MHz也可以//用共阳极LED数码管显示及使用DS18B20智能温度传感器。

// //设计日月科技,QQ512566413#include <reg51.h>#include <intrins.h>//_nop_();延时函数,用于小于1us延时#define uchar unsigned char#define uint unsigned int#define disdata P1 //段码输出口sbit din=P1^5; //LED小数点控制//#define discan P3 //动态扫描口//占用整个P3口了,现改为指定下面的端口,//把多余端口占用的空出来//列扫描控制IO口sbit led_1 = P2^0;sbit led_2 = P2^1;sbit led_3 = P2^2;sbit led_4 = P2^3;sbit dq= P3^3; //温度输入口uchar ch;uchar crc;//***温度小数部分用查表法*********//uchar data RomCode[8]={0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};uchar code ditab[16]={0x00, 0x01, 0x01, 0x02,0x03, 0x03, 0x04, 0x04,0x05, 0x06, 0x06, 0x07,0x08, 0x08, 0x09, 0x09};/*uchar code dis_7[12]={0xC0, 0xF9, 0xA4, 0xB0,0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0xff, 0xbf};*/uchar code dis_7[12]={0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xff,0xF7};//共阴极LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"uchar code str[12]={'0','1','2','3','4','5','6','7','8', '9',' ','-'};//uchar code scan_con[4]={0x04,0x08,0x10,0x20};//列扫描控制字,P3.2 P3.3 P3.4 P3.5//0x04化成二进制就是0000 0100//0x08化成二进制就是0000 1000//0x10化成二进制就是0001 0000//0x20化成二进制就是0010 0000//0x40化成二进制就是0100 0000//0x80化成二进制就是1000 0000uchar data temp_data[2]={0x00, 0x00}; // 读出温度暂放uchar data display[5]={0x00, 0x00, 0x00, 0x00, 0x00};//显示单元数据,共4个数据,一个运算暂存用//串口初始化晶振为11.0592M 方式1 波特率300-57600void InitCom(void){#define XTAL 11059200 // CUP 晶振频率#define baudrate 9600 // 通信波特率TMOD = 0x20; //定时器1方式2 定时器0方式1//用在别处可以不用定时器0,TMOD=0x20 TH1=TL1=(unsigned char)(256-(XTAL/(32L*12L*baudrate))); //THTL;SCON = 0x50; //串口方式1,允许接收//TCON = 0x40; //设定时器1开始计数//PCON = 0x80; //波特率加倍控制,SMOD位PCON=0x00;RI=0; //清收发标志TI=0;IE=0x90; //0x00=禁止任何中断,0x90开启T1中断,0x92开启全部中断TR1=1; //启动定时器1}//向串口输出一个字符(非中断方式)void ComOutChar(unsigned char OutData){SBUF=OutData; //输出字符while(!TI); //空语句判断字符是否发完TI = 0; //清TI}//串口接收中断函数void serial () interrupt 4 //using 3{if(RI){RI=0 ;ch=SBUF;}}//****11微秒延时函数*********************//void delay(uint t){for(;t>0;t--);}//***********显示扫描函数*************//void scan(void){char k;for (k=0;k<4;k++) //四位LED扫描控制从左到右{Disdata = dis_7[display[k]];//discan = scan_con[k];switch (k){case 0:LED_1 = 0;break;case 1:LED_2 = 0;DIN = 0;break;case 2:LED_3 = 0;break;case 3:LED_4 = 0;break;default:break;}delay(100);//scan_con-列扫描控制字;//discan-P3口列扫描输出//discan=0x00; //灭字switch(k){case 0:LED_1 = 1;break;case 1:LED_2 = 1;break;case 2:LED_3 = 1;break;case 3:LED_4 = 1;break;default:break;}}}//******18B20复位函数***********//void Init_DS18B20(void){char presence=1;while (presence){while (presence){DQ = 1;_nop_();_nop_(); //总线上拉DQ = 0; //下拉delay(50); //维持550us,最短维持480usDQ = 1; //总线上拉delay(6); //检测总线上升沿,66uspresence = DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步}delay(30);//延时300us,总线恢复高电平,DQ=1;presence=~DQ; //取反,跳出循环}DQ = 1;}//****18B20写命令函数************//void WriteOneChar(uchar val){uchar i;for(i=8;i>0;i--) //定义8 bit,写8 bit{DQ = 1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_(); //5usDQ=val&0x01; //最低位移出,并写入总线delay(6); //66usval=val>>1;//右移一位,倒数第二位变为最低位}DQ=1;delay(1); //高电平维持11us,写结束}//*******18B20读1个字节函数*********************//uchar ReadOneChar(void){uchar i;uchar value = 0;for (i = 8; i > 0; i--){DQ = 1;_nop_();_nop_();value>>=1; //右移一位DQ=0;_nop_();_nop_();_nop_();_nop_(); //4usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4us ,读时隙if(DQ)value|=0x80;//DQ=1,则写入为10000000delay(6); //66us}DQ = 1;return(value);}/**************************************//* *//* 读取64位序列码*/ /* *//**************************************/void Read_RomCord(void){uchar j;Init_DS18B20();WriteOneChar(0x33); // 读序列码的操作for(j=0;j<8;j++){RomCode[j]=ReadOneChar();}}/******************************************//* *//*DS18B20的CRC8校验程序*//* *//******************************************/uchar CRC8(void){uchar i, x;uchar crcbuff;crc = 0;for(x=0;x<8;x++){crcbuff=RomCode[x];for(i=0;i<8;i++){if(((crc^crcbuff)&0x01)==0)crc>>=1;else{crc^=0x18; //CRC=X8+X5+X4+1crc>>=1;crc|=0x80;}crcbuff>>=1;}}return crc;}//*********读出温度函数*****************//void ReadTemperature(void){uchar n=0; //存储符号Init_DS18B20(); //总线复位WriteOneChar(0xCC); // 发Skip ROM命令WriteOneChar(0xBE); // 发读命令temp_data[0]=ReadOneChar(); //温度低8位temp_data[1]=ReadOneChar(); //温度高8位Init_DS18B20();WriteOneChar(0xCC); // Skip ROMWriteOneChar(0x44); // 发转换命令//******温度数据处理函数*********************//if ((temp_data[1]&0xf8)==0xf8){temp_data[1]=~temp_data[1]; //负温度求补码temp_data[0]=~temp_data[0]+1;if (temp_data[0]==0x00)temp_data[1]++;n = 1;}//查表得到温度小数部分display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //处理小数位//获取温度整数部分//(高字节的低三位与低字节的高四位)//低八位屏蔽小数位后右移四位//与高八位屏蔽符号位后左移四位合并//display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);display[3]=display[4]/100; //百位display[2]=display[4]%100/10; //十位display[1]=display[4]%10; //个位if (!display[3]){display[3] = 0x0A;//最高位为0时都不显示,控制字为0xffif (!display[2]){display[2]=0x0A;}}if (n){display[3]=0x0B; //负温度时最高位显示"-"}}/*void Timer0(void) interrupt 1 //定时器0中断{TH0 = 0x4c;TL0 = 0x00;}*///*********************主函数*********************//void main(void){uint h, i; //定义循环变量uchar iRom;InitCom(); //初始化串口for (h=0;h<4;h++){display[h]=8; //开机测试LED,显示"8888"}Init_DS18B20(); // 开机先转换一次WriteOneChar(0xCC); // Skip ROM;允许总线控制器不用提供64位ROM编码就可以使用存储器操作命令。

C#上位机与三菱PLC通讯的实现步骤(图文)

C#上位机与三菱PLC通讯的实现步骤(图文)

C#上位机与三菱PLC通讯的实现步骤(图⽂)
1、三菱 MX COMPONENT下载及安装测试:
2、通讯测试及数据监控
打开PLC监控程序:
可以看到之前设置的通讯配置,也可以重新设置:
点击OK
在右侧可以输⼊地址可以对PLC数据进⾏监控
PS:1:plc地址,2:开始结束监控,3:更改监控⽅式
buffer memory监控
也可以根据输⼊地址进⾏⾃定义监控
往PLC写⼊数据及设置PLC时间
可以按位写,也可以⼀次写⼊多位
3、好多⼈⼀开始就在找通讯的源码,我已开始也找了好久,可恶的是有些⼈知道源码不仅不提供还收⾦币下载,这⾥先画个圈圈;⼀般这种软件都带源码的啊,我就不信MX COMPONENT没有,终于让我在莫个⾓落⾥找到了,感慨⼀番。

选中该程序,右击属性:
在属性⾯板中选择打开⽂件位置:
找到程序所在⽂件夹:
回到上个⽬录:
进⼊samples⽂件夹(终于找到C#源码了,哈哈):
以上⼤家可以参考源码进⾏测试;
下⾯就告诉⼤家怎么⾃⼰建项⽬:
新建⼀个C#窗体应⽤,添加引⽤,发现没有案例程序中的dll。

菜单栏中选择⼯具,下拉框中点击选择⼯具箱项。

选择com组件选项卡,在选择界⾯中勾选你所需要的控件
在⼯具箱中的常规项中就可以看到mx的控件了
然后后⾯⼤家可以根据案例中的进⾏程序不开发了,后续开发再写吧,这个真的拖了好久了,最近项⽬有点忙,惭愧。

到此这篇关于C#上位机与三菱PLC通讯的实现步骤(图⽂)的⽂章就介绍到这了,更多相关C#上位机与三菱PLC通讯内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

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

用VC++写上位机软件实现单片机串口通讯2007年05月30日星期三 23:40工业控制领域(如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);四是利用第三方编写的通信类。

以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。

笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。

以下将结合实例,给出实现串行通信的几种方法。

1 Windows API通信函数方法与通信有关的Windows API函数共有26个,但主要有关的有:CreateFile() 用“comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。

初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。

以下给出API实现的源代码。

1.1 发送的例程//声明全局变量HANDLE m_hIDComDev;OVERLAPPED m_OverlappedRead, m_Over lappedWrite;//初始化串口void CSerialAPIView::OnInitialUpdate(){CView::OnInitialUpdate();Char szComParams[50];DCB dcb;Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));m_hIDComDev = NULL;m_hIDComDev = CreateFile(“COM2”,GENERIC_READ│GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORM AL│FILE_FLAG_OVERLAPPED, NULL);if (m_hIDComDev == NULL){AfxMessageBox(“Can not open serial port!”);goto endd;}memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED)); COMMTIMEOUTS CommTimeOuts;CommTimeOuts.ReadIntervalTimeout=0×FFFFFFFF;CommTimeOuts.ReadTotalTimeoutMultiplier = 0;CommTimeOuts.ReadTotalTimeoutConstant = 0;CommTimeOuts.WriteTotalTimeoutMultiplier = 0;CommTimeOuts.WriteTotalTimeoutConstant = 5000; SetCommTimeouts(m_hIDComDev, &CommTimeOuts);Wsprintf(szComparams, “COM2:9600, n, 8, 1”);m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);dcb. DCBlength = sizeof(DCB);GetCommState(m_hIDComDev, &dcb);dcb. BaudRate = 9600;dcb. ByteSize= 8;unsigned char ucSet;ucSet = (unsigned char) ((FC_RTSCTS&FC_DTRDSR) != 0);ucSet = (unsigned char) ((FC_RTSCTS&FC_RTSCTS) ! = 0);ucSet = (unsigned char) ((FC_RTSCTS&FC_XONXOFF) ! = 0);if (!SetCommState(m_hIDComDev, &dcb)‖!SetupComm(m_hIDComDev,10000,10000)‖m_OverlappedRead. hEvent ==NULL‖m_OverlappedWrite. hEvent ==NULL){DWORD dwError = GetLastError();if (m_OverlappedRead. hEvent != NULL)CloseHandle(m_OverlappedRead. hEvent);if (m_OverlappedWrite. hEvent != NULL)CloseHandle(m_OverlappedWrite. hEvent);CloseHandle(m_hIDComDev);}endd:;}//发送数据void CSerialAPIView::OnSend(){char szMessage[20] = “thank you very much”;DWORD dwBytesWritten;for (int i=0; i<sizeof(szMessage); i++){WriteFile(m_hIDComDev, (LPSTR)&szMessage[i], 1, &dwBytesWritten,&m_OverlappedWrite);if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0; else{GentOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE); m_OverlappedWrite. Offset += dwBytesWritten;}dwBytesWritten++;}}1.2 接收例程DCB ComDcb; //设备控制块HANDLE hCom; //global handlehCom = CreateFile ("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hCom==INVALID_HANDLE_VALUE){AfxMessageBox("无法打开串行口");}else{COMMTIMEOUTS CommTimeOuts ;SetCommMask(hCom, EV_RXCHAR ) ;SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区尺寸为4K */PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区//以下初始化结构变量CommTimeOuts, 设置超时参数CommTimeOuts.Rea dIntervalTimeout = 0×FFFFFFFF ;CommTimeOuts.ReadTotalTimeoutMultiplier = 0;CommTimeOuts.ReadTotalTimeoutConstant = 4000;CommTimeOuts.WriteTotalTimeoutMultiplier = 0;CommTimeOuts.WriteTotalTimeoutConstant = 4000;SetCommTimeouts(hCom, &CommTimeOuts ); //设置超时参数ComDcb.DCBlength = sizeof( DCB );GetCommState( hCom, &ComDcb ); //获取当前参数ComDcb.BaudRate =9600; //波特率ComDcb.ByteSize = 8; //数据位ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */SetCommState(hCom, &ComDcb ) ;} //设置新的通信参数接收可用定时器或线程等DWORD dRead,dReadNum;unsigned char buff [200];dRead=ReadFile(hCom, buff, 100, &dReadNum, NULL); //接收100个字符,//dReadNum为实际接收字节数2 利用端口函数直接操作这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:int _inp(unsigned shot port)该函数从端口读取一个字节,端口号为0~65535。

写端口的函数原型为:int _outp(unsigned shot port, int databyte)该函数向指定端口写入一个字节。

相关文档
最新文档