(通信企业管理)用VC++写上位机软件实现与单片机通信精编

合集下载

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。

本文将介绍使用C语言编写51单片机的串口通信程序。

1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。

首先,我们需要一块51单片机开发板,内置了串口通信功能。

另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。

2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。

在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。

同时,我们还需要引入头文件来定义串口通信的相关寄存器。

3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。

这些参数的配置需要根据实际需要进行调整。

在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。

4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。

初始化串口的过程包括打开串口、设置中断等。

5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。

阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。

6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。

在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。

7. 中断处理在串口通信中,中断是一种常见的处理方式。

通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。

8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。

```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。

利用VC++6.0实现上位机与PLC的串行通信(1)

利用VC++6.0实现上位机与PLC的串行通信(1)

利用VC++6.0实现上位机与PLC的串行通信作者:惠鸿忠, Hui Hongzhong作者单位:聊城大学刊名:微计算机信息英文刊名:CONTROL & AUTOMATION年,卷(期):2006,22(16)被引用次数:12次参考文献(4条)1.郭飒基于OPENGL的灯光控制系统的实现[期刊论文]-微计算机信息 2004(05)2.苗长新注浆泄漏监测程序的设计及其串行通信实现[期刊论文]-微计算机信息 2003(06)3.李现勇Visual C++串口通信技术与工程实践 20024.SIMATIC S7-200可变程序控制器系统手册引证文献(12条)1.吴镇平基于PLC的桥式组合大切机监控系统设计[期刊论文]-闽西职业技术学院学报 2010(1)2.徐洋.王宏华.周强.李俊星基于MSP430单片机的无刷直流电机实验测试平台设计[期刊论文]-机械制造与自动化2010(4)3.杨英琴.侯力.郑熙.王裕林.陈丹PLC控制系统在厚壁钢管超声波探伤中的应用[期刊论文]-机械设计与制造2010(12)4.吴镇平.林海涨.李捷辉利用VC++6.0实现PLC实时监控[期刊论文]-装备制造技术 2009(7)5.王少江.侯力.薄立朗.匡红PLC和变频器在超声波自动探伤系统的应用[期刊论文]-煤矿机械 2009(4)6.唐捷.蔡智圣.李争名.赵士滨基于PC机并口通信的多媒体设备控制系统的设计与实现[期刊论文]-光盘技术2009(2)7.李波.舒朝君.江彦.余磊.刘永喜.胡玉庆.皮智敏基于VC的PLC数据采集管理系统[期刊论文]-现代电子技术2009(6)8.董奎勇.钱炜.王明军.熊磊基于VC++的月球车的数据采集处理系统[期刊论文]-微计算机信息 2008(28)9.黄良希.LI Ding-zhu用于机动车路考系统的车载通讯系统研究[期刊论文]-微计算机信息 2008(23)10.汤光华.吴青自由口模式下S7200 PLC与上位机的通信[期刊论文]-微计算机信息 2008(13)11.李志伟基于AT指令的串行通信程序的设计[期刊论文]-微计算机信息 2007(9)12.安宪军.黄尔烈.贾少锐.张常全基于Delphi7.0的上位机与PLC的通信[期刊论文]-微计算机信息 2007(7)本文链接:/Periodical_wjsjxx200616021.aspx。

基于C#的串口通信上位机和下位机源程序

基于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("发送失败。

单片机和上位机协议

单片机和上位机协议

单片机和上位机协议一、引言随着科技的快速发展,单片机在各个领域得到了广泛的应用。

而单片机与上位机之间的通信协议也成为了重要的研究方向。

本文将探讨单片机与上位机之间的通信协议,包括协议的基本原理、常见的协议类型以及它们的应用场景等。

二、单片机与上位机之间的通信协议基本原理单片机与上位机之间的通信协议是为了实现两者之间的数据交换和通信而设计的。

协议的基本原理是通过一定的规则和约定,实现数据的传输和解析。

常见的单片机与上位机通信协议包括串口通信、USB通信、以太网通信等。

其中,串口通信是最常见和简单的通信方式。

它通过串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。

串口通信具有成本低、易于实现等优点,广泛应用于各个领域。

三、常见的单片机与上位机通信协议类型1. 串口通信协议串口通信协议是最常见和简单的通信方式。

它使用串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。

常见的串口通信协议包括RS232、RS485等。

RS232是一种标准的串行通信接口,广泛应用于计算机、工业自动化等领域;RS485是一种多点通信协议,支持多个设备同时通信,适用于工业控制系统等应用场景。

2. USB通信协议USB通信协议是一种高速、可靠的通信方式。

它通过USB接口将单片机与上位机连接起来,实现数据的传输和通信。

USB通信协议具有带宽大、速度快等优点,广泛应用于外设设备、嵌入式系统等领域。

常见的USB通信协议包括USB1.1、USB2.0、USB3.0等。

3. 以太网通信协议以太网通信协议是一种广域网通信协议,它通过以太网接口将单片机与上位机连接起来,实现数据的传输和通信。

以太网通信协议具有传输速度快、可靠性高等优点,广泛应用于局域网、互联网等领域。

常见的以太网通信协议包括TCP/IP、UDP等。

四、单片机与上位机通信协议的应用场景单片机与上位机通信协议在各个领域都有着广泛的应用。

在工业控制领域,单片机与上位机通信协议被用于监控系统、物联网等方面。

VC++应用程序与PLC的数据通信

VC++应用程序与PLC的数据通信

利用OPC实现VC应用程序与PLC的数据交换关键词: OPC RSView32 VC应用程序可编程控制器1 引言VC(Visual C++)是功能强大的一种Windows应用程序可视化软件开发工具。

VC支持面向对象的设计方法,并可以使用功能强大的微软基础类库MFC(Micro-soft foundation class)。

并且由于Microsoft公司在操作市场上的垄断地位,用VC开发出来的软件稳定性好、可移植性强,而且软件与硬件相互独立,可以用来开发控制系统的上层管理系统。

RSView32是作为一种专门用于工业控制的组态软件,不仅包含了大量图形开发工具和现成图形库,使用户能够方便的进行系统开发,而且还可以对报警、活动记录、事件、历史趋势等进行组态,是一个功能强大的工业自动化产品,因此可以很方便地对下层设备进行组态。

在实际系统开发时,利用OPC技术把两种工具有效的结合起来,使上层的VC程序通过RSView32间接地与下层PLC进行数据通信,以获取令人满意的结果。

2 OPC介绍OPC(OLE for Process Control)是根据Microsoft的OLE(现在)下载这些文件:#include "opcda_i.c" OPC数据存取接口#include "opcda.h" OPC数据存取2.0头文件#include "opccomn_i.c" OPC公共接口定义#include "opccomn.h" OPC公共头文件4.2 初始化COM支持库由于OPC是基于COM技术制定,所以在使用接口类之前必须首先使用CoInitialize(NULL)函数初始化COM 库,如果成功,函数返回值等于S_ OK。

4.3 连接opc服务器OPC客户能够连接到OPC服务器上,并建立OPC组和OPC数据项,这是OPC数据访问的基础,如果没有这个机制,数据访问的其它机能不可能实现。

上位机和单片机串口编程---API函数编程

上位机和单片机串口编程---API函数编程

上位机和单片机串口编程---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;}上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。

单片机与4g模块通讯协议c语言例程

单片机与4g模块通讯协议c语言例程

单片机与4g模块通讯协议c语言例程单片机与4G模块通信协议C语言例程在现代的物联网时代,无线通信技术的发展日新月异。

而4G技术作为第四代移动通信技术,具有高速、高效、高容量等优势,被广泛应用于各种智能设备中。

在汽车、工业自动化、智能家居等领域,单片机与4G模块的通信变得越来越重要。

本文将以单片机与4G模块通信协议C语言例程为主题,详细介绍如何使用C语言进行单片机与4G模块的通信编程。

一、准备工作在进行单片机与4G模块通信之前,我们需要了解所使用的4G模块的通信协议以及C语言编程的基础知识。

首先,我们需要选择一款常用的4G 模块,例如SIM7600E等常见型号,并查询其通信协议手册,了解模块的AT指令集以及工作方式。

其次,我们需要具备C语言的基础知识,包括函数、变量、条件语句、循环语句等。

二、建立串口通信在单片机与4G模块通信中,我们通常使用串口进行数据传输。

首先,我们需要在单片机上配置串口的通信参数,包括波特率、数据位、停止位、校验位等。

这些参数需要与4G模块的通信参数保持一致,以确保数据的正确传输。

接着,我们需要使用C语言编写串口通信函数,例如可以使用像“uart_send_byte”和“uart_receive_byte”这样的函数来实现串口发送和接收一个字节的数据。

三、编写AT指令函数在单片机与4G模块通信中,我们需要使用AT指令来控制和配置4G模块的工作。

所以,我们需要编写用于发送AT指令的函数。

例如,我们可以使用“send_at_cmd”函数来发送一条AT指令,该函数接收一个字符串参数,将其发送到4G模块,并等待返回的响应结果。

我们还可以使用“check_response”函数来检查返回的响应结果是否是我们期望的。

四、实现数据收发单片机与4G模块通信的核心是数据的收发。

为了实现数据的发送,我们可以使用“send_data”函数,该函数接收一个字符串参数,将其发送到4G模块。

为了实现数据的接收,我们可以使用“receive_data”函数,该函数接收一个缓冲区参数和缓冲区大小,将接收到的数据存储到缓冲区中。

单片机上位机界面编程软件一览

单片机上位机界面编程软件一览

目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。

那么用来编写单片机嵌入式上位机的工具有那几款呢?下面小编为大家细数一下使用最普遍的几款。

(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。

特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。

被公认为测试之王。

2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。

从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。

它源自于BASIC编程语言。

VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。

程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。

VS可以支持C/C++、VB、JAVA、C#编程。

然了一次只能支持一种编程方式。

在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。

如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。

所以总的来说它是一个集成平台。

真正地组件编程。

基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。

上位机串口通信编程

上位机串口通信编程

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

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

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

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

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

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

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

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

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

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

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

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

单片机上位机编程语言

单片机上位机编程语言

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

以下是一些常用的上位机编程语言:
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等。

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

发送数据,没能输⼊。

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

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

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

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

用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编码就可以使用存储器操作命令。

上位机与51单片机串口通信

上位机与51单片机串口通信

上位机与51单片机串口通信目录:1、单片机串口通信的应用2、PC控制单片机IO口输出3、单片机控制实训指导及综合应用实例4、单片机给计算机发送数据:[实验任务]单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。

个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机系统接收后,用LED显示接收到的数据和向上位机发回原样数据。

[硬件电路图][实验原理]RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。

RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为20kBps。

RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。

我们是用MAX232芯片将RS232电平转换为TTL电平的。

一个完整的RS-232接口有22 根线,采用标准的25芯插头座。

我们在这里使用的是简化的9芯插头座。

注意我们在这里使用的晶振是11.0592M的,而不是12M。

因为波特率的设置需要11.0592M的。

“串口调试助手V2.1.exe”软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’数据位为8 位。

打开串口(如果关闭)。

然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。

注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。

如果没有选中,则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。

//参考源程序#include "reg52.h" //包函8051 内部资源的定义unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容sbit gewei=P2^4; //个位选通定义sbit shiwei=P2^5; //十位选通定义sbit baiwei=P2^6; //百位选通定义unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //1~10 void Delay(unsigned int tc) //延时程序{while( tc != 0 ){unsigned int i;for(i=0; i<100; i++);tc--;}}void LED() //LED显示接收到的数据(十进制){gewei=0; P0=table[dat%10]; Delay(10); gewei=1;shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1;baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1;}///////功能:串口初始化,波特率9600,方式1/////////void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}/////功能:把从上位机接收到的数据原样发送回去///////void main(){Init_Com();//串口初始化while(1){if ( RI ) //扫描判断是否接收到数据,{dat = SBUF; //接收数据SBUF赋与datRI=0; //RI 清零。

VB编写上位机 MSComm控件

VB编写上位机 MSComm控件

上位机可方便地实现与单片机之间进行信息传递交互,能够更加容易对机械手臂进行控制,实现操作可视化,更加直观,保存重要数据等功能。

我们利用Visual Basic 6.0(以下简称VB)来编制上位机,VB是一种功能强大、简单易学的程序设计语言。

它不但保留了原先Basic语言的全部功能,而且还增加了面向对象程序设计功能。

它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX控件MSComm还能十分方便地开发出使用计算机串口的计算机通信程序。

本实验涉及控制六路舵机,所以需要编制上位机实现一次向下位机传输含有六个数据的数组,同时接受来自下位机的数组,并显示。

整个过程可分为如下几个过程:一:VB是面向对象的语言,首先需要绘制程序界面该上位机大致分为左边的功能部分与右边的可视化调节部分。

功能部分有端口选择,用以选择合适的端口进行串口通信,波特率选择,打开与关闭端口,动作设置等。

为了便于布局,应用frame控件建立区域,再将控件拖到frame区域中,对于功能相同的控件来说,建立控件组的方式会使编程避免重复繁琐,例如HScrollbar控件,先向frame区域内拖入一个HScrollbar控件,再复制,粘贴到frame 区域内部,则提示是否建立控件组,点击确定即可。

这样便为后续编程带来很大的方便。

调节部分运用Hscrollbar控件来粗略调节度数,设定按钮与文本框配合来精确调节输出度数。

用右列文本框实时读取舵机当前角度。

用optionbutton控件来选择hscrollbar的步进精度,这里分为0.1度与1度两个不同的选项。

由于一组optionbutton中在程序运行中只能有一个处于选中状态,根据本程序要求,每一横列的两个optionbutton为一组,这样就需要frame控件,在同一个frame区域里的optionbutton默认为一组。

这样就可以如上图所示的状态显示,否则真能选中其中的一个。

单片机与pc机之间的通信例程

单片机与pc机之间的通信例程

单片机与PC机之间的通信例程1. 引言单片机与PC机之间的通信是嵌入式系统开发中非常重要的一部分。

通过单片机与PC机之间的通信,可以实现数据传输、命令控制等功能。

本文将介绍单片机与PC 机之间通信的基本原理以及编写通信例程的步骤。

2. 单片机与PC机通信原理单片机与PC机之间的通信可以通过串口(UART)或者USB接口实现。

串口是一种常见且简单的通信方式,适用于低速数据传输。

USB接口则具有更高的传输速率和更复杂的协议,适用于高速数据传输和复杂的控制。

2.1 串口通信原理串口通信使用两根线(TXD和RXD)进行数据传输。

发送端将数据通过TXD线发送到接收端,接收端通过RXD线接收数据。

发送端和接收端需要使用相同的波特率(Baud rate)进行通信,波特率决定了每秒钟传输的位数。

2.2 USB通信原理USB通信使用四根线进行数据传输:VCC(供电)、GND(地线)、D+、D-(数据线)。

USB接口还包括一个复杂的协议,如USB1.1、USB2.0、USB3.0等。

3. 编写通信例程的步骤编写单片机与PC机之间的通信例程,需要以下步骤:3.1 确定通信方式首先需要确定使用串口通信还是USB通信。

根据实际需求选择合适的通信方式。

3.2 配置硬件根据选择的通信方式,配置单片机和PC机的硬件接口。

如果使用串口通信,需要连接TXD和RXD线;如果使用USB通信,需要连接VCC、GND、D+、D-线。

3.3 编写单片机程序根据单片机的型号和开发环境,编写单片机程序。

程序中需要包含对串口或USB接口的初始化配置以及数据传输或命令控制的代码。

3.4 编写PC机程序在PC机上编写相应的程序,用于与单片机进行通信。

根据选择的通信方式,编写串口或USB接口相关的代码。

在使用串口通信时可以使用Python中的serial库进行串口读写操作。

3.5 测试与调试将编写好的单片机程序烧录到单片机中,并运行PC机程序。

通过监视器或调试工具查看数据传输情况,并进行必要的调试。

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

(通信企业管理)用VC++写上位机软件实现与单片机通信用VC++写上位机软件实现单片机串口通讯2007年05月30日星期三23:40工业控制领域(如DCS系统),经常涉及到串行通信问题。

为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但于Windows环境下却存于壹些困难和不足。

于Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows环境下串行通信技术就显得日益重要。

VC++6.0是微软公司于1998年推出的壹种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及ActiveX的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。

应用VC++开发串行通信目前通常有如下几种方法:壹是利用WindowsAPI通信函数;二是利用VC的标准通信函数inp、inpw、inpd、outp、outpw、outpd等直接对串口进行操作;三是使用MicrosoftVisualC++的通信控件(MSComm);四是利用第三方编写的通信类。

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

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

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

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

ReadFile()读串口。

WriteFile()写串口。

CloseHandle()关闭串口句柄。

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

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

1.1发送的例程//声明全局变量HANDLEm_hIDComDev;OVERLAPPEDm_OverlappedRead,m_OverlappedWrite;//初始化串口voidCSerialAPIView::OnInitialUpdate(){CView::OnInitialUpdate();CharszComParams[50];DCBdcb;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(“Cannotopenserialport!”);gotoendd;}memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED)); COMMTIMEOUTSCommTimeOuts;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;unsignedcharucSet;ucSet=(unsignedchar)((FC_RTSCTS&FC_DTRDSR)!=0);ucSet=(unsignedchar)((FC_RTSCTS&FC_RTSCTS)!=0);ucSet=(unsignedchar)((FC_RTSCTS&FC_XONXOFF)!=0);if(!SetCommState(m_hIDComDev,&dcb)‖!SetupComm(m_hIDComDev,10000,10000)‖m_OverlappedRead.hEvent==NULL‖m_OverlappedWrite.hEvent==NULL){DWORDdwError=GetLastError();if(m_OverlappedRead.hEvent!=NULL) CloseHandle(m_OverlappedRead.hEvent); if(m_OverlappedWrite.hEvent!=NULL) CloseHandle(m_OverlappedWrite.hEvent); CloseHandle(m_hIDComDev);}endd:;}//发送数据voidCSerialAPIView::OnSend(){charszMessage[20]=“thankyouverymuch”; DWORDdwBytesWritten;for(inti=0;i<sizeof(szMessage);i++){WriteFile(m_hIDComDev,(LPSTR)&szMessage[i],1,&dwBytesWritten,&m_Overlappe dWrite);if(WaitForSingleObject(m_OverlapperWrite,hEvent,1000))dwBytesWritten=0;else{GentOverlappedResult(m_hIDComDev,&m_OverlappedWrite,&dwBytesWritten,FAL SE);m_OverlappedWrite.Offset+=dwBytesWritten;}dwBytesWritten++;}}1.2接收例程DCBComDcb;//设备控制块HANDLEhCom;//globalhandlehCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,NULL);if(hCom==INVALID_HANDLE_VALUE){AfxMessageBox("无法打开串行口");}else{COMMTIMEOUTSCommTimeOuts;SetCommMask(hCom,EV_RXCHAR);SetupComm(hCom,4096,4096);/*设置收发缓冲区尺寸为4K*/PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_R XCLEAR);//清收发缓冲区//以下初始化结构变量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);}//设置新的通信参数接收可用定时器或线程等DWORDdRead,dReadNum;unsignedcharbuff[200];dRead=ReadFile(hCom,buff,100,&dReadNum,NULL);//接收100个字符,//dReadNum为实际接收字节数2利用端口函数直接操作这种方式主要是采用俩个端口函数_inp(),_outp()实现对串口的读写,其中读端口函数的原型为:int_inp(unsignedshotport)该函数从端口读取壹个字节,端口号为0~65535。

写端口的函数原型为:int_outp(unsignedshotport,intdatabyte)该函数向指定端口写入壹个字节。

不同的计算机串口地址可能不壹样,通过向串口的控制及收发寄存器进行读写,能够实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,于此不加赘述。

3MSComm控件MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但于实际应用中要小心对其属性进行配置。

下面详细说明该类应用方法。

相关文档
最新文档