串口上位机程序的编制
写上位机的方法
写上位机的方法
上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。
下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。
上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。
下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。
上下位机都需要编程,都有专门的开发系统。
编写上位机程序通常涉及以下步骤:
1. 确定需求:明确上位机程序需要实现的功能和与下位机的通信协议。
2. 选择开发环境:选择适合的编程语言和开发环境,如Visual Studio、Qt、Python 等。
3. 设计用户界面:使用选定的开发环境创建上位机程序的用户界面,包括按钮、文本框、图表等。
4. 建立通信连接:使用适当的通信协议和接口与下位机进行连接,如串口、以太网、USB 等。
5. 数据处理和显示:接收下位机发送的数据,并进行处理和显示,例如将温度数据显示在图表上。
6. 错误处理:编写错误处理代码,以应对通信错误或数据异常情况。
7. 测试和调试:进行全面的测试,确保上位机程序正常工作,与下位机的通信稳定。
8. 发布和维护:完成开发后,将程序发布给用户,并根据需要进行维护和更新。
基于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("发送失败。
上位机编程规范
上位机编程规范1、变量定义υ部件名称不超过40个字符,组成方式为A_B_C...。
υA部分表示前缀,B部分表示后缀。
υ紧跟着一条下划线“_”。
υA和B和…要有实际意义,具有一定的规律。
υ项目的变量定义最好是用统一的命名方式,如果变量用每个汉语拼音开头字母缩写都用每个汉语拼音开头字母缩写(如:水池液位:SCYW或者SC_YW),用英语都用英语,尽量简单化。
个别不容易识别变量的要在归档中加以注释说明;υ某些时候也可以用汉字来定义变量。
υ变量的定义应该用Excel文件保存一份完整的注释,同项目文件一起备份。
2、函数定义(1)函数的命名规则函数名=‘函数适用范围代码’ +‘f’+‘_’+‘函数功能描述’,其中函数的适用范围代码和意义如下:g 全局函数;w 窗口函数;m 菜单函数;u 用户对象函数。
例:检查SQL语句执行结果的全局用户函数命名如下:gf_checksql()。
(2)初始化配置文件初始化配置文件的命名必须与应用的名称一致,扩展名为.ini,例如:si.ini。
用户的可变环境信息都应该保存在该文件中,关键信息加密保存(哈希函数),并且提供管理工具,而不是手工修改该文件。
3、程序规范(1)书写格式⌝用分层缩进的写法显示嵌套结构的层次。
⌝在注释段与程序段,以及不同逻辑的程序段之间插入空行。
⌝每行只写一条语句,当需要滚动显示时应该分行书写。
(2)流程控制流程控制首先应遵守语法规范,且用分层缩进的写法突出显示嵌套的层次结构,例如:For i = 1 To 100For j = 1 To 50For k = 1 To 200Matrix[i,j,k]=1NextNextNext(3)注释及格式要求注释总是加在程序中需要概括性说明或不易令人理解或容易令人理解错的地方。
注释语言应简练、易懂而又准确,所采用的语种首选是中文,如有输入困难或特殊需求也可采用英文。
注释原则:a、函数或过程的注释⌝在函数头部必须说明函数的功能和参数(值参、变参);⌝在函数的主体部分,如算法复杂时,应以注释的方式对其算法结构做出说明;⌝函数申请全局资源且有可能导致资源紧张应加以注明(如内存和文件句柄等);⌝函数有副作用一定以十分醒目的方式(如加!号等)注明。
上位机和串口通信协议
上位机和串口通信协议《上位机与串口通信协议》一、概述《上位机与串口通信协议》描述了上位机与串口设备之间数据通信的规范。
本协议主要用于指导上位机与串口设备之间的数据传输,确保数据准确、高效地传输,同时保障通信双方的兼容性和稳定性。
二、协议内容1. 通信方式上位机与串口设备采用异步通信方式,数据按照规定的帧格式进行传输。
2. 通信协议版本本协议版本为V1.0。
3. 波特率通信波特率设定为9600bps。
4. 数据位通信数据位设定为8位。
5. 停止位通信停止位设定为1位。
6. 校验位通信校验位设定为无校验。
7. 帧格式通信帧格式如下:| 起始位 | 数据位 | 校验位 | 停止位 |其中,起始位为1位,数据位为8位,校验位为1位(可选),停止位为1位。
8. 数据传输过程上位机与串口设备在通信过程中,遵循以下步骤:(1)上位机发送命令帧至串口设备;(2)串口设备接收到命令帧后,进行解析,并返回应答帧至上位机;(3)上位机接收到应答帧后,进行解析,并根据需要发送下一条命令帧;(4)重复步骤2和3,直至通信结束。
9. 命令帧与应答帧命令帧与应答帧分为数据域和帧头/帧尾。
数据域包含命令/应答码、参数等信息。
帧头/帧尾用于标识一帧数据的开始和结束。
10. 错误处理当上位机或串口设备在通信过程中检测到错误时,应采取以下措施:(1)上位机在检测到错误后,可重新发送命令帧;(2)串口设备在接收到错误命令帧时,应返回错误应答帧,并等待上位机重新发送命令帧;(3)当上位机接收到错误应答帧时,应重新发送命令帧。
三、协议的实施与维护1. 实施本协议适用于上位机与串口设备的开发、生产、测试和维护环节。
相关人员在进行通信编程时,应严格遵守本协议。
2. 维护随着技术的发展和实际应用需求的变化,本协议可能需要进行修订。
相关人员在遇到问题时,应及时提出改进意见,并由协议制定者进行评估和更新。
四、附录附录中包含本协议所涉及的命令码、应答码及参数说明等详细信息,以便开发人员在实际应用中参考。
上位机快速开发教程
上位机快速开发教程上位机是指与下位机(如PLC、单片机等)通信的上层应用软件,通常用于监控、控制和管理下位机的运行状态和数据。
上位机的快速开发对于工业自动化和物联网应用非常重要。
下面是一个上位机快速开发的教程,帮助你初步了解并掌握上位机的开发过程。
首先,你需要选择一个适合的上位机开发平台。
常见的上位机开发平台有LabVIEW、C++、Java、Python等,选择适合自己的开发平台可以提高开发效率和开发体验。
这里以Python为例,因其简洁、易用和广泛应用。
第二步是编写上位机的通信代码。
上位机需要与下位机进行通信,通常通过串口、网络或者其他通信协议实现。
在Python中,你可以使用PySerial库进行串口通信,使用Socket库进行网络通信。
根据你的具体需求,选择合适的通信方法,并编写相应的通信代码。
第三步是设计上位机的用户界面。
上位机的用户界面直接影响用户的交互体验和工作效率。
你可以使用Python的GUI编程库,如Tkinter、PyQt等,设计一个直观、易用、美观的用户界面。
在设计用户界面时,要根据实际需求考虑布局、按钮、文本框、图表等元素的摆放和使用。
第四步是处理和显示下位机数据。
上位机通常需要处理和显示从下位机传来的数据。
在Python中,你可以使用Numpy和Matplotlib等库来进行数据处理和绘图。
根据你的需求,编写相应的数据处理代码,并将数据显示在用户界面上。
第五步是进行测试和调试。
测试和调试是开发过程中不可忽视的重要环节,可以确保上位机的稳定性和可靠性。
你可以编写一些测试用例,模拟不同的场景进行测试,并根据测试结果进行调试和优化。
最后,进行上位机的部署和发布。
你可以将上位机的代码打包成可执行文件,方便用户安装和使用。
你还可以编写用户文档,介绍上位机的使用方法和注意事项。
通过以上快速开发教程,你可以初步了解和掌握上位机的开发过程。
当然,上位机的开发还有很多细节和技巧需要进一步学习和掌握。
用MATLAB的GUIDE工具做有GUI界面的串口通信上位机
这是我非常久之前写串口通信程序时编的,网上这写资料非常少,我是瞧着MATLAB 的关心文档自己一点点写的,尽管最后放弃了matlab上位机程序的方案,然而依然整理了一下之前的一些收获,写下以下的讲明。
编译环境:MATLAB2021a1翻开GUIDE工具,点击红圈中的GUIDE图标。
2直截了当利用默认设置点OK即可3在控件篮拖拽控件到如以如下面图的形式4 进行控件设置,右击控件点“PropertyInspector〞,如图一般仅设置Tag选项和String选项。
其中String选项在按钮控件中确实是基本GUI显示时的字符。
Tag属性较为重要,在GUI编程时控件的索引要紧利用Tag选项的属性同时在GUI生成回调函数时候也是由Tag属性的值命名的。
这个地方将“翻开串口〞按钮控件的String设置为“翻开串口〞,tag 设置为pb_OpenSerialPort。
具体控件的设置和关于GUI的编程依然瞧下关心〔截图局部〕或寻本这方面的书瞧一下。
这个地方对我马上用的功能简述一下,MALTAB的GUI要紧由两个文件,当设置好GUIDE时点击保留,这时将在当前路径自动产生两个名字相同的文件,但扩展标识符不同,一个为.fig文件,一个为.m文件,.fig要紧是GUI图形文件,和GUIDE设计的图像相同,.m文件为程序文件,所有事件响应和计算功能都在这个地方实现。
MATLAB的按钮以及各种控件事件响应是依靠一种喊做回调函数(CallbackFunction)来实现的(我理解为和VisualC++中的消息映射,C#中的异步托付事件响应一种原理),自动生成的M文件中差不多自动做好回调函数的名称和参数了,我们需要做的确实是基本在其中添加你要进行的处理。
例如:我们要在鼠标单击按钮“翻开串口〞时进行一系列的串口初始化动作,这时右键单击“翻开串口按钮〞如图那么MALAB会自动转向相应的M文件的回调函数的位置。
如图这个地方,因为该按钮的Tag为"pb_OpenSerialPort",那么GUIDE自动生成的回调函数名即为pb_OpenSerialPort_Callback,函数有三个参数,•hObject是当前控件对象,即翻开串口按钮对象〔面向对象技术中的概念〕,索引或设置当前对象〔翻开串口按钮对象〕时只需要引用hObject就能够了。
基于LABVIEW的上位机串口通信程序设计
基于LABVIEW的上位机串口通信程序设计汤佳明;安伟【摘要】基于简化计算机与外部串行设备或其他计算机之间串口通信软件开发流程的目的,采用了依据串口通信原理使用LABVIEW作为上位机程序开发平台的方法,运用图形化程序语言搭建上位机串口通信监控界面.通过由虚拟串口通信驱动软件建立虚拟串口通道用于模拟上位机与外部设备数据通信过程的试验,可得出在建立两个对应串口的基础上文中设计的两种数据通信方式均可完整传输数据、且能够以一个指定的终止字符形式结束传输过程的结论.总的来说,本文设计的上位机串口通信程序简单易懂,相应的监控界面也简洁易用,两者结合在实际近距串口通信中拥有一定的实用与参考价值.%Based on the purpose of simplifying the process of developing the serial communication software between computer and external serial device or other computer. According to the principle of serial port communication,use LABVIEW as host computer program development platform. Its graphical programming language is used in establishing the monitoring interface of the host computer. Through Virtual Serial Port Driver(VSPD),virtual serial port channels are built in order to simulate the data communication process between the host computer and external device. So,here get the conclusion that with two corresponding serial ports, two data communication methods designed in the article can completely transmit data and the process can be finished by a specified termination character. In summary,this serial port communication program of host computer is easy to understand,its homologous monitoring interface is simple and easy-to-use. Both of thempossess certain practical and reference value in actual short distance serial port communication.【期刊名称】《电子设计工程》【年(卷),期】2018(026)011【总页数】5页(P86-90)【关键词】串口通信;LABVIEW;VSPD;模拟【作者】汤佳明;安伟【作者单位】江南大学机械工程学院,江苏无锡214122;江南大学机械工程学院,江苏无锡214122【正文语种】中文【中图分类】TN919随着工业自动化进程的不断深入,虚拟仪器的使用越来越普遍,上位机作为虚拟仪器的一部分在工业生产与科学研究领域也被广泛得使用,在测控与软件设计方面已有了许多成功实例。
自制VB上位机串口监控简单程序
将该控件拖到Form1里,然后按照界面的要求把要到得控件都添加到Form1里去,然后按照自己的想法去改每个控件的属性。(不一定非按我这个,你自己怎么想的就怎么定义即可,这个名字什么的其实是很灵活的)(NAME属性是在界面上看不到的,在写程序的时候会用到)
四.
写程序,双击每一个控件都会出来对应的程序。编好之后生成.EXE文件即可。就能和你的单片机进行简单的通讯啦!(注:你在上位机里设置的波特率是要和你的单片机里的下位机程序中的波特率是匹配的要不也是没有办法通讯的。)
如果没有我这给你提供下载。
下载完之后就是注册(我也不明白为什么,谁看了MSDN上的文档谁知道,我没看)
注册步骤:
一、开始------>运行----->输入 Regsvr32 MSComm32.ocx(注:我这里写的并不是我看的原始的文件上的注册表达式 原始式是 Regsvr32 C:\winnt\system32\MSComm32.ocx我试过之后不行才改到现在的表达式)这一步完了之后你已经有MSComm控件选项了,但是你还不能用还需要再次注册下(为什么?我也不知道)
自制VB上位机串口监控简单程序(内详)
前两天说要做一个VB的上位机程序,今天算是做出来最基础的部分了,趁有时间,先拿出来和大家分享下。自我感觉很有用,并且附件里的.exe和程序都可以直接用是本人调试过的,没有任何问题。
此上位机程序要实现的功能就是和51单片机进行简单的串口接收发送。
步骤:
1、装上VB的软件(废话)我用的是VB6.0的软件
2、装完之后看看有没有要的MSComm控件。如果没有还要下哦!
3、就是编写相应的上位机下位机程序啦。(我用VB编的感觉做这个还是很方便的前后用了两天半左右吧中间还又返回去重新看了串口编程的部分)
上位机和单片机串口编程---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;}上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。
易语言串口通讯modbus协议模块上位机必备例子源代码
易语言串口通讯modbus协议模块上位机必备例子源代码1.引言1.1 概述在编写易语言串口通讯modbus协议模块上位机必备例子源代码之前,我们首先需要了解一些基本概念和背景知识。
本文介绍了该例子的目的和结构,以及引言、正文和结论三个主要部分的内容。
1.1概述Modbus协议是一种常用的串行通信协议,广泛应用于工业自动化领域。
它被设计用于在不同设备之间进行数据传输和通信。
Modbus协议简洁明了,易于实现和部署,因此被许多工业设备和上位机所采用。
易语言是一种面向过程的编程语言,易于学习和使用。
它提供了丰富的库和模块,方便我们进行串口通讯编程。
易语言的特点是语法简单易懂,同时也支持调用其他语言编写的DLL函数,可以实现更加复杂的功能。
本例子的目标是演示如何使用易语言编写一个串口通讯的Modbus 协议模块,并结合上位机的必备功能来实现数据的读写和显示。
在正文部分,我们将介绍Modbus协议的简要概述,包括其通信方式、数据格式、功能码等。
同时,我们还将介绍易语言中的串口通讯模块及其基本用法。
在结论部分,我们将提供一些实例源代码示例,以便读者更好地理解和使用这个例子。
此外,我们还将列举一些上位机必备的功能,以供读者参考和扩展应用。
通过这个例子,读者可以学习到如何使用易语言进行串口通讯编程,并了解Modbus协议在实际应用中的运用。
同时,读者也可以根据自己的需求和实际情况,对例子进行二次开发和改进,以适应不同的应用场景。
在下一节中,我们将详细介绍Modbus协议的相关知识,以便读者更好地理解本例子的内容和实现。
文章结构部分主要是对整篇文章的组织和安排进行介绍,以下是1.2 文章结构的内容:1.2 文章结构本文主要分为三个部分,包括引言、正文和结论,具体如下:1. 引言部分介绍了本文的概述、文章结构和目的。
在概述中,我们对易语言串口通讯modbus协议模块上位机必备例子源代码进行了简要介绍,指出了本文的主要内容和目标。
通过串口接受PC上位机数据,并在液晶屏上显示的方案设计
通过串口接受PC上位机数据,并在液晶屏上显示的方案设计1、系统主要设计思想本系统是以单片机C语言来进行软件设计,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,硬件在软件的控制下协调运作。
本系统分为上位机和下位机两部分。
下位机利用单片机对温度传感器采集到的温度数据定时采样,并在液晶屏上显示,同时将采集到的温度数据通过串口传送到上位PC机上;上位机在屏幕上显示温度数据,若温度超过一定阀值,在屏幕上告警,下位机也能实时显示环境温度,并且具备报警功能。
下位机主要采用支持在线下载的ATMEL 公司生厂的S系列单片机AT89S51来驱动字符型液晶显示模块MS12864R,驱动温度传感器,和语音报警芯片ISD1110;上位机采用采用VisualBasic语言编写。
2、系统设计的主要功能及技术指标(1)利用单片机对温度传感器采集到的温度数据定时采样,并有显示。
(2)将采集到的温度数据通过串口传送到上位PC机上。
(3)上位机能在屏幕上显示温度数据。
(4)当温度超过50摄氏度时,通过语音报警电路实现语音报警。
(5)温度范围为0-99摄氏度;温度误差为±1摄氏度。
3、系统硬件电路设计本系统硬件部分由单片机最小系统(即单片机主控芯片、时钟电路、复位电路)、液晶显示电路、温度采集电路、语音报警电路、上位机电路等模块组成。
整机电源电路采用7805转换为直流5V给整个电路供电。
液晶显示模块采用的是MS12864R液晶显示器,它是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16×16点汉字,和128个16×8点ASCII字符集。
利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
低电压低功耗是其又一显著特点。
温度采集模块采用DS18B20温度传感器。
单片机与PC机串行通信系统硬件及上位机程序设计【精选】
目录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。
串行口不同于并行口,它的数据和控制信息是一位接一位在一根传输线上传送的,这样串行口较并行口能够进行远距离传送信息。
上位机串口通信编程
上位机串⼝通信编程摘要本⽂主要描述了利⽤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++编写简单串口上位机程序串口通信,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,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。
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等。
最后简单的上位机界⾯如下:
三、⽰例
花了两天时间,做了个半成品。
发送数据,没能输⼊。
接收数据,没有滑轮可以上下滑动。
是否选择⼗六进制没有、保存窗⼝没有。
没时间懒得弄了,之后⼜需要再做开发。
⽰例下载:
参看:
参看:。
串口编程的一般步骤及相关函数讲解
串口编程的一般步骤及相关函数讲解串口编程是指通过串口与外部设备进行通信的程序设计。
一般步骤包括串口初始化、设置串口参数、打开串口、发送数据、接收数据和关闭串口等。
1. 串口初始化:首先需要导入串口编程相关的库文件,如pyserial 库。
然后通过serial.Serial(函数创建一个串口对象,指定串口号、波特率、停止位、数据位等参数,如:``````这里将串口号设置为/dev/ttyUSB0,波特率设置为9600,超时时间设置为1秒。
2.设置串口参数:通过串口对象的相关方法设置串口参数,如:```serial_port.setBaudrate(9600)serial_port.setParity(serial.PARITY_NONE)serial_port.setStopbits(serial.STOPBITS_ONE)serial_port.setByteSize(serial.EIGHTBITS)```这里设置了波特率为9600,无奇偶校验位,1位停止位,8位数据位。
3. 打开串口:使用串口对象的open(方法打开串口,如:serial_port.open```注意,打开串口之前要确保串口没有被其他程序占用。
4. 发送数据:使用串口对象的write(方法向串口发送数据,如:```data = 'Hello, World!'serial_port.write(data.encode()```这里将字符串'Hello, World!'转码为字节型数据并发送到串口。
5. 接收数据:使用串口对象的read(方法从串口读取数据,如:```received_data = serial_port.read(10)print(received_data.decode()```这里从串口读取10字节的数据,并将其解码为字符串输出。
6. 关闭串口:使用串口对象的close(方法关闭串口,如:```serial_port.close在程序结束时,记得关闭串口以释放资源。
VB编写上位机实例
VB编写上位机实例用VB编写上位机实例(转载)用VB6.0编写第一个串口通信上位机程序Visual Basic6.0是一个可视化窗口环境的编程软件,目前使用VisualBasic6.0可以快速简单编写单片机中的串口通信上位机程序。
下面我们以一个完整的通信试验为例子完成如何用Visual Basic6.0编写单片机串口通信程序。
单片机学习 HPOO打开安装好后的Visual Basic6.0主程序界面。
选择“标准EXE”。
如图1显示,建立Visual Basic的编程环境。
图1在菜单的[工程]选项中选择[部件],如图2。
把Visual Basic的串口通信控件Microsoft Comm control 6.0调入工作菜单。
图2在打开[部件]对话框中,选择Microsoft Comm control 6.0的选项框,点击[确定]。
图3图3可以在图示3中可以看通信控件Microsoft Comm control 6.0的文件是在C:\WINNT\system32\MSCOMM32.OCX文件。
如果大家在首次调用通信控件Microsoft Comm control 6.0控件时无法在控件对话框中找到,请直接在系统目录中搜索名为MSCOMM32.OCX文件。
然后通过浏览加入VB的工作界面中。
添加完控件回到编程界面。
如下图4。
图4通过右边的菜单把一些必要的控件放在窗体中。
然后点击窗体中的Timer控件按F4弹出属性窗口进行设置。
其具体设置如下:调频FM发射话筒制作套件Timer定时器控件设置属性,(通过按F4键可弹出此窗口)Mscomm通信控件参数属性设置(通过单击控件的右键属性可弹出此窗口)单片机设计本文用到的其他控件:CommandButton控件和TextBox控件按默认属性设置不变。
以上设置完成,回到编程窗体区中,任意双击。
会显示Visual Basic的程序窗体的Load事件程序。
在代码窗口中输入:Private Sub Form_Load()MSComm1.PortOpen = True'窗体的加载时,就打开通信端口,通信端口的参数也可以在此指定Timer1.Enabled = Timer1.Enabled'窗体的加载时,同时定时器控件事件End Sub 电子元件邮购网这样设置目的是当程序在打开是,首先打开通信控件MSComm,注意这里的串口通信参数中的波特率设置是默认参数的。
上位机设计方案
上位机设计方案1. 引言本文档旨在介绍上位机设计方案的详细内容。
作为一种用于控制下位机设备的软件应用程序,上位机在工业自动化和嵌入式系统中扮演着至关重要的角色。
本文将介绍上位机的概念、设计原则、功能需求以及具体的软件实现方案。
2. 概述2.1 上位机的定义上位机是指运行在PC或嵌入式平台上的一种软件应用程序,用于与下位机设备进行通信、监控和控制。
上位机可通过各种通信协议(如RS232、CAN、以太网等)与下位机通信,并与用户交互界面实现数据的可视化和操作控制。
2.2 设计原则上位机设计应遵循以下原则:•界面友好性:提供直观、易用的用户界面,使操作人员能够方便地进行操作和监控。
•实时性:能够实时获取并显示下位机设备的状态和数据,及时采取相应的控制措施。
•可扩展性:支持多种通信协议和设备接口,能够与不同类型的下位机设备进行通信。
•稳定性和可靠性:保证上位机应用程序的稳定运行,防止数据丢失和系统崩溃。
3. 功能需求基于上述设计原则,下面列出了上位机的主要功能需求:•与下位机通信:支持各种通信协议,如RS232、CAN、以太网等,确保与下位机设备的稳定通信。
•数据采集和显示:实时获取下位机设备的传感器数据,通过图表、表格等方式显示给用户。
•参数设置和控制:支持设置下位机设备的参数,并根据需要进行控制。
•数据存储和导出:将采集到的数据存储在本地数据库中,并支持导出到Excel等格式。
•报警和事件处理:根据设定的阈值进行报警,并能够及时处理异常事件。
•远程监控和控制:支持远程访问和操作,方便对设备进行远程监控和控制。
4. 软件实现方案基于上述功能需求,我们将采用以下软件技术和工具来实现上位机应用程序:•开发语言:选择一种主流的编程语言,如Python、C#、Java等,根据项目需求选择合适的开发语言。
•开发平台:选择一种常用的集成开发环境(IDE),如Visual Studio、Eclipse等。
•数据库:选择一种适用于数据存储和查询的数据库,如MySQL、SQLite等。
上位机及下位机程序编写规范及建议
上位机及下位机程序编写规范及建议PLC程序编写规范及建议为了提高程序的可读性~稳定性~高效性~易调用~方便各部门PLC程序的编写~调试及维护工作~有必要也务必要制定一项通用的程序编写规范~鉴于此~本人提出以下几个方面的规范建议~以供大家共同商讨。
控制功能方面:阀门的控制~由于电动阀门的控制中~一个控制周期较长~为了不让在调试或者阀门的误操作上面~让阀门开关过程影响相关设备的控制~造成设备安全影响~故需要将阀门的控制做一个逻辑上的中间停止中断操作~即可让阀门处于一个中间状态~然后再进行开关控制选择。
各设备控制每个参与控制的设备~必须事先预留自控、触摸屏、故障屏蔽接口~以便功能扩展。
设备在控制方式转变后必须考虑设备安全的前提下~值得注意的是~建议转换开关由远程切换到手动时~上位机给出输出的指令一律清零~以免造成再次将设备由手动转换到远程~设备继续执行上一次的转换前动作~造成手动动作造成的远程指令:自动控制必须事先了解整个工艺流程的情况下~预先考虑到每个设备间的各种组合搭配~一一做出相应的条件判断~然后做出相应符合条件的指令。
在程序编译前~应详尽的做出中文注释~注释包含组合搭配条件~运行条件~在每一符合条件的程序段必districts under the jurisdiction of great thanks, South ofthe River, River North, Mao Ta, 6 towns, less than 5 km from the enemy town of shengze, only separated by a wide range of XI Bai Yang. For the time being, Sheng diwei forces are often deployed at dawn, Mao Ta, ShengTang Hong Kong fringe areas, and sometimes invasive South of the River, at须注释条件及指令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们飞思卡尔智能车的比赛已经接近尾声了,23号就要去上海决赛了呵。
论文基本完成,Duuboo已经排版结束,排出来还真挺长的。
整个过程都挺累的,持续的时间还这么长,最累的恐怕只有惠哥了,这些比赛完再说吧。
这里介绍下在Donald写的一个串口调试程序,主要是方便我们查看运行起来的小车的内部参数。
程序的作用是接收来自Freescale MC9SDG128单片机发送来的数据,并显示出来。
分为两部分。
一部分是普通的数据,ASCII数据,另一部分是实时的图像,也是以ASCII方式传输。
程序可通过“模式”按钮设置工作在这两种模式。
当进入CCD模式时,通过“连接”按钮触发DG128单片机发送图像信息,这时“连接”按钮变为“断开”,可通过其触发DG128单片机停止发送,降低单片机内部资源消耗。
程序中串口部分的编程参考的是《Visual C++串口通信技术与工程实践》,李现勇编著。
书中对串口的编程讲得很不错,除了C的,还有VB的。
详细请参考该书。
这里介绍本程序的一部分程序代码。
一、添加串口控件
本程序是在VC6下MFC实现,所以添加一个串口控件,方法是选择Project菜单下Add To Project子菜单中的 Components and Controls选项,在弹出的对话框中进入Registered ActiveX Controls目录,选择Microsoft Communication s Control, version 6.0,,Insert到Project中就行了。
然后可在窗体中添加串口控件,接着Ctrl+W到ClassWizard中为该控件添加一个对应的变量就行。
二、串口工作方式的改变
串口的工作方式有很多种,比如串口的选择、波特率、校验位、数据位和停止位等。
这些的设置可以通过组合框实现,实现方法基本一样,Donald就以波特率说明下。
之前已经为波特率组合框对象IDC_COMBO_BAUD添加对应变量m_cboBaud。
在程序主窗体初始化时写有如下代码。
// combo Baud init
m_cboBaud.AddString(_T("1200"));
m_cboBaud.AddString(_T("2400"));
m_cboBaud.AddString(_T("4800"));
m_cboBaud.AddString(_T("9600"));
m_cboBaud.AddString(_T("115200"));
m_cboBaud.SetCurSel(3);
m_strBaud = _T("9600");
再在ClassWizard中为IDC_COMBO_BAUD添加CBN_SELCHANGE消息处理函数,再在函数中添加代码。
switch (m_cboBaud.GetCurSel())
{
case 0:
m_strBaud = _T("1200");
break;
case 1:
m_strBaud = _T("2400");
break;
case 2:
m_strBaud = _T("4800");
break;
case 3:
m_strBaud = _T("9600");
break;
case 4:
m_strBaud = _T("115200");
break;
default:
m_strBaud = _T("9600");
}
InitCommPort();
通过switch选择不同的波特率。
case的顺序按照初始化添加时的顺序,开始为0。
三、OnComm()消息处理函数
在串口控件中,最重要的就是OnComm()函数,这个函数是用来处理串口消息事件的,每当串口接收到数据,就会产生一个串口接收数据缓冲区中“有字符”的消息事件,只要在该函数内写好处理这些字符的代码就可以。
在Donald的这个程序里,该程序代码如下。
代码的结构(switch结构)是参考该书。
VARIANT variant_inp;
COleSafeArray safearray_inp;
CByteArray arraySend;
LONG len,k;
BYTE rxdata[1024]; //An 8-bit integer that is not signed for Receiv e
CString strAdd;
int i;
m_strComRcv.Empty();
switch(m_com.GetCommEvent())
{
case 1: // comEvSend
arraySend.RemoveAll();
arraySend.SetSize(m_strEditTrn.GetLength());
for (i = 0; i < m_strEditTrn.GetLength(); i++)
{
arraySend.SetAt(i, m_strEditTrn.GetAt(i));
}
m_com.SetOutput(COleVariant(arraySend));
break;
case 2: // comEvReceive
variant_inp = m_com.GetInput(); // Read buffer
safearray_inp = variant_inp; // VARIANT to ColeSafeArray
len = safearray_inp.GetOneDimSize(); // Get effective length
// Store to EDIT_REV
for(k = 0; k < len; k++)
{
safearray_inp.GetElement(&k, rxdata + k); // Change to BYTE ar ray
BYTE bt = *(char*)(rxdata+k); // BYTE type
strAdd += bt;
}
if (m_bCcdMode == FALSE){
m_myEdit.AppendText(strAdd);
} else{
g_strRcv = strAdd;
g_bReceive = TRUE;
}
break;
default: // Error
m_com.SetOutBufferCount(0);
//AfxMessageBox("Com Err");
break;
}
使用控件编程就是相对简单,系统的串口消息发生时,程序自动调用该函数。
由switch语句判断,参数1为发送,参数2为接收。
Donald主要介绍下接收的思路,由于接收时有两种模式,所以通过m_bCcdMode成员变量记录这两种模式。
当其为FALSE时直接实时显示在窗口右边,就像Windows处事的超级终端。
如果。