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

合集下载

C#上位机之—WinForm实现串口通信示例

C#上位机之—WinForm实现串口通信示例

C#上位机之—WinForm实现串⼝通信⽰例上位机开发常⽤到串⼝通信来控制设备,串⼝通信的主要参数:COM⼝,波特率(9600),停⽌位(One),数据位(8),校验位(None),括号中的是常⽤值,具体意思我也不太懂,会⽤能实现功能就⾏哈哈;开发⼯具:VS2012; 开发前需要添加以下服务引⽤:.......using System.IO.Ports;窗体搭建,因为没有串⼝设备供调试,所以我⽤虚拟串⼝即两个串⼝互相连接来实现通信,窗体分为上下两部分,对应两个串⼝区,上图为虚拟串⼝设置,下图为Winform样式:⾸先创建⼀个baseCom类:1.声明变量,构造函数:public delegate void delegateOnShowMsg(comType type,string msg);public delegate void delegateOnOpenCom(comType type, bool onOff);public event delegateOnShowMsg OnShow;public event delegateOnOpenCom OnOpen;comType type;string baudRate = string.Empty;string parity = string.Empty;string stopBits = string.Empty;string dataBits = string.Empty;string portName = string.Empty;public System.IO.Ports.SerialPort comPort = new System.IO.Ports.SerialPort();public baseCom(string portName, string baudRate, string stopBits, string dataBits, string parity,comType type){this.portName = portName;this.baudRate = baudRate;this.stopBits = stopBits;this.dataBits = dataBits;this.parity = parity;this.type = type;}View Code2.打开串⼝和关闭串⼝函数:public void OpenPort(){try{if (comPort.IsOpen)comPort.Close();comPort.BaudRate = int.Parse(baudRate);comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBits);comPort.DataBits = int.Parse(dataBits);comPort.Parity = (Parity)Enum.Parse(typeof(Parity), parity);comPort.PortName = portName;comPort.Handshake = Handshake.None;comPort.Open();if (comPort.IsOpen){showOnoff(true);comPort.Handshake = Handshake.None;comPort.DataReceived += comPort_DataReceived;}showMsg(portName + " Open Success");}catch (Exception ex){showMsg("Unable to Open " + portName);showMsg(ex.Message);showOnoff(false);}}public void ClosePort(){if (comPort.IsOpen){comPort.Close();comPort.Dispose();showOnoff(false);showMsg(portName + " Close Success");}}View Code3.接受数据和发送数据函数:public void comPort_DataReceived(object sender,SerialDataReceivedEventArgs e) {try{int n = comPort.BytesToRead;if (n == 0)return;byte[] buffer = new byte[n];comPort.Read(buffer, 0, n);string rcv = Encoding.Default.GetString(buffer, 0, buffer.Length);showMsg("RECV:" + rcv);}catch (Exception ex){ClosePort();showMsg("Com Closed:" + ex.Message);}}public void comPort_SendData(string msg){if (msg == ""){showMsg("CAN Not EMPTY");return;}if (comPort == null){showMsg("First Open Port");return;}if (!comPort.IsOpen){showMsg("COM Not Open");return;}byte[] data = Encoding.Default.GetBytes(msg);comPort.Write(data, 0, data.Length);showMsg("SEND:" + msg);}View Code4.显⽰信息,显⽰状态函数:public void showMsg(string msg){if (OnShow != null)OnShow(type, msg);}public void showOnoff(bool flag){if (OnOpen != null)OnOpen(type, flag);}public enum comType{_up,_down}View CodeOK,baseCOM类已定义完成,现在编写窗体各控件的功能函数:1.初始化控件,主要是下拉菜单的Item的添加,初始值,初始状态:public string[] baudRates = { "2400", "4800", "9600", "19200", "39400", "43000", "56000" };public string[] paritys = { "None", "ODD", "Even" };public string[] dataBits = { "5", "6", "7", "8" };public string[] stopBits = { "None", "One", "Two", "OnePointFive" } ;public void InitControls(){comboBox_com.Items.Clear();comboBox_baudRate.Items.Clear();comboBox_dataBits.Items.Clear();comboBox_parity.Items.Clear();comboBox_StopBit.Items.Clear();comboBox_com2.Items.Clear();foreach (var v in baudRates)comboBox_baudRate.Items.Add(v);foreach (var v in stopBits)comboBox_StopBit.Items.Add(v);foreach (var v in paritys)comboBox_parity.Items.Add(v);foreach (var v in dataBits)comboBox_dataBits.Items.Add(v);foreach (var v in System.IO.Ports.SerialPort.GetPortNames()){comboBox_com.Items.Add(v);comboBox_com2.Items.Add(v);}comboBox_com.SelectedIndex = 0;comboBox_baudRate.SelectedIndex = 2;comboBox_dataBits.SelectedIndex = 3;comboBox_parity.SelectedIndex = 0;comboBox_StopBit.SelectedIndex = 1;comboBox_com2.SelectedIndex = 0;}View Code2.声明两个COM类,comUp和comDown:public delegate void delegateOnOff(comType type,bool onoff);//定义两个委托public delegate void delegateShow(comType type,string msg);//为了防⽌报错“从不是创建控件的线程控制它”baseCom comUp; // 定义上串⼝COMbaseCom comDown; //定义下串⼝COMImage imgOn, imgOff; //指⽰灯Thread th; //线程⽤来实现⾃动发送3.编写打开(关闭)串⼝按钮点击事件(打开comUp和打开comDown代码⼀样,只贴出comUp):private void button_OpenCom_Click(object sender, EventArgs e){string cmd = ((Button)sender).Text.Split('')[0];if (comUp != null)comUp.ClosePort();if (cmd == "Close")return;string s1 = comboBox_com.SelectedItem.ToString();string s2 = comboBox_baudRate.SelectedItem.ToString();string s3 = comboBox_StopBit.SelectedItem.ToString();string s4 = comboBox_dataBits.SelectedItem.ToString();string s5 = comboBox_parity.SelectedItem.ToString();comUp = new baseCom(s1, s2, s3, s4, s5,comType._up);comUp.OnOpen += SignalState;comUp.OnShow += ShowMsg;comUp.OpenPort();}View Code4.编写发送数据按钮点击事件:private void button_Send_Click(object sender, EventArgs e){if (comUp != null) Port_SendData(textBox_ComSend.Text);}5.编写数据接受发送显⽰到⽂本框及状态指⽰灯变化函数:public void SignalState(comType type,bool onoff){if (this.InvokeRequired){delegateOnOff d = new delegateOnOff(SignalState);this.Invoke(d,new object[]{type,onoff});}else{if (type == comType._up){pictureBox_ComSignal.Image = onoff ? imgOn : imgOff;button_OpenCom.Text = onoff ? "Close COM" : "Open COM";}else{pictureBox_Com2.Image = onoff ? imgOn : imgOff;button_OpenCom2.Text = onoff ? "Close COM" : "Open COM";}}}public void ShowMsg(comType type, string msg){if (this.InvokeRequired){delegateShow d = new delegateShow(ShowMsg);this.Invoke(d, new object[] { type, msg });}else{string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n";if (type == comType._up){textBox_serialPort.Text += (date + msg + "\r\n");}else{textBox_serialPort2.Text += (date + msg + "\r\n");}}}View Code6.Monitor函数,即线程函数,⽤来实现数据⾃动发送(没有进⾏准确定时,⼤概设了个间隔):public void Monitor(){double i =0;while (i++<10000000000){if (i == 1000000000){i = 0;if (checkBox_AutoSend.Checked){if (comUp != null)Port_SendData(textBox_ComSend.Text);}if (checkBox_AutoSend2.Checked){if (comDown != null)Port_SendData(textBox_comSend2.Text);}}}}View Code⾄此,串⼝通信功能已基本实现,可在此框架上进⾏实际应⽤开发,编码新⼿,欢迎⼤家批评指正!看下效果图(COM1和COM11虚拟连接):。

