vc++上位机程序
VC上位机MFC利用串口控件发送接收数据程序代码
VC上位机MFC利用串口控件发送接收数据程序代码打开vc++6.0,建立一个基于对话框的mfc应用程序。
添加控件后会弹出一个确认框
点击“确定”
单击\,控件将被成功添加
然后在控件的属性里进行一些必要的配置:
Inputmode设置为1-binary,这意味着以二进制模式检查数据
其它的用默认值。
您还可以使用oninitdialog()函数中的代码进行设置,如下所示:
设置好以后,要在程序的开始打开串口,不然是没发使用的。
在oninitdialog中加入以下代码:
睡眠(100);方差数据;intdata_len;charcdata[1024];
cdata[data_len]=0;
//CDATA是指向所接收字符串的指针
m_list.addstring(cdata);//在listbox控件中显示接收到的数据}。
基于C#的串口通信上位机和下位机源程序
基于C#的串口通信上位机和下位机源程序基于单片机串口通信的上位机和下位机实践串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus 或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
首先亮出C#的源程序吧。
主要界面:只是作为简单的运用,可以扩展的。
源代码:using System;using System.Collections.Generic;using System.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(){Initializeponent();}SerialPort sp = new SerialPort();private void button1_Click(object sender, EventArgs e) {String str1 = boBox1.Text;//串口号String str2 = boBox2.Text;//波特率String str3 = boBox3.Text;//校验位String str4 = boBox5.Text;//停止位String str5 = boBox4.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 = boBox1.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.T oString(sp.PortName) + "已开启!"; }else{sp.Close();button1.Text = "打开串口";groupBox3.Enabled = false;//LED控制界面变灰色textBox1.Text = Convert.T oString(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 in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称this.boBox1.Items.Add();//默认设置boBox1.SelectedIndex = 0;//选择第一个口boBox2.SelectedIndex = 4;//波特率4800boBox3.SelectedIndex = 0;//校验位NONEboBox4.SelectedIndex = 0;//停止位为1boBox5.SelectedIndex = 0;//数据位为8}catch{MessageBox.Show("找不到通讯端口!", "串口调试助手");}}private void timer1_Tick(object sender, EventArgs e){label6.Text = DateTime.Now.T oString();}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;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;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;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;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;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;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;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("发送失败。
AGC、AVC现场运行规程
AGC、AVC现场运⾏规程AGC、A VC现场运⾏规程⽬录⼀、概述我司RTU装置为上海惠安公司提供,分为主机屏和采集屏,且含AGC+A VC功能,主机屏在⽹控室,采集屏在机组保护室。
1、AGC⾃动装置:AGC是指⾃动、发电(负荷)、控制。
⾃动发电控制(AGC)是通过控制发电机有功出⼒来跟踪电⼒系统负荷变化,从⽽维持频率等于额定值,同时满⾜互联电⼒系统间按计划要求交换功率的⼀种控制技术。
基本⽬标包括使全系统的发电出⼒和负荷功率相匹配;将电⼒系统的频率偏差调节到零,保持系统频率为额定值;及控制区域间联络线的交换功率与计划值相等,实现各区域内有功功率的平衡。
2、A VC⾃动装置AVC是⾃动电压控制系统,通过控制机组励磁,实现电⽹电压、⽆功优化控制的专门装置。
在相关约束条件下,根据接受的⽬标电压指令,调节机组励磁,从⽽改变⾼压侧母线电压,达到控制⽬标。
⽬的是提⾼电⽹的可靠性和电⽹运⾏的经济性,该装置可实现本地和远⽅调度控制。
⼆、运⾏管理规定1、AGC投⼊、退出1.1、允许投⼊条件:在CCS模式下,AGC指令与实际功率偏差<30MW,且AGC指令⾮坏质量。
1.2、退出条件:允许投⼊条件消失,或AGC指令坏质量,或任意RB发⽣,或省调退出(脉冲),或运⾏⼈员退出。
1.3、投⼊过程:允许投⼊条件下,在画⾯点击“AGC请求”背景变红⾊,表⽰请求已经发出。
等省调投⼊(脉冲)信号⼀来,AGC已经投⼊。
1.4、闭锁AGC增:AGC模式下,负荷闭增或当前AGC指令⼤于负荷上限。
负荷闭增:⼦系统达到最⼤或机组负荷指令⼤于负荷上限或主汽压⼒偏差(PV-SP)低于-0.6MPa或负荷指令超过实际负荷20MW。
1.5、闭锁AGC减:AGC模式下,负荷闭减或当前AGC指令⼩于负荷下限。
1.6、负荷闭减:机组负荷指令⼩于负荷下限或主汽压⼒偏差(PV-SP)⾼于0.6MPa或负荷指令低于实际负荷20MW。
1.7、具体实现:通过10ADS (AUTOMAN)功能块,其输⼊为AGC指令,当AGC已投⼊信号即(请求已经发出且省调投⼊(脉冲)信号来)SETAUTO被置1,此时将⾃动接收省调的AGC指令。
手把手教你VC上位机MFC利用串口控件发送接收数据
1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest;2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX 一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h"//}}AFX_INCLUDES 。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
基于VC++及Proteus的上、下位机串口通信仿真技术
及数据 、 图形显示 , 打印 , 人机对话等。串行 总线技 术具有优越性 , 上、 下位机之间多以串行通信的方式
协调 工作 。基 于 V C十 +6 . 0和 P r o t e u s的特 性 , 本文 利用 P r o t e u s 仿 真下位 机 运 行 , V C++ 6 . 0实 现 上位 机 编程 , 采 用 虚拟 串 口进 行 R S 2 3 2串 口通 信 , 在 纯 软 件环境 下 , 完 成集 总分散 系统 的组建 ¨ J 。
第2 6卷 第 4期
2 0 1 3年 l 0月
镇
江 高 专 学
报
Vo l _ 2 6 No . 4 Oc t .,2 01 3
J o u r n a l o f Z h e 6 i a n g C o l l e g e
基 于 VC+ +及 P r o t e u s的上 、 下 位 机 串 口通信 仿 真 技 术
M0V R 2. # O 4 H
MOV R7. #1 1 1 01 11 1 B LOPO:MOV P1。 R7
3 基 于 MF C- MS C o mm 控 件 的 上 位 机 设 计
在v c++6 . 0中 使 用 M S C o m m 控 件 对 串 口编 程 。1 ) 创 建 1个 基 于 对 话 框 的 可 执 行 工 程— — 串
m
XT >
图1 下 位 机 硬 件 电 路 设计
收 稿 日期 : 2 0 1 3— 0 5—2 8
基金项 目: 海南软件职业技术学院基金资助项 目( H r 2 0 1 1 0 5 ) ; 海南软件职业技术学 院基金资助项 目( H  ̄ 0 1 3 0 1 ) 作者简介 : 曾维鹏 ( 1 9 8 2 一) 男, 海南海 口人 , 讲师 , 主要 从事嵌人式技术研 究 ; 蔡莉莎 ( 1 9 8 4 一) , 女, 海南海 口人 , 助教 , 主要从 事计 算机接 口 技术 、 单片机原理与接口技术教学研究。
基于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卡伺服控制器使用说明书
KJS-VC 伺服控制卡使 用 说 明 书 北京康吉森自动化设备技术有限责任公司KJS-VC 使用说明书1.1 概述KJS-VC模块是专门为DEH系统设计的智能型伺服、功放卡,它接受控制器的控制指令经功放后直接驱动伺服阀,同时具有手操及故障诊断功能,并能够对输出进行偏置和增益调整。
1.2.1 指示灯PWR 电源指示灯。
CPU 闪烁为CPU工作正常;灭或恒亮为CPU工作不正常。
COM 有两种工作方式1、独立工作方式:亮表示输出回路断开或输出电流值不正确。
2、通讯工作方式:亮表示处于通信状态,此时断路检测有模块状态位通过通讯方式传输给控制系统。
LVDT1 当灯亮时,表明第一路LVDT故障。
LVDT2 当灯亮时,表明第二路LVDT故障。
1.2.2 开关量输入/输出方式DI 输入为干接点方式。
DO 输出方式选择可以选择1、有源输出 状态为+24V或0V2、无源输出 输出为继电器干结点1.2.3 手动功能VC卡上设计有手操功能,当备用手操盘上自动/手动钥匙开关打到手动时,按增减按钮及加速按钮可对调门进行直接操作,正常增减时速度为5%/min,加速增减时速度为35%/min。
手/自动跟踪问题VC 卡内已作了较周全的考虑。
当VC卡判断到与上位机(DPU站主机)通讯发生故障或两路LVDT均故障时,VC卡发出紧急手动请求指示,备用手操盘上“手动请求”指示灯点亮,然后根据情况可将自动/手动钥匙开关打到手动,对调门进行操作。
1.2.4开关量输出方式选择主板上跳线开关J11、J12决定了开关量输出方式a)干结点输出(无源输出)J11 J12的1、2短路,2、3开路b)+24输出(有源输出)J11 J1 2的2、3短路,1、2开路1.2.5 位移传感器零点满度调整电位器R101、R201分别对应两路LVDT的零点调整,改变R101、R201,则调整对应LVDT的零点。
电位器R102、R202分别对应两路LVDT的满度调整,改变R102、R202,则调整对应LVDT的满度。
上位机串口通信编程
上位机串⼝通信编程摘要本⽂主要描述了利⽤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引⾔随着⼈们⽣活⽔平的不断提⾼,单⽚机控制⽆疑是⼈们追求的⽬标之⼀,它所给⼈带来的⽅便也是不可否定的,要为现代⼈⼯作、科研、⽣活、提供更好的更⽅便的设施就需要从单⽚机技术⼊⼿,⼀切向着数字化控制,智能化控制⽅向发展。
现代化集中管理需要对现场数据进⾏统计、分析、制表、打印、绘图、报警等,同时,⼜要求对现场装置进⾏实时控制,完成各种规定操作,达到集中管理的⽬的。
c++上位机开发需要学的内容
C++上位机开发需要学的内容在进行C++上位机开发时,我们需要学习一系列的内容,包括但不限于:1. C++基础知识:我们需要对C++的基础知识有所了解,包括语法、数据类型、运算符等。
这些基础知识是我们进行上位机开发的基础,可以帮助我们更好地理解和编写程序。
2. 面向对象编程:C++是一种支持面向对象编程的语言,因此我们需要学习面向对象编程的相关概念和技术,包括类和对象、继承和多态等。
这些内容能够帮助我们更好地组织和管理我们的代码,提高代码的复用性和可维护性。
3. 数据结构与算法:在上位机开发过程中,我们通常会涉及一些复杂的数据结构和算法,比如队列、栈、图等。
我们需要学习这些数据结构和算法的相关知识,以便能够在实际开发中灵活运用和优化。
4. GUI编程:上位机通常需要具有良好的用户界面,因此我们需要学习GUI编程的相关知识,比如如何设计和实现用户界面、如何处理用户输入和输出等。
这些内容可以帮助我们开发出直观、友好的上位机程序。
5. 网络编程:有些上位机需要与其他设备或服务进行通信,因此我们需要学习网络编程的相关知识,包括socket编程、HTTP通信等。
这些内容可以帮助我们实现上位机与其他系统的高效交互。
6. 并发与多线程:在某些情况下,上位机需要处理多个任务或同时与多个设备进行通信,因此我们需要学习并发与多线程的相关知识,以便实现程序的高效并发执行和资源管理。
7. 调试与优化:在实际开发过程中,我们需要学习如何调试和优化C++程序,包括如何定位和修复bug、如何提高程序的性能等。
这些内容可以帮助我们开发出稳定、高效的上位机程序。
总结回顾,C++上位机开发涉及的内容十分广泛,需要我们掌握C++基础知识、面向对象编程、数据结构与算法、GUI编程、网络编程、并发与多线程、调试与优化等多方面的知识和技能。
只有在掌握了这些内容之后,我们才能够更好地进行上位机开发,并开发出高质量、稳定的上位机程序。
个人观点与理解:C++上位机开发是一项挑战性的工作,需要我们具备扎实的编程基础、丰富的实践经验和持续学习的态度。
运用VC++技术实现上位机与OMRON品牌PCL的串行通讯
运用VC++技术实现上位机与OMRON品牌PCL的串行通讯摘要:文章介绍了可编程控制器(PCL)与上位机(PC机)实现串行通信功能的硬件组成、通信协议,重点阐明在上位机(PC机)上基于VC++6.0的编程实现细节,并进一步展望PLC对控制系统应用的前景。
关键词:可编程控制器(PCL);VC++鉴于目前由可编程控制器(PCL)和PC机所构成的监控系统在工业控制领域得以广泛的运用,文章将对PCL作下位机,完成现场设备的直接控制、数据收集等工作,PC机作上位机,完成数据的分析存储、状态显示等工作进行技术探讨,通过上位机对PLC的读写操作,从而完成现场数据的接收、传达与监控功能。
文章以OMRON公司的CJ1G型PLC作下位机,以PC机为上位机,重点研究此分布式控制系统的通讯方式。
1硬件互联技术细节1.1PLC与PC的硬件互联经过对该品牌PLC的分析,可知PLC本身配有RS-232接口,大大方便了与PC 机串口通信的硬件连接,文章直接采用自制电缆将PLC的RS-232口与PC机RS-232口相连,引脚对应关系图如图1:1.2设定PLC通信方式,确定通信协议帧CJ系列PLC单元支持以下5种串行通信功能:上位机链接通信、无协议通信、1:N或1:1链接通信、外设总线通信和串行PLC链接通信,其中上位机链接通信功能适用于上下位机并以会话的方式进行实时数据通信。
一般在控制系统中,采用单台PLC与PC机通信,上位机担当命令发起端,通过向PLC发送不同格式的命令帧,完成对PLC寄存器的读写操作。
因此文章选择主机-->PLC的主链接命令通信方式。
该系统使用RS一232C端口进行通信。
RS一232C端口的缺省设定是:上位机链接模式、1启动位、7数据位、偶校验、2停止位和9 600bps的波特率。
用户可以通过编程工具或者SETUP(237)指令改变RS一232C端口的设定。
我们首先用编程工具对PLC进行设置,其中PLC的操作模式设定为监控模式;然后断开电源,将主机与PLC的CPU单元连接,并将CPU单元DIP的引脚5设定为OFF;最后接通电源,从主机发布主链接命令,进行上下位机的通信。
用VC++开发上位机与PLC通信程序实现光饰机变频控制
用 上 位 机处 于 主动 状 态 即 第 一种 通 信 方 式 。
对控制参数进行修 改 , 主要是运行速度和时间。鉴于控制 系统的复杂性 , 控制 系统 由上位机 、 下位机两级计 算机组
成。其控制流程如交换命 令和应答实现 L 的。当 P C接 收到从 上位机发 来的 A CI码命令 时 , L S I 自
提 高 1~ 级 。 2
2● R x
●
,
Rx
●2 ●
●
S i l hed R Ln i kToT
・ /
光饰机 中旋转盘的电机转速要求控制在 0~ 5 rmi 2 0/ n 的无级调速 。采用变频调速 , 传动效率高 、 事故率低 、 动 启
停 止平 稳 , 省 电 1% ~ 0 。 可 0 3%
prvde to fprgrm mig d i a e o i sa meh d o o a n esgnb s d onVC ++6 0.Th rgr . e po am asb en s c es f l ppid t h aameer a in h e u c sul a l ot e p r y e t i t z o c to fte s e d an i n te p l hn onrlo h p e d t me i h oi ig mac n s hie. Ke y wor ds: os o p t ;P h tc m uer LC;s r l ommu iain;VC ++6. o l hn c ie ei ac nc t o 0;p i ig ma hn s
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++编写串⼝上位机
打算使⽤Visual Studio编写⼀个串⼝上位机程序,然后进⾏测试。
原来的上位机各种BUG,受不了了。
⾃⼰写⼀个得了。
⼀、创建 MFC ⼯程
选择MFC应⽤:
应⽤程序类型选择 基于对话框:
⽣成效果:
⼆、设置控件
找到“⼯具箱”,就可以将相应的控件拖拽⾄应⽤程序对话框中
常⽤控件有: Button, Edit Control, Static Text,Group Box,Combo Box等。
最后简单的上位机界⾯如下:
三、⽰例
花了两天时间,做了个半成品。
发送数据,没能输⼊。
接收数据,没有滑轮可以上下滑动。
是否选择⼗六进制没有、保存窗⼝没有。
没时间懒得弄了,之后⼜需要再做开发。
⽰例下载:
参看:
参看:。
VC编程实现控制其他应用程序
VC编程实现控制其他应用程序VC编程可以实现控制其他应用程序的功能,可以通过编写代码来实现对其他应用程序的自动化操作、窗口控制、数据交互等。
下面将介绍VC编程实现控制其他应用程序的一般步骤和方法。
首先,要控制其他应用程序,首先需要了解被控制应用程序的接口和功能。
可以使用Windows API、COM等方式获取被控制应用程序的相关信息,并定义好需要使用的函数和数据类型。
在VC编程中,可以使用MFC (Microsoft Foundation Class)库、Windows API等来实现对应的功能。
一般而言,控制其他应用程序的主要方法有以下几种:1. Shell执行:VC编程可以使用Shell命令来执行其他应用程序的命令行操作。
可以使用ShellExecute函数来调用其他应用程序并传递相关参数。
例如,可以使用ShellExecute(NULL, "open", "notepad.exe", "myfile.txt", NULL, SW_SHOW)来打开记事本,并打开指定的文件。
2. 窗口控制:控制其他应用程序的窗口可以使用Windows API函数,如FindWindow、GetWindow、SetWindowPos等函数来实现。
可以通过FindWindow函数来通过窗口标题或类名找到其他应用程序的窗口句柄,然后使用GetWindow函数获取窗口的信息,并通过SetWindowPos函数来调整窗口的位置、大小等。
3. 模拟按键和鼠标操作:VC编程可以使用Windows API函数来模拟按键和鼠标操作。
例如,可以使用keybd_event函数来模拟键盘按键操作,使用mouse_event函数来模拟鼠标点击和移动操作。
通过这些函数,可以实现在其他应用程序中输入文本、点击按钮等操作。
4. 进程控制:VC编程可以通过Windows API函数来控制其他应用程序的进程。
最详细的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温度仪表技术报告
实验项目技术报告-热电偶温度测控系统实验内容➢热电偶测温原理,冷端补偿;➢DS18B20单总线单片机数据传输;➢仪表放大器的使用;➢AD转换器的使用;➢VC上位机虚拟仪表的设计,数据的显示;实验结果上位机基于VC软件的操作界面,对电加热炉的当前温度进行测量和显示。
实验所需元器件热电偶(1只),LM324放大器(1只),AD620仪表放大器(1只),AD0804转换器(1只),串口套件1套1. 实验整体结构图图1 炉温测控系统整体结构图实验中使用热电偶传感器将加热炉内温度与室温的温差转换为毫伏级电压,经仪表放大器(AD620)放大至标准电压输出信号(0~5V),送至AD模数转换器进行转换。
同时,利用DS18B20测温芯片测量室温,对热电偶冷端进行补偿。
2. 单片机基础知识本实验主要涉及使用单片机定时器定时串口写及波特率设置,DA和AD转换器的控制,单片机串口读上位机的数据,C51单片机的引脚功能,如图2所示。
图2 单片机管脚分布图2.1 与实验有关的管脚➢实验中P3口中两引脚第二功能:P3.0:RXD串行口输入接串口模块发送端TXD;P3.1:TXD串行口输出接串口模块RXD端。
P2.0脚接温度传感器DS18B20数据传输总线,转换器写控制P2.1脚接AD转换器写控制,P2.2脚接AD转换器读控制。
➢管脚18,和管脚19(XTAL1,XTAL2):外部晶振的输入端;➢管脚20(V SS):接地端➢管脚31(EA/Vpp):访问片内允许端,接VCC;➢管脚40(电源):+5V2.2 单片机能够运行起来的最小系统1. 电源2. 晶振3. 复位电路2.3 关于电平特性单片机为TTL电平:高+5V,低0V。
计算机的串口为RS232电平:高-12V,低+12V。
因此,计算机与单片机之间通讯时需要加电平转换芯片max232,连接图如图5所示,实验中我们使用232电平转TTL电平串口通讯模块来实现。
图5. MAX232串口连接图2.3 定时器➢ 与定时器有关的寄存器是8位TCON 寄存器,地址是0x88(注:地址可以被8整除,可以进行位操作),其各位的功能如下: sfr TCON = 0x88;sbit TR1 = TCON^6; // 启动定时器1; sbit TR0 = TCON^4; //启动定时器0;本实验我们只使用TR1=1对定时器进行启动,对波特率进行设置。
C上位机实战开发指南
1. private void button1_Click(object sender, EventArgs e)
2. {
3.
label1.Text = "Button1_Click 事件成功触发";
4.
textBox1.AppendText("C#上位机实战开发指南\r\n");
5. }
运行效果如图 3-11 所示。
一般上位机代码的主体全部在 Form1.cs 文件中。我们在第二章分析命名空间 时已经查看了相关代码。查看代码步骤以及窗体代码如图 3-5,3-6 所示。
图 3-5:查看步骤
图:3-6:窗体代码
3.1.4 调试窗体程序
VS2015 的调试功能非常强大,我们经常用到的并不会太多,和单片机在线仿 真类似,通常使用打断点单步调试,查看变量值,调用堆栈等功能。
C#上位机实战开发指南
第三章 Windows 窗体程序
3.1 第一个窗体程序 3.1.1 新建本地工程文件夹
为了使工程易于管理,我们首先在电脑本地新建一个文件夹用于存放整个共 工程,比如命名为”DEMO”。注意文件夹名虽然根据喜好命名,但最好不要使用 中文命名,因为有时候如果上位机需要加载本地文件遇到中文名必须要转码,比 如加载本地 URL 时路径存在中文就相对麻烦,因此我建议使用英文命名。
21
C#上位机实战开发指南
最后我们在 Click 事件回调函数内书写代码修改 label1 的 Text 属性。完整代码 请看代码清单 3-2:Button 单击 Click 事件。
代码清单 3-2:Button 单击 Click 事件
1. private void button1_Click(object sender, EventArgs e)
基于VC平台的方舱飞行数据监控系统软件的研究.doc
基于VC 平台的方舱飞行数据监控系统软件的研究-->第1 章绪论1.1 研究背景和意义随着中国航空航天事业的迅速发展与壮大,飞机器飞行任务复杂度越来越高,为保障飞机器飞行的安全性、提高产品研发的质量以及加快研发速度,建设监控系统地面站的需求量逐渐增大。
地面站的应用遍及多个方向,目前监控地面站多用于无人机和卫星的研发中,文[1-3]中开发的无人机监控地面站和文[4-6]中研究的卫星地面站应用软件,都极大地方便地面人员远程对飞行器进行操控。
军用方舱是由坚固的夹芯板材料组装而成的移动式厢体,可适用于通讯指挥中心、武器装备系统和技术支援等的装载体和工作间[7-10],如图1-1 所示为本课题所采用的移动式军用方舱平台。
基于移动式方舱平台搭建飞行数据监控系统,其监控系统硬件平台主要包含无线发射模块、服务器分发设备、工业控制计算机、串口通信模块接口、以太网通信模块接口等,本文的主要工作是在该硬件平台上开发飞行数据监控系统软件。
当今世界处于复杂多变的环境,中国依然面临着南海和钓鱼岛争端等问题的困扰,在保障国家领土完整和不受外来势力的欺压,我国航空力量的不断壮大发挥着巨大的作用,而各强国也正加紧投入大量人力物力来研究各种飞机地面站系统[55-58],以保障飞机飞行任务的顺利完成。
本文通过建立飞行数据监控系统,为飞机的飞行状态提供准确可靠的测评数据,并实时地显示于地面交流站,实现地面方舱的人机友好交互,做到各项技术指标达标和功能齐全完善,不仅降低飞机监控地面站的研制时间和成本,保证研发产品的质量[13-18],还促进航空技术事业的发展,推动我国航空科技的不断革新。
......1.2 国内外研究现状1.2.1 国内研究现状飞行数据地面站监控系统软件技术是集数据采集、数据传输、数据处理、传感器技术、导航技术、图像处理和3D 模型等技术为一体的高新技术[19-26]。
飞行数据监控系统软件一般采用VB、VC、Java、C#和Android等流行语言工具来开发[29-39]。
基于VC的多功能电力仪表上位机管理软件
。
仟 逸
基于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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++编写简单串口上位机程序2010年4月13日10:23:40串口通信,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、删除确认、取消和提示框,添加“电话”、进程、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局。
4、右击编辑框Edit选择属性,在样式里设置,勾选多行、垂直滚动,其它可按默认值。
右击静态文本Text选择属性,在常规设置里,修改标题。
右击按钮PushButton选择属性,在在常规设置里,修改标题。
修改后界面如下,程序写出来运行时“电话”标志会自动消失。
5、查看->建立类向导MFC ClassWizard->Member Viariable,选择ClassName为CTestDlg的类,Control ID为MSCOMM1,双击它,为它添加控制变量m_comm1。
类似的,选择IDC_BUTTON2添加控制变量m_serial。
(建立类向导也可以右击然后在弹出的快捷菜单里选择建立类向导)至此,基本框架已经出来了,编译后运行可以看到如下所示的界面。
(组建->全部组件,然后组建->执行)6、点击左侧的视图窗口,可以在三种模式下切换,第三个是打开我们的源代码窗口,第一个是类,第二个是窗体的资源视图。
选择File View,展开test files->Header Files,打开testDlg.h,在全局变量下添加如下代码,然后保存:int gllen;//定义整型标量gllen,用于记录接收数据的个数CProgressCtrl * pbar; //指向进度条的指针,用于操作进度条CString strRXDdata; //编辑框显示的文本,记录历次转换值7、点击Recourse View,展开test recourses->Dialog,双击IDD_TEST_DIALOG,编辑我们的主界面对话框。
双击击“电话”,弹出如下对话框,按确认键:VC会进入源码编辑窗口,这个函数是用来处理串口事件的,当PC串口接收到数据时,会产生一个数据缓冲区有数据的消息事件,然后调用执行这个函数。
添加如下代码,进行数据处理,窗口更新等操作:V ARIANT variant1;//定义V ARIANT型变量,用于存放接收到的数据COleSafeArray safearray;//定义safearray型变量LONG len,k;//定义长整型变量len,kBYTE rxdata[2048];//定义BYTE型数组CString stremp1,stremp2;//定义两个字符串if(m_comm1.GetCommEvent()==2) //判断引起OnComm时间的原因{//如果是接收到特定个字节数,则读取接收到的数据variant1 = m_comm1.GetInput();//把接收到的数据存放到V ARIANT型变量里safearray = variant1;//V ARIANT型变量转换为ColeSafeArray型变量len = safearray.GetOneDimSize();for(k=0;k<LEN;K++){safearray.GetElement(&k,rxdata+k); //得到接接收到的数据放到BYTE型数组rxdata里}for(k=0;k<LEN;K++){BYTE bt = (*(unsigned char*)(rxdata+k)); //读取AD转换的高字节if((k%2)==0)if((k+1)<LEN){gllen++;//全局的变量,对接收到的转换结果的个数进行计算stremp2.Format("第%d次转换结果:",gllen);//显示第几次转换int temp = bt*4+((*(unsigned char *)(rxdata+k+1))>>6); //高低字节合并成实际的转换结果,注意转换结果是左对齐stremp1.Format("%2.2f",(2.56*temp/1024));//计算成实际电压值SetDlgItemText(IDC_STATIC,("当前电压值为:"+stremp1+" V")); //更新静态文本控件pbar -> SetPos(temp);//更新进度条的当前位置strRXDdata += stremp2;//把新的数据放到全局的字符串里strRXDdata += stremp1;strRXDdata += " V\r\n";//字符串加单位V后换行}}}SetDlgItemText(IDC_EDIT1,strRXDdata);//更新文本控件的显示这时重新编译一下,看会不会有什么错误,出现下面提示,可以选择全部组建来清除。
LINK : LNK4073: cannot create map for .ILK file; linking nonincrementally出现下面错误,请关闭运行的test.exe后重试。
LINK : fatal error LNK1104: cannot open file "Debug/test.exe"出现下面错误两种错误,是由于空间编号问题引起的,当我们添加了编辑框或者“电话”后再添加,其编号自动加一,就会出现控件没定义。
Z:\vc++串口上位机\test\testDlg.cpp(32) : error C2065: 'IDC_MSCOMM1' : undeclared identifierZ:\vc++串口上位机\test\testDlg.cpp(139) : error C2065: 'IDC_EDIT1' : undeclared identifier解决方法是,在RecourseView里,打开窗体IDD_TEST_DIALOG,右击“电话”或者编辑框等其它出错的控件,右击选择属性,在常规里修改ID,这里的程序,除BUTTON有1、2两个之外,其它都是1全部组建编译一下,看看有没有错误,没有错误就可以运行一下,可以看到界面更原来是一样的。
有错误就修改一下,省得弄多了,错在哪里都不知道,查起来麻烦。
8、在源码编辑里,打开testDlg.cpp文件,进行窗口初始化函数的编写。
找到BOOL CTestDlg::OnInitDialog()函数,在SetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization here后面添加如下初始化代码:gllen = 0; //记录转换次数全局变量清零if(! m_comm1.GetPortOpen())//判断串口是否已经打开{m_comm1.SetCommPort(1); //选择串口号1m_comm1.SetPortOpen(TRUE); //打开串口m_comm1.SetRThreshold(2); //收到两个字节引发OnComm事件m_comm1.SetInputMode(1);//输入模式选为二进制m_comm1.SetSettings("57600,n,8,1"); //设置串口参数,波特率57600,无奇偶校验,1位停止位,8位数据位MessageBox("串口初始化完毕","提示"); //提示串口成功初始化}else MessageBox("串口被占用","提示"); //如果已经打开串口,消息框提醒pbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);//获得指向IDC_PROGRESS1的指针pbar -> SetRange(0,1023);//设置进度条的范围0~1023pbar -> SetPos(0);//当前位置为0m_serial.SetWindowText("关闭串口");//按钮显示状态改变可以看到,串口的参数等等都在在这里初始化的,可以根据自己的需要修改的,具体可以查看VC++里的详细介绍,看看有哪些参数可以给我们修改来用。
添加后再编译一下,运行后可以看到多了一个串口初始化的提示信息窗口。
至此,我们已经完成了主要的串口操作及界面,剩下的就是两个按钮的操作了。
9、回到资源视图的IDD_TEST_DIALOG窗口,双击开始转换按钮,给它添加事件,点击后PC通过串口发送0xaa出来,给单片机接收。
添加如下代码:CByteArray m_Array; //定义字节数组m_Array.RemoveAll(); //字节数组清空m_Array.SetSize(1); //设定维数为1m_Array.SetAt(0,0xaa); //给m_array[0]赋值0m_comm1.SetOutput(COleVariant(m_Array));//由于SetOutput函数的参数为V ARIANT型,必须强制转换后才能发送同样地,双击另外一个按钮,给串口操作按钮添加代码,用于关闭或者打开串口。