自己用VB编制的上位机(MSComm控件)

自己用VB编制的上位机(MSComm控件)

自己用VB编制的上位机(MSComm控件)本人初学者,许多地方显得粗糙笨拙,但总算是成功了,不过自我感受VB真的很简单,我大致学了两三个星期就可以了。

本文只同向我一样的初学者分享一下经验,毕竟咱不是专业的。

下面开始。

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

我们利用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默认为一组。

C#串口通信:MSComm控件使用详解

C#串口通信:MSComm控件使用详解

C#串口通信:MSComm控件使用详解目次MSComm 控件两种处理通讯的方式CommPort 属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。

MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。

Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。

具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。

1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。

在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。

在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。

OnComm 事件还可以检查和处理通讯错误。

所有通讯事件和通讯错误的列表,参阅CommEvent 属性。

在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。

这种方法的优点是程序响应及时,可靠性高。

每个MSComm 控件对应着一个串行端口。

如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。

基于VC++的Modbus协议串口通信设计与实现

基于VC++的Modbus协议串口通信设计与实现

158串行通讯的距离从几米到几千米,传输线最少时只需一根即可实现通信,比较适合远距离通讯传输,在工业控制、测量设备以及远程监控中串行通讯广泛使用。

Microsoft Visual C++作为微软公司面向对象程序的开发平台,具有集成的开发环境,支持C、C++等编程语言。

ModBus协议在OSI七层参考模型中作为应用层协议,是全球最早应用于工业现场的总线协议。

目前,ModBus协议已经成为一种通用工业标准,不同设备通过ModBus协议可以组成工业网络,实现集中监控。

本设计针对V C ++开发平台设计并实现了基于ModBus协议的串口通讯软件。

1 串口通信原理1.1 串行通信的特点串口通信的特点是数据流在通讯传输线上逐位按顺序分时进行传输,每次通信双方传输一个数据位,也就是一个二进制数0或1,以最小单位二进制数0或1逐位进行传输。

串口通信分为三种传输模式,分别是全双工、半双工和单工,具体划分是按照数据流的方向划分,数据通常是在通信双方的二个站点之间点对点进行传输[1]。

1.2 串行通信的接口标准一个完整的的串行通信系统如图1所示,该系统包括数据终端设备(Data Terminal Equipment ,DTE)和数据通信设备(Data Communication Equipment,DCE)。

串行接口标准定义了DTE的串行接口电路与DCE之间的连接标准,包括连接电缆、接口几何尺寸、引脚功能和电平定义等,在计算机网络中,构成网络的物理层协议。

1.3 串行传输协议通讯协议是一种对通讯双方之间进行通讯交流规则的约定。

协议中规定了双方进行通讯的数据格式、传送速度、控制字符、同步方式、检错方式及传送步骤。

通讯协议属于OSI七层参考模型中的数据链路层[2]。

串口通讯按照同步方法的不同分为异步传输和同步传输。

1.4 Modbus通信协议按照OSI七层参考模型,Modbus通讯协议属于应用层协议,是一种全球通用的工业标准。

手把手教你VC上位机MFC利用串口控件发送接收数据

手把手教你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。

labview中我现在在做一个上位机对串口发送ASCII码和十六

labview中我现在在做一个上位机对串口发送ASCII码和十六

labview中我现在在做一个上位机对串口发送ASCII码和十六在LabVIEW中使用串口第一部分使用LabVIEW系统VI一、串口VI介绍LabVIEW的串口通讯VI位于Instrument I/O Platte的Serial中,包括:VI名称 VI功能VISA Configure SerialPort初始化VISA resource name指定的串口通讯参数 VISA Write 将输出缓冲区中的数据发送到VISA resource name指定的串口VISA Read 将VISA resource name指定的串口接收缓冲区中的数据读取指定字节数的数据到计算机内存中VISA Serial Break 向VISA resource name指定的串口发送一个暂停信号VISA Bytes at SerialPort查询VISA resource name指定的串口接收缓冲区中的数据字节数 VISA Close 结束与VISA resource name指定的串口资源之间的会话VISA Set I/O BufferSize设置VISA resource name指定的串口的输入输出缓冲区大小VISA Flush I/O Buffer 清空VISA resource name指定的串口的输入输出缓冲区二、使用说明在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。

图1、串口操作数据流图首先需要调用VISA Configure Serial Port完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。

图2、初始化串口如果初始化没有问题,就可以使用这个串口进行数据收发。

发送数据使用VISA Write,接收数据使用VISA Read。

在接收数据之前需要使用VISA Bytes at Serial Port查询当前串口接收缓冲区中的数据字节数,如果VISA Read要读取的字节数大于缓冲区中的数据字节数,VISA Read操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤

在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤
void CCommTestDlg::OnBnClickedButtonSend() {
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
void CCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
10. 添加关闭串口按钮的消息响应函数 void CCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口 1 已关闭")); } 11. 添加发送按钮消息响应函数 void CCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容 } 12. 接收数据 void CCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data[1024]={0}; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符 {

上位机串口通信编程

上位机串口通信编程

上位机串⼝通信编程摘要本⽂主要描述了利⽤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,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。

串口传输实验总结

串口传输实验总结

串口传输实验总结引言串口通信是一种常见的数据传输方式,特别适用于嵌入式系统和电子设备之间的通信。

在本次实验中,我们通过使用串口通信来实现数据的传输和接收。

本文档将总结我们在这个实验中的经验和教训,并提供一些关于串口传输的相关知识。

实验背景串口,也被称为通用异步收发传输器(UART),是一种用于在电子设备之间传输数据的常见接口。

串口通信使用两根线来传输数据,一根用于发送数据(Tx)而另一根用于接收数据(Rx)。

串口通信的一个重要特点是它是异步的,即发送端和接收端可以根据各自的节奏进行数据传输。

实验过程我们在本次实验中使用了一块嵌入式开发板和计算机之间的串口通信来实现数据传输。

以下是我们完成实验的步骤:1.配置串口通信参数:我们首先需要确定串口通信的参数,例如波特率、数据位、停止位和校验位等。

这些参数需要在发送端和接收端进行一致配置,以确保正常的数据传输。

2.编写发送端代码:我们使用编程语言编写了一个简单的程序,通过串口发送数据给接收端。

在这个程序中,我们首先初始化串口,然后将要发送的数据写入串口缓冲区,最后启动数据传输。

3.编写接收端代码:我们同样使用编程语言编写了一个程序,用于接收来自发送端的数据。

在这个程序中,我们首先初始化串口,然后开启中断监听串口接收事件,当接收到数据时,触发相应的中断处理函数来处理接收到的数据。

4.运行程序并进行测试:我们将发送端和接收端的代码分别烧录到嵌入式开发板和计算机上,并运行程序进行测试。

我们发送了不同类型的数据,例如字节、字符串和数字等,并检查接收端是否成功接收到并正确处理这些数据。

实验结果在我们的实验中,我们成功地实现了串口数据的传输和接收。

我们发送的各种类型的数据都能够被接收端正确地接收到并进行处理。

通过对输出结果的检查,我们确认了数据的准确性和完整性。

实验总结通过这个实验,我们深入了解了串口通信的原理和应用。

以下是我们在实验中的一些总结和教训:1.注意配置参数的一致性:在串口通信中,发送端和接收端的串口配置参数必须一致,包括波特率、数据位、停止位和校验位。

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等。

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

发送数据,没能输⼊。

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

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

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

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

VB环境下利用MSComm控件发送和接收数据

VB环境下利用MSComm控件发送和接收数据
在挖掘学习算法时 # 做以下处理 "
’()!"%$"%$,6!"%$"#$, #-./0) 学 习 内 容 形 式 为 文 本 形 式 , !/78/) 学习内容形式为多媒体形式 , $ ’()!"#$"%$,6!"#$"#$, #-./0) 学 习 策 略 为 教 材 学 习 , ! /78/) 学习策略为题库学习 , $ ’()!"&$"%$,6!"&$"#$, #-./0) 考 核 方 式 为 主 观 题 考 核 , !/78/) 考核方式为客观题考核 , $
-’(&’( ! 向 发 送 缓 冲 区 中 写 入 数 据 # 在 设 计 阶 段 时
无效 $ 运行阶段时为只读 %
./01,20*3+ ! 在 )45*66 控 件 设 置 5*6678,%( 属 性为 5*6678.,9,:8, 并产生 -%5*66 事件之前 $ 设置 或返回要接收的字符数 " 4/01,20*3+! 在 )45*66 控件设置 5*6678,%( 属性 为 5*66784,%+ 并 产 生 -%5*66 事 件 之 前 $ 指 定 发 送 缓冲区中允许的最少字符数 " 4,((:%;2 ! 设 置 或 返 回 初 始 化 参 数 $ 即 波 特 率 & 奇 偶
I1:8D(, 4’J .:90/,K(G*KLM,HI1,22 <M,HN29:: N2 $%! (,;,1> ( 将 键 盘 键 入 的 字 符 传 给 .:90/,K(G*K 控 件 和
!""#
!!
性接收数据 !
I1:8D(, 4’J 5*66D%+=L53:9Q<> ( 用户单击 5*66D%+= 按钮后读取输入缓冲区中的

VC MFC串口通信编程详解

VC MFC串口通信编程详解
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
• lpFileName:将要打开的串口逻辑名,如“COM1”; • dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; • dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为 0; • lpSecurityAttributes:引用安全性属性结构,缺省值为 NULL; • dwCreationDistribution:创建标志,对串口操作该参数必须置为
在 Win32 下,可以使用两种编程方式实现串口通信,其一是使用 ActiveX 控件,这种 方法程序简单,但欠灵活.其二是调用 Windows 的 API 函数,这种方法可以清楚地掌握 串口通信的机制,并且自由灵活.下面只介绍 API 串口通信部分.
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作 方式).同步操作时,API 函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API 函数会立即 返回,操作在后台进行,避免线程的阻塞.
配置串口的示例:
SetupComm(hCom,1024,1024);//输入缓冲区和输出缓冲区的大小都是 1024 COMMTIMEOUTS TimeOuts; //设定读超时 TimeOuts.ReadIntervalTimeout=1000; TimeOuts.ReadTotalTimeoutMultiplier=500; TimeOuts.ReadTotalTimeoutConstant=5000; //设定写超时 TimeOuts.WriteTotalTimeoutMultiplier=500; TimeOuts.WriteTotalTimeoutConstant=2000; SetCommTimeouts(hCom,&TimeOuts);//设置超时 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate=9600;//波特率为 9600 dcb.ByteSize=8;//每个字节有 8 位 dcb.Parity=NOPARITY;//无奇偶校验位 dcb.StopBits=TWOSTOPBITS;//两个停止位 SetCommState(hCom,&dcb); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

毕业设计-VB中MSCOMM串行通信控件的使用方法

毕业设计-VB中MSCOMM串行通信控件的使用方法

VB是Visual Basic的简称,是由美国微软公司于1991年开发的一种可视化的、面向对象和采用事件驱动方式级程序设计语言,可用于开发Windows 环境下的各类应用程序。

它简单易学、效率高,且功能强大可以与Windows 专业开发工具SDK相媲美。

在Visual Basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(API)函数,动态链接库(DLL)、对象的链接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发环境下功能强大、图形界面丰富的应用软件系统。

他的简单易学可以使我们快速实现自己想在Windows下的软件功能。

小则可以做计算器、上位机等符合自己需要的小软件;大则可以连接数据库做些管理系统,比如某公司的人事管理系统。

这里要说的是MSCOMM控件在VB中的使用方法。

MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。

在应用中加入一个MSComm控件非常简单。

在VB的常用控件里是没有MSCOMM控件的,我们可以通过工程部件勾取Microsoft comm control 6.0 来添加MSCOMM控件。

下面,让我们来了解其使用方法:1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与PC进行数据传输和通信的通道。

这些串口在CPU和外设之间充当解释器的角色。

当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个VB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。

VS2010 mscomm控件 无法接收数据

VS2010  mscomm控件  无法接收数据

最近搞串口通讯,之前都是用VC6.0,开发过3个相关项目,很顺利,为了追求新潮,换用了VS2010问题来了,mscomm串口控件可以发送数据给下位机,但无法接收,通过实验也确认下位机已经上传数据,那就是上位机没有触发串口接收函数,为什么呢?苦思不得其解......查阅书籍,浏览网站,功夫不负有心人,终于找到患难人,方法也找到了...现在列出来供大家一起学习。

(以下为原版内容)/***********************************问题**************************************/我在用vs2010做一个和串口通讯有关的项目(刚刚接触串口通讯和2010),但是网上书上的关于mscomm控件的资料基本都是VC6.0的……现在我的情况是编译无错,程序也能跑得起来,包括串口的初始化部分和端口打开都正确,可是就是读不了数据(我在想是不是响应函数没有触发??)蛋疼哎蛋疼。

所以我把我的操作过程写出来,请诸位大侠看看哪里出了错。

开始找那个控件就搞得我很尴尬,要从tools里面choose Toolbox Items里面,IDC_MSCOMM1。

导入之后添加了个变量m_comm和消息响应函数OnMscomm1。

所在视图的初始化函数OnInitialUpdate和OnMscomm1如下:C/C++code?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23void CControlDisplayView::OnInitialUpdate(){CFormView::OnInitialUpdate();//TODO:Add your specialized code here and/or call the base class//TODO:Add your specialized creation code herem_comm.put_CommPort(1);//选择COM1m_comm.put_InputMode(1);//输入方式为二进制方式m_comm.put_InBufferSize(1024);//设置输入缓冲区大小m_comm.put_RThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_comm.put_SThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件m_comm.put_Settings(_T("9600,n,8,1"));m_comm.get_PortOpen();//打开串口m_rec=167.0;UpdateData(false);/*CButton*m_button=(CButton*)GetDlgItem(IDC_RADIO1);//默认选择单选按钮1 m_button->SetCheck(TRUE);choosenum=1;GetDlgItem(IDC_BUTTON2)->EnableWindow(false);//设置开始按钮无效GetDlgItem(IDC_BUTTON3)->EnableWindow(false);//设置停止按钮无效GetDlgItem(IDC_BUTTON4)->EnableWindow(false);//设置打开按钮无效24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60GetDlgItem(IDC_BUTTON5)->EnableWindow(false);//设置关闭按钮无效m_receive="Hello";UpdateData(FALSE);//更新编辑框内容*/}void CControlDisplayView::OnMscomm1(){//TODO:Add your command handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[512];//设置BYTE数组CString strtemp;CString data;UpdateData(true);m_rec=float(678.08);//为了测试用的,可是一直看不到他执行--0蛋疼哎……UpdateData(false);if(2==m_comm.get_CommEvent())//事件值为2表示接收缓冲区内有字符{variant_inp=m_comm.get_Input();//读缓冲区safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize();//得到有效数据长度for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组for(k=0;k<len;k++)//将数组转换为Cstring型变量{BYTE bt=*(char*)(rxdata+k);//字符型strtemp.Format(_T("%02X"),bt);//将字符送入临时变量strtemp存放data+=strtemp;//加入对应字符串data中}//m_rec=float(atof((char*)LPCTSTR(data)));UpdateData(false);}}/*********************************解决方法************************************/ 1.我的方法是:VS2010中在CPP代码中手动加入映射ACTIVEX事件:BEGIN_EVENTSINK_MAP(CControlDisplayView,CFormView)ON_EVENT(CControlDisplayView,IDC_MSCOMM1,1,OnMscomm1,VTS_NONE) END_EVENTSINK_MAP()在H文件PROTECTED定义DECLARE_EVENTSINK_MAP()在FORM界面选中MSCOMM控件,打开类向导,查看MSCOMM的COMMAND有没有指定事件处理OnMscomm1()解决!2.不知道回复的是不是太晚了。

图解VC++6.0中使用mscomm串口控件

图解VC++6.0中使用mscomm串口控件

m_ComPort.SetInputMode(1);//以二进制方式读写数据 m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于 1 个字符时,将引发接收数据的 OnCommMscomm 事件 m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数 if(!m_ComPort.GetPortOpen()) //打开串口
safearray_inp.GetElement(&k,rxdata+k); //转换为 BYTE 型数组 BYT E bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量 strtemp 存放 m_receive+=strtemp; } break; default: // 传输事件出错 m_ComPort.SetOutBufferCount(0); break;
在 sportDlg.cpp 中增加: BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射 //ActiveX 控件事件
END_EVENTSINK_ M AP()
// TODO: Add your control notification handler code here UpdateData(TRUE); int len; CByteArray array; len=m_send.GetLength(); array.RemoveAll(); array.SetSize(len); for(int i=0;i<len;i++)

VB编写上位机实例

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,注意这里的串口通信参数中的波特率设置是默认参数的。

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

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

基于VC的多功能电力仪表上位机管理软件作者:任玉茂胡炜薇秦会斌来源:《无线互联科技》2013年第10期摘要:为实现多功能电力仪表各项数据的实时检测,方便用户在一台主机上对多个下位机进行查看和管理,现开发出一款上位机管理软件。

该软件基于MFC平台,利用MSCOMM 通信控件,通过485总线与单片机进行通信。

软件将采集到的数据处理整合,在一个界面上同时显示电压、电流、功率、电能等多项数据,数据自动刷新。

不同的下位机可选择显示,下位机的信号网络、电压变比、电流变比等参数可手动更改,软件同时还集成了电能值一键清零的功能。

该软件使用简便,传送数据快速准确,现已投入市场运用。

关键词:多功能电力仪表;上位机;MSCOMM控件;参数设置;电能清零随着科学技术的发展,对单一现场数据的采集与显示已不能满足人们的需求,特别是当网络结点变多的时候,逐个对每个结点进行单一管理显得十分困难,因此,数据的集中采集和智能管理已成为现代控制领域必然的发展方向。

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

加之单片机的计算能力有限,难以进行复杂的数据处理。

因此在功能比较复杂的控制系统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。

1 整体设计方案本系统涉及上位机和下位机之间的通信,因此系统共包含三个部分:下位机—ATmega32单片机、总线和协议—485总线和Modbus通讯协议、上位机—MFC应用程序。

系统设计框图如下:2 下位机简介下位机是ATmega32单片机,单片机接收上位机发来的指令,并根据要求向上位机传送数据或者更改参数设置。

下位机设备有独立的通信模块,通过B0505与外部电路隔离,通信模块留有RXD、TXD、A、B四个接口,RXD、TXD与单片机串行口连接,A、B与485总线连接,中间是独立的转换电路。

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

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

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

图1.0
2.添加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
4.添加变量及其类型方法如图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.1
三.添加串口事件消息处理函数OnComm()
打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》在Object Ids中选择IDC_MSCOMM1—》在Message中选中OnComm—》单击“Add Function”按钮—》将函数名改为OnComm(好记而已)—》单击OK,完成后如图3.0
同理在函数OnComm()中添加代码如图3.1
图3.0
图3.1
四.发送数据
为发送按钮添加一个单击信息,即BN_CLICKED处理函数。

打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》选中IDC_BUTTON_MANUALSEND—》选中BN_CLICKED—》单击“Add Function”按钮—》将函数名改为OnButtonManualsend函数—》单击OK,完成后如图4.0 同理在函数OnButtonManualsend()中添加代码如图4.1
图4.0
图4.1
五.完成后,单击编译、连接、运行
如果在编译时出现错误,直接按“Ctrl+F5”即可。

如果没有错误则运行结果为图5.0
图5.0
六.实验结果
通过虚拟串口软件Virtual Serial Ports Driver XP连接好串口COM3和COM4,如图6.0
然后,打开串口调试助手,选择COM4,与运行的串口通信软件进行通信,本实验成功通信,结果如图6.1
图6.1
七.结束语
本实验参考《Visual C++_Turbo C串口通信编程实践》,在此过程中,我感谢好友志强哥的热心帮助。

《完》。

相关文档
最新文档