基于CSerialPort类的多线程串口通信的实现

合集下载

vs2005串口通信编程记录_利用CserialPort

vs2005串口通信编程记录_利用CserialPort

在VS2005中利用CserialPort类进行串口通信Step1:打开VS2005,新建一个基于对话框的MFC 应用程序项目名称:VS2005_SerialPortStep2:将SerialPort.h和SerialPort.cpp拷贝到工程文件中(E:\VS2005_SerialPort\VS2005_SerialPort\目录下)Step3:通过项目—>添加现有项选择SerialPort.h和SerialPort.cpp将其添加到工程中Step4:在对话框上添加必要的控件,并为控件添加关联变量(右键单击控件—>添加变量)1.IDC_COMBO_COMPORT m_ctrlComboComPort2.IDC_BUTTON_OPEN3.IDC_BUTTON_CLOSE4.IDC_EDIT_RECEIVEMSG m_strEditReceiveMsg5.IDC_EDIT_SENDMSG m_strEditSendMsg6.IDC_BUTTON_SENDStep5:在VS2005_SerialPortDlg.h文件中添加#include"SerialPort.h"//添加CSerailPort类的头文件Step6:在CVS2005_SerialPortDlg类中添加CSerialPort m_SerialPort;在类视图中,右击CVS2005_SerialPortDlg -> 添加 -> 添加变量Step7:人工增加串口消息响应函数:OnCommunication(WPARAM ch, LPARAM port)1、在VS2005_SerialPortDlg.h文件中// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg LRESULT OnComm(WPARAM ch, LPARAM port); //添加此句代码DECLARE_MESSAGE_MAP()2、然后在VS2005_SerialPortDlg.cpp文件中进行WM_COMM_RXCHAR消息映射:BEGIN_MESSAGE_MAP(CVS2005_SerialPortDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_MESSAGE(WM_COMM_RXCHAR, OnComm) //添加此句代码//}}AFX_MSG_MAPEND_MESSAGE_MAP()3、接着在VS2005_SerialPortDlg.cpp中加入函数的实现:LRESULT CVS2005_SerialPortDlg::OnComm(WPARAM ch, LPARAM port){m_strEditReceiveMsg += char(ch);UpdateData(FALSE); //将接收到的字符显示在接收编辑框中return 0;}Step8:为VS2005_SerialPortDlg添加一些变量和相应函数1.Bool m_bSerialPortOpened;在构造函数中将其初始化:m_bSerialPortOpened=FALSE; //初始状态:串口没有打开2.为IDC_COMBO_COMPORT控件添加数据项右击IDC_COMBO_COMPORT控件–> 属相在“行为”–> “数据”栏添加 COM1;COM2;COM3;COM4;在初始化函数中将其初始化m_ctrlComboComPort.SetCurSel(0); //初始选择串口1//以下两句分别设置“打开串口”、“关闭串口”两个按状态的使能状态GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);3.为IDC_BUTTON_OPEN控件添加消息相应函数void CVS2005_SerialPortDlg::OnBnClickedButtonOpen(){// TODO: 在此添加控件通知处理程序代码int nPort=m_ctrlComboComPort.GetCurSel()+1; //得到串口号if(m_SerialPort.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)){m_SerialPort.StartMonitoring();m_bSerialPortOpened=TRUE;}else{AfxMessageBox((LPCTSTR)"没有发现此串口或被占用");m_bSerialPortOpened=FALSE;}GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);}4.为IDC_BUTTON_CLOSE控件添加消息相应函数void CVS2005_SerialPortDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码m_SerialPort.ClosePort();//关闭串口m_bSerialPortOpened=FALSE;GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);}5.为IDC_BT_SEND控件添加消息相应函数void CVS2005_SerialPortDlg::OnBnClickedBtSend(){// TODO: 在此添加控件通知处理程序代码if(!m_bSerialPortOpened) return; //检查串口是否打开UpdateData(TRUE); //读入编辑框中的数据m_SerialPort.WriteToPort((LPTSTR)(LPCTSTR)m_strEditSendMsg);//发送数据}Step9:编译运行在编译之前将字符集设置为:使用多字节字符集设置完成之后就可以进行通信了。

C#-使用SerialPort控件用类及线程实现串口通信

C#-使用SerialPort控件用类及线程实现串口通信

C# 使用SerialPort控件用类及线程实现串口通信C# 使用SerialPort 源码实例编辑源码复制到剪贴板打印using System;using ponentModel;using System.Data;using System.Drawing;using System.Text;usingusing System.Threading;namespace TestSerialPort{public partial class frmTESTSerialPort : Form{public frmTESTSerialPort(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}private Button button1;private TextBox txtSend;private TextBox txtReceive;private Label label1;private Label label2;/// <summary>/// 必需的设计器变量。

/// </summary>/// <summary>/// 清理所有正在使用的资源。

/// </summary>/// <param name="disposing">如果应释放托管资源,为true;否则为false。

</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法- 不要/// 使用代码编辑器修改此方法的内容。

用VC实现多串口多线程工业控制

用VC实现多串口多线程工业控制

用VC实现多串口多线程工业控制[串口通信2009-05-09 22:50 阅读22 评论0字号:大大中中小小在中小型电站系统就地控制中,比如水电站中如果我们要进行各种设备控制地话,串口数量就可能比较多了,有地地方加上载波甚至可以达到10个以上,很多地解决方法是将某些功能设备并行接到一个串口上面尽量减少串口地数量,然后进行数据采集地时候采取环地方法进行.但是工业控制要求实时性比较高,比如报警和各种控制,如果不能在尽可能短地时间里面进行处理可能引发大地后果,我们觉得还是应该将各种不同设备接入不同地串口,比如水电站中间各个机组地PLC和机组地调速器通讯等就接入不同串口.如果某个相同设备数量很多,如温度装置,有地1个发电机组可能超过20个温度点,我们可以采用接入2个或者多个串口地方法处理.b5E2RGbCAP 为了使初学者能够更容易看懂串口通讯地处理过程,我采用援助非洲刚果<布)姆古古鲁水电站地温度表为实例进行程序地分析.在我们这个工程中有4台发电机组,每个机组温度表有20个点.由于这个与上位机通讯串口安排极多,我们只能将20个温度表并行接入串口进行通讯.在进行硬件通讯之前我们首先要看懂改硬件地通讯协议.p1EanqFDPw通讯协议就是上位机向改外围设备进行读取数据和进行某种功能控制时候地一系列指令和外围设备返回上位机地各数据位代表地意思.比如那个位是控制码,哪个位是数据,是什么数据等.DXDiTa9E3d首先启动VC新建一个给予SDI地工程,然后加入SerialPor t类.由于要进行多串口通讯,我们需要对SerialPort进行一些简单地修改,由于在与硬件通讯过程中一般通讯协议都采用BYTE类型数据传送,我们可以将该类中间地发送和接收数据类型修改成为BYTE 类型.我修改了下面部分内容,详细改动请见附录提供地SERIALPORT类.RTCrpUDGiT//// Write a string to the port//void CSerialPort::WriteToPort(BYTE bWriteBuffer[],int nWriteBufferSize>5PCzVD7HxA{assert(m_hComm != 0>。

CSerial类与MSComm控件

CSerial类与MSComm控件

一、CSerialPort类支持多线程链接(非MODEM)的串口编程操作,其步骤如下:第一步:在**Dlg.h文件添加#include "SerialPort.h"(需先加入类头文件与源文件)第二步:添加成员变量 CSerialPort serialPort;第三步:在初始化对话框函数中调用serialPort.InitPort,serialPort.StartMonitoring 第四步:发送,serialPort.WriteToPort(buf);第五步:接收,在类的定义中,声明消息函数afx_msg LONG OnCommunication(UINT, LONG);在.cpp文件中添加映射ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)并实现LONG **Dlg::OnCommunication(WPARAM ch, LPARAM port)基于单文档的应用程序,则初始化在新增加的OnInitialUpdate()中添加代码。

说明:由于OnCommunication(WPARAM ch,LPARAM port)带参,所以其接收代码比MSComm 控件的接收代码简单很多,不要涉及接收函数及其数据类型的转换。

二、但对于MODEM控制,需要对类进行改写,采用MSComm控件比较理想。

使用MSComm控件进行编程的基本步骤:1)在建立的工程中加入MSComm控件;2)添加MSComm控件的ID关联变量(或者对象);3)对串口进行初始化,设置MSComm控件的属性(一般在OnInitDialog中);4)添加串口事件的消息处理函数OnComm(),在函数中根据应用需要,编写数据处理代码;(一般用于接收缓冲区里面的数据)5)编写串口发送等其他代码;(一般在按钮处理函数中实现)6)关闭串口。

以上采用MSComm控件的是事件驱动方式,即通过函数OnComm()处理。

MFC串口通信程序(基于Vc++及Serialport类)

MFC串口通信程序(基于Vc++及Serialport类)

编程步骤
编写按钮控件消息响应处理函数-发送
以同样的方法打开“发送”按钮的消息函数,插入下面语句
void C串口通信程序Dlg::OnBnClickedButton3() { if(!m_bPortOpen) //检测串口是否打开 return ; //如果关闭,则结束函数 else //如果打开,则执行下面语句 UpdateData(TRUE); //读入编辑框的数据(把编辑框中的字符写入变量) m_SerialPort.WriteToPort((LPCTSTR)m_strTxMsg); //调用函数发送数据 }
m_strPairty
Control型变量
m_strTxMsg
m_strRxMsg
Value型变量
编程步骤
对写好的对话框进行一个初始化 在初始化函数OnInitDialog()中添加如下语句:
BOOL C串口通信程序Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); m_ctrlComPort.SetCurSel(0);//设置默认的索引值 m_ctrlBaudRate.SetCurSel(0); m_ctrlPairty.SetCurSel(0); m_ctrlDataBits.SetCurSel(3); m_ctrlStopBits.SetCurSel(0); GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); //把窗口中的“打开串口”置为活动的可操作状态 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); //把窗口中的“关闭串口”置为灰色的不可操作状态
编程步骤
• • 在对话框c文件中声明串口类对象 定义一个布尔变量 CSerialPort m_SerialPort BOOL m_bPortOpen //用来表示标志串口是否打开

C#-使用SerialPort控件用类及线程实现串口通信

C#-使用SerialPort控件用类及线程实现串口通信

C# 使用SerialPort 控件用类及线程实现串口通信C# 使用SerialPort 源码实例编辑源码复制到剪贴板打印using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Threading;namespace TestSerialPort{public partial class frmTESTSerialPort : Form{public frmTESTSerialPort(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}private Button button1;private TextBox txtSend;private TextBox txtReceive;private Label label1;private Label label2;/// <summary>/// 必需的设计器变量。

/// </summary>private ponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。

/// </summary>false 。

/// <param name="disposing"> 如果应释放托管资源,为true ;否则为</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法- 不要/// 使用代码编辑器修改此方法的内容。

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)作者:龚建伟2001.11.09(任意转载,请注明来自啸峰工作室及网址)老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧。

确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如。

但我一直没有停止过用MSComm通讯控件,那么简单的东西,对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类。

这是Remon Spekreijse写的一个串口类,地址在:/network/serialport.shtml类作者Remon Spekreijse已作了一个基于对话框的同时检测4个串口示例的程序,在上面的网址和我主页的串口源码下载页也可以找到。

我在这儿主要介绍如何将这个类应用到VC中基于文档的程序中。

为了加深对串口数据处理的了解,我们利用这个类解决如下问题:问题:串口2(COM2)每隔1秒向串口1(COM1)发送的NEMA格式的报文:串头为$,串尾为*,中间为一个xxxx 的整数(比如2345,不足4位则前面以0代替代),最后是hh校验,规定hh为xxxx四个数的半BYTE 校验和,最后加上回车<CR>与换行<LF>。

整个数据包为$xxxx*hh<CR><LF>。

串口1收到上述报文后,校验正确后,将发来的数据显示在视窗中,并记下发来的正确帧数和错误帧数,若正确,还向串口2发送Y,串口2收到Y后将收到的Y的计数显示在视窗中。

测试方法:将三线制串口线联接上同一台计算机的两个串口,编好程序后就可测试。

如果没有两个串口的微机,自己改改程序。

好了,你可以先下载源程序: scporttest.zip(大小:49KB,VC6,WIN9X/2000,SerialPort.h SerialPort.cpp是两个类文件)编程步骤:◆1. 建立程序:建立一个基于单文档的MFC应用程序SCPortTest,所有步骤保持缺省状态。

在C#中使用SerialPort类实现串口通信遇到多线程问题

在C#中使用SerialPort类实现串口通信遇到多线程问题

在C#中使⽤SerialPort类实现串⼝通信遇到多线程问题在C#中使⽤SerialPort类实现串⼝通信。

2009年11⽉01⽇星期⽇ 10:03在.NET work 2.0中提供了SerialPort类,该类主要实现串⼝数据通信等。

本⽂章将本⼈在学习过程中从⽹络上搜集到的相关信息写出来供⼤家参考。

下⾯主要介绍该类的主要属性(表1)和⽅法(表.2)。

如果需要了解更多的信息请登录查看。

相关⽂章《使⽤System.IO.Ports读取COM⼝数据》使⽤SerialPort类的⽅法:⽅法⼀:⾸先要添加using System.IO;using System.IO.Ports;1...在类的内部定义SerialPort com;2...打开串⼝com = new SerialPort();com.BaudRate = 115200;com.PortName = "COM1";com.DataBits = 8;com.Open();//打开串⼝3...发送数据Byte[] TxData ={1,2,3,4,5,6,7,8 };com.Write(TxData, 0, 8);4...接收数据4.1使⽤事件接收.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.OnDataReceived);private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)4.2使⽤线程接收接收数据启动⼀个线程,使其接收。

在类的内部定义Thread _readThread;bool _keepReading;打开串⼝后启动线程_keepReading = true;_readThread = new Thread(ReadPort);_readThread.Start();线程函数view plaincopy to clipboardprint?private void ReadPort(){while (_keepReading){if (com.IsOpen){byte[] readBuffer = new byte[com.ReadBufferSize + 1];trytry{// If there are bytes available on the serial port,// Read returns up to "count" bytes, but will not block (wait)// for the remaining bytes. If there are no bytes available// on the serial port, Read will block until at least one byte// is available on the port, up until the ReadTimeout milliseconds// have elapsed, at which time a TimeoutException will be thrown.int count = com.Read(readBuffer, 0, com.ReadBufferSize);String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); if (count != 0)//byteToHexStr(readBuffer);Thread(byteToHexStr(readBuffer,count));}catch (TimeoutException) { }}else{TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);Thread.Sleep(waitTime);}}}private void ReadPort(){while (_keepReading){if (com.IsOpen){byte[] readBuffer = new byte[com.ReadBufferSize + 1];try{// If there are bytes available on the serial port,// Read returns up to "count" bytes, but will not block (wait)// for the remaining bytes. If there are no bytes available// on the serial port, Read will block until at least one byte// is available on the port, up until the ReadTimeout milliseconds// have elapsed, at which time a TimeoutException will be thrown.int count = com.Read(readBuffer, 0, com.ReadBufferSize);String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); if (count != 0)//byteToHexStr(readBuffer);Thread(byteToHexStr(readBuffer,count));}catch (TimeoutException) { }}else{TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);Thread.Sleep(waitTime);}}}⽅法⼆:使⽤C#⾃带的SerialPor控件。

借助VC 实现串口通讯程序中的多线程应用解析

借助VC  实现串口通讯程序中的多线程应用解析

借助VC++实现串口通讯程序中的多线程应用厦门湖滨北路123号广电中心管理处卓开炜1、概述在广电网络数字化双向改造中,为了实现广电网络对多媒体数字业务的支持,在广电网络主干网和支干网上建设了大量的无人值守的支持数字业务的中心机房,随着现在数据业务的开展,业务平台的安全以及广播电视的安全播出的迫切需要,必须建立相应的对这些无人值守机房进行远程实时监控和通讯的管理系统。

在这些远程实时监控和通讯的管理系统中,信息实时性是最主要的技术要求之一,所以在远程实时监控和通讯管理系统的程序设计中满足实时性要求是软件设计的根本出发点之一。

WINDOWS系统是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。

多任务就是指操作系统可以同时运行多个进程,每个进程又可以同时执行多个线程。

进程是应用程序的运行实例,要求拥有自己的地址空间,每个进程拥有一个主线程,同时可以建立其他的线程。

线程是操作系统分配CPU 时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在各个线程之间切换。

进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,所以在串行通讯程序中应用多线程就可以简化应用程序的结构,把一些复杂的运算放在后台并行执行,从而大大提高应用程序的响应实时能力。

2、VC++对多线程的支持在VC++编程中通常使用MFC程序进行开发,这样可以减少程序代码的书写。

在VC++6.0版本中的MFC应用程序的线程是由CwinThread对象表来表示的,该线程分为两种:用户界面线程(GUI-Thread和工作者线程(Worker-Thread。

用户界面线程能够提供界面和用户交互,用于处理用户输入和响应各种信息和事件;工作者线程主要用来处理应用程序的后台任务。

应用程序可以通过调用AfxBejinThread(函数自动创建一个CwinThread对象,从而开始一个线程。

线程的终止条件有如下4种:线程函数返回;线程调用ExitThtead(退出;异常情况下用现成的句柄调用TerminateThread(退出;线程所属的进程被终止。

qserialport多线程方法

qserialport多线程方法

qserialport多线程方法下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!现代的软件开发中,多线程技术日益被广泛应用。

基于VC_的多线程技术在串行通信中的应用

基于VC_的多线程技术在串行通信中的应用
page 3
page 2
7 小结 本程序利用 MSCOMM 控件及多线程技术实现了对于多个 电视频道的实时控制。 其界面如图 2 所示。当鼠标点击选中的 频道变成黄绿色时, 可观察该频道的控制参 数, 也可进行参数 调节,同时,后台线程可按设定时间周期性扫描。本程序在 VC+ +6.0 下编译通过, 且运行良好。 6 多线程在串口通信中的应用 6.1 串口通信对线程同步的要求 因为同一进程的所有线程共享进程的虚拟地址空间, 而在 Windows 9X/NT 系统 下线程是汇编级中断,所以有可能多个线 程同时访问同一个对象。这些对象可能是全 局变量, MFC 的对 MFC 的 API 等。串口通信的几个特点决定了必须采用措施 象、 来同步线程的执行。 串口通信中, 对于每个串口对象, 只有一个缓冲区, 发送和 接收都要用到, 必须建立起同步机制, 使得在一个时候只能进 行一种操作, 否则 通信就会出错。 进行串口通信处理的不同线程之间需要协调运行。如果一 个线程必 须等待另一个线程结束才能运行, 则应该挂起该线程 以减少对 CPU 资源的占用,通 过另一进程完成后发出的信号 (线程间通信)来激活。 VC++提供了同步对象来协调多 线程的并行,常用的有以 下几种: CSemaphore: 信号灯对象, 允许一定数目的线 程访问某个 共享资源, 常用来控制访问共享资源的线程数量。 图 2 程序界面 参考文献: [1] John E. Swanke. Visual C++ MFC 扩展编程实例.机械工业出 版社,2000,1 [2] 龚建伟, 熊光明.Visual C++/Turbo C 串口通信编程实践(第 2 版). 电子工业出版社, 2007, 9 胡仁杰, 徐日升.用 VC++多线程技术实现 PC 串 口 [3] 戴红梅, 全双工通讯.电测与仪表, 2000, 11 (作者单位: 华南师范大学 物理与电信工程学院 ) 59 广东科技 2010.1 总第 2 BD30AV 系统连接框图 3 BD30AV 通信协议 数据头:0xAA 数据包长度信息:LENGTH = n, (n>=6 ) 命令标志符: 0x01, 送延时数据。 data0= [0,7];data1= [0,24] 1 本项目受广东省科技计划工业攻关项目资助,项目编号:2008B010200042 , 2009B010800051 ,2009B010900056 58 广东科技 2010.1 总第 229 期 气象、 防雷、 通信、 通讯与电子 学界 nateThread( )退出; 线程所属的进程被终止。 工作者线程倾向于琐碎的处理 , 用户界面线程则具有自己 的界面而且实际上类似于运行其他应用程序。多线程的 实现可 以使得各端口独立, 准确地实现串行通信, 使串口通信具有更 广泛的灵活 性与严格性, 且充分利用了 CPU 时间。 本系统中, 计 算机通过串口循环扫描多台 BD30AV, 以提供给工作人员需查 后 询和监控的各个电视台的信息。前者通过工作 者线程实现, 者则需通过用户界面线程显示, 如两者没有处理好很容易引起 死机的 现象。 Cmutex: 互斥量对象, 一个时刻至多只允许一个线程访问 某资源, 未被占用 时处于有信号状态, 可以实现对共享资源的 互斥访问。 CEvent: 事件对象, 用于 使一个线程通知其他线程某一事 件的发生, 所以它也可以用来封锁对某一资源的访 问, 直到线 程释放资源使其成为有信号状态。适用于某一线程等待某事件 发生才能 执行的场合。 CCriticalSection: 临界区对象, 将一段代码置入临界区, 只 允许 最多一个线程进入执行这段代码。一个临界区仅在创建它 的进程中有效。 5 MScomm 控件 VC++是可视化面向对象的编程环境,提供了串行通信 ActiveX 控件 MSCOMM, 可以真正把串口看作一个对象。 该控件 的相应文件是 MSCOMM32.OCX,它提供了一系 列标准通信命 令的使用接口, 利用它可以建立与串口的连接, 并可以通过串 口连 接到其他通信设备 (如调制解调器) 发出命令, , 交换数据 MSCOMM 控件 以及监 视和响应串行连接中发生的事件和错误。 提供了两种处理通信的方式: (1 事件驱 动方式。 ) 当通信事件发生时, MSCOMM 控件会触 发 OnComm 事件,调用者可以捕 获该事件,通过检查其 Com- mEvent 属性便可确认发生的是哪种事件或错误, 从而 进行相应 可靠性高。 的处理。这种方法的优点是响应及时、 (2 查询方式。在程序 的每个关键功能之后, ) 可以通过检查 CommEvent 属性的值来查询事件和错误。 在使用 MSCOMM 控件时, 个 MSCOMM 控件只能同时对 1 那么必 应 1 个串口。如果 应用程序需要访问和控件多个串口, MSCOMM 控件只对应 须使用多个 MSCOMM 控件。 在 VC++中, 着 1 个 C++类--CMSComm。由于 MSCOMM 控件本身没有提供 ( 成员函 数外, 其他的函数 方法, 所以 CMSComm 类除了 Create ) 都是 Get/Set 函数对 , 用来获取或设置控件的属性。 MSCOMM 控 用来向调用者通知有通信事件发 件也只 有 1 个 OnComm 事件, 生。MSCOMM 控件有许多属性, 限于篇幅只给出几个较为重 要 和常用的属性。如 CommPort: 通信端口号; Settings: 以字符串形 奇偶校验 、 数据位; PortOpen: 通信端口的状 式表示的波特率、 态,打开或是关闭; In put:接收数据; Output:发送数据; Input- Mode: 接收数据的类型: 为文本; 为二进制。 0 1 6.2 等待函数 Win32 API 提供了能使线程阻塞其自身执行的等待函数, 等待其监视的对象产 生一定的信号才停止阻塞, 继续线程的执 行。 其意义是通过暂时挂起线程减少对 CPU 资源的占用。 在某 些大型监控系统中,串口通信只是其中事务处理的一部分, 所 以必须考虑程序执行效率问题, 当串口初始化完毕后, 就使其 处于等待通信事 件的状态, 减少消耗的 CPU 时间, 提高程序运 行效率。 常用的等待函数是 Wait ForSingleObject( )和 WaitForMulti- pleObjects( ), 前者可监测单个同步对象 , 后者可同时监测多个 同步对象。

基于CSerialPortEx类的无人机地面站串口通信的实现

基于CSerialPortEx类的无人机地面站串口通信的实现

基于CSerialPortEx类的无人机地面站串口通信的实现作者:马少瑛,乌仁格日乐来源:《电脑知识与技术》2011年第22期摘要:设计中无人机与地面站之间的数据通信采用串口通信方式。

论文阐述了CserialPortEx类串口通信原理,介绍了在Windows环境下,使用Microsoft Visual C++6.0开发的基于CserialPortEx类的无人机地面站串口通信的编程实现方法。

测试表明该设计具有较好的稳定性和可扩展性,实现了无人机与地面站的通信。

关键词:无人机;地面站;串口通信;CserialPortEx类中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)22-5312-03Implementation of Serial Communication Based on Class CSerialPortEx in UAV Ground Station MA Shao-ying, Wurengerile(Inner Mongolia University of Technology, Huhhot 010051, China)Abstract: Mean of communication is serial communication between the UAV and ground station in the design. The paper expounded the principle of serial communication class CserialPortEx, introduced the program for serial communication based on class CSerialPortEx in UAV ground station with Microsoft Visual C++ 6.0 under Windows. The test indicated the design had strong stability and expansibility. The design implemented communication between the UAV and ground station.Key words: UAV; ground station; serial communication; class CSerialPortEx无人机地面站是无人机系统的重要组成部分,它的任务是监测飞机的飞行状态和机载有效载荷的工作状态,使地面操作人员能够有效的对飞机和有效载荷实施控制。

C#中使用SerialPort类实现简单串口编程

C#中使用SerialPort类实现简单串口编程

C#中使用SerialPort类实现简单串口编程.NET提供了SerialPort类进行串口通信,使用很简单,连我这个.NET新手也能很快上手.以下是从网上找到并自己修改后的参考代码: 1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Windows;6using System.Windows.Controls;7using System.Windows.Data;8using System.Windows.Documents;9using System.Windows.Input;10using System.Windows.Media;11using System.Windows.Media.Imaging;12using System.Windows.Navigation;13using System.Windows.Shapes;14using System.IO.Ports;1516namespace CsharpComm17{18///<summary>19/// Window1.xaml 的交互逻辑20///</summary>21public partial class Window1 : Window22 {23public Window1()24 {25 InitializeComponent();26 }2728//定义 SerialPort对象29 SerialPort port1;3031//初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型32public void InitCOM(string PortName)33 {34 port1 = new SerialPort(PortName);35 port1.BaudRate = 9600;//波特率36 port1.Parity = Parity.None;//无奇偶校验位37 port1.StopBits = StopBits.Two;//两个停止位38 port1.Handshake = Handshake.RequestToSend;//控制协议39 port1.ReceivedBytesThreshold = 4;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数40 port1.DataReceived += new SerialDataReceivedE ventHandler(port1_DataReceived);//DataReceived事件委托41 }4243//DataReceived事件委托方法44private void port1_DataReceived(object sender, Seri alDataReceivedEventArgs e)45 {46try47 {48 StringBuilder currentline = new StringBuilder();49//循环接收数据50while (port1.BytesT oRead > 0)51 {52char ch = (char)port1.ReadByte();53 currentline.Append(ch);54 }55//在这里对接收到的数据进行处理56 //57 currentline = new StringBuilder();58 }59catch(Exception ex)60 {61 Console.WriteLine(ex.Message.ToString());62 }6364 }6566//打开串口的方法67public void OpenPort()68 {69try70 {71 port1.Open();72 }73catch { }74if (port1.IsOpen)75 {76 Console.WriteLine("the port is opened!");77 }78else79 {80 Console.WriteLine("failure to open the port!");81 }8384//关闭串口的方法85public void ClosePort()86 {87 port1.Close();88if (!port1.IsOpen)89 {90 Console.WriteLine("the port is already closed!" );91 }92 }9394//向串口发送数据95public void SendCommand(string CommandString)96 {97byte[] WriteBuffer = Encoding.ASCII.GetBytes(Co mmandString);98 port1.Write(WriteBuffer, 0, WriteBuffer.Length);99 }100101//调用实例102private void btnOpen_Click(object sender, RoutedE ventArgs e)103 {104//我现在用的COM1端口,按需要可改成COM2,COM3105 InitCOM("COM1");106 OpenPort();107 }109}值得注意的是:1. port1.ReceivedBytesThreshold = 4; ReceivedBytesThreshold属性设置触发一次DataReceived事件时将接收到的数据字节数.由于我的硬件是一次发上来4个字节估设置为4.如果不能正确设置这个属性的话,在SerialPort对象第一次触发DataReceived事件时还是正确的(4个字节),但是从第二次触发之后都是一个字节触发一次DataReceived事件...为什么这样搞不清楚...2.如果在 DataReceived 委托事件中使用了不是DataReceived委托事件所在线程创建的UI控件,函数等,需要使用到Dispatcher 类来达到线程安全,不然会报错.以下是MSDN中Dispatcher类的例子(XAML),简单明了:1private delegate void AddTextDelegate(Panel p, String text );23private void AddText(Panel p, String text)4{5 p.Children.Clear();6 p.Children.Add(new TextBlock { Text = text });7}89private void TestBeginInvokeWithParameters(Panel p)10{11if (p.Dispatcher.CheckAccess()) AddText(p, "Added dire ctly.");12else p.Dispatcher.BeginInvoke(13new AddT extDelegate(AddText), p, "Added by Dispa tcher.");14}。

基于多线程的多串行通信任务的实现

基于多线程的多串行通信任务的实现

基于多线程的多串行通信任务的实现
李志俊;程涛
【期刊名称】《武汉理工大学学报(交通科学与工程版)》
【年(卷),期】2002(026)005
【摘要】根据串口通信的基本原理,介绍了利用WIN32API编程,基于单进程和多线程的多任务的串行通信,实现在一台计算机上对两个PLC控制网络的数据进行通信的任务,并对影响串行通信的因素进行了探讨.有效地解决了在串口通信中的实时响应问题,降低了数据丢失率,提高了系统的可靠性.
【总页数】4页(P575-578)
【作者】李志俊;程涛
【作者单位】华中科技大学控制科学与工程系,武汉,430074;武汉理工大学自动化学院,武汉,430063;武汉理工大学自动化学院,武汉,430063
【正文语种】中文
【中图分类】TP393.04
【相关文献】
1.基于多线程技术实现PLC与PC的串行通信 [J], 庄尚志;郑建彬
2.基于VB 6.0的多线程卫星数据高效串行通信实现 [J], 张怡;涂兰芬;唐强宜
3.基于VC6的分布式仿真系统多线程串行通信的实现 [J], 龙勇;袁静;黄先祥
4.基于多线程技术和自定义消息编程实现Windows 9x异步串行通信 [J], 欧阳琳男
5.基于Delphi多线程的串行通信构件的研究与实现 [J], 蒋哲远
因版权原因,仅展示原文概要,查看原文内容请购买。

CSerialPort类解析

CSerialPort类解析

assert(portnr > 0 && portnr < 5);assert(pPortOwner != NULL);// if the thread is alive: Killif (m_bThreadAlive){do{SetEvent(m_hShutdownEvent);}while (m_bThreadAlive);TRACE("Thread ended\n");}// create eventsif (m_ov.hEvent != NULL)ResetEvent(m_ov.hEvent);m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hWriteEvent != NULL)ResetEvent(m_hWriteEvent);m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hShutdownEvent != NULL)ResetEvent(m_hShutdownEvent);m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);// initialize the event objectsm_hEventArray[0] = m_hShutdownEvent; // highest prioritym_hEventArray[1] = m_ov.hEvent;m_hEventArray[2] = m_hWriteEvent;// initialize critical sectionInitializeCriticalSection(&m_csCommunicationSync);// set buffersize for writing and save the ownerm_pOwner = pPortOwner;if (m_szWriteBuffer != NULL)delete [] m_szWriteBuffer;m_szWriteBuffer = new char[writebuffersize];m_nPortNr = portnr;m_nWriteBufferSize = writebuffersize;m_dwCommEvents = dwCommEvents;BOOL bResult = FALSE;char *szPort = new char[50];char *szBaud = new char[50];// now it critical!EnterCriticalSection(&m_csCommunicationSync);// if the port is already opened: close itif (m_hComm != NULL){CloseHandle(m_hComm);m_hComm = NULL;}// prepare port stringssprintf(szPort, "COM%d", portnr);sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, stopbits);// get a handle to the portm_hComm = CreateFile(szPort, // communication port string (COMX)GENERIC_READ | GENERIC_WRITE, // read/write types0, // comm devices must be opened with exclusive access NULL, // no security attributesOPEN_EXISTING, // comm devices must use OPEN_EXISTING FILE_FLAG_OVERLAPPED, // Async I/O0); // template must be 0 for comm devicesif (m_hComm == INVALID_HANDLE_VALUE){// port not founddelete [] szPort;delete [] szBaud;return FALSE;}// set the timeout valuesm_CommTimeouts.ReadIntervalTimeout = 1000;m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;m_CommTimeouts.ReadTotalTimeoutConstant = 1000;m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;m_CommTimeouts.WriteTotalTimeoutConstant = 1000;// configureif (SetCommTimeouts(m_hComm, &m_CommTimeouts)){if (SetCommMask(m_hComm, dwCommEvents)){if (GetCommState(m_hComm, &m_dcb)){m_dcb.fRtsControl = RTS_CONTROL_ENABLE; // set RTS bit high!if (BuildCommDCB(szBaud, &m_dcb)){if (SetCommState(m_hComm, &m_dcb)); // normal operation... continueelseProcessErrorMessage("SetCommState()");}elseProcessErrorMessage("BuildCommDCB()");}elseProcessErrorMessage("GetCommState()");}elseProcessErrorMessage("SetCommMask()");}elseProcessErrorMessage("SetCommTimeouts()");delete [] szPort;delete [] szBaud;// flush the portPurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | P URGE_TXABORT);// release critical sectionLeaveCriticalSection(&m_csCommunicationSync);TRACE("Initialisation for communicationport %d completed.\nUse Startmonitor to communica te.\n", portnr);return TRUE;}这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定。

C#基于SerialPort类实现串口通讯详解

C#基于SerialPort类实现串口通讯详解

C#基于SerialPort类实现串⼝通讯详解本⽂实例为⼤家分享了C#基于SerialPort类实现串⼝通讯的具体代码,供⼤家参考,具体内容如下最终效果窗体设置:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO.Ports;using System.Threading;using System.Windows.Forms;namespace SerialCommunication{public partial class Form1 : Form{System.Threading.SynchronizationContext m_SyncContext = null;SerialPort serialPort = null;ToHexadecimalString toHexadecimalString = new ToHexadecimalString();public Form1(){m_SyncContext = SynchronizationContext.Current;InitializeComponent();}//Data initializationprivate void Form1_Load(object sender, EventArgs e){string[] ports = SerialPort.GetPortNames();SerialPortNumber.Items.AddRange(ports);SerialPortNumber.SelectedIndex = SerialPortNumber.Items.Count > 0 ? 0 : -1;BaudRateCom.Text = "9600"; //Set parametersCheckBitCom.Text = "None";DataBitCom.Text = "8";StopBitCom.Text = "One";}//Send dataprivate void Send_Click(object sender, EventArgs e){try{//Send data and handle exceptionsbyte[] bytes = new byte[SendMessage.Text.Length];bytes = Encoding.Default.GetBytes(SendMessage.Text);serialPort.Write(bytes, 0, bytes.Length);}catch (Exception error){MessageBox.Show(error.Message);}}// Byte to hexadecimal string//Clear dataprivate void Clear_Click(object sender, EventArgs e){ReceiveMessage.Text = "";}private void Open_Click(object sender, EventArgs e){string portName = SerialPortNumber.Text;int buadRate = int.Parse(BaudRateCom.Text);Parity parity = 0;switch (CheckBitCom.Text){case "None":parity = Parity.None; break;case "Odd":parity = Parity.Odd; break;case "Even":parity = Parity.Even; break;case "Mark":parity = Parity.Mark; break;case "Space":parity = Parity.Space; break;}int dataBit = int.Parse(DataBitCom.Text);StopBits stopBits = 0;switch (StopBitCom.Text){case "None":stopBits = StopBits.None; break;case "One":stopBits = StopBits.One; break;case "Tow":stopBits = StopBits.Two; break;case "OnePointFive":stopBits = StopBits.OnePointFive; break;}try{if (Open.Text == "Open"){serialPort = new SerialPort(portName, buadRate, parity, dataBit, stopBits);serialPort.Open();Open.Text = "Close";}else if (Open.Text == "Close"){serialPort.Close();Open.Text = "Open";}}catch (Exception errror){MessageBox.Show(errror.Message);}serialPort.DataReceived += onDataReceived;}private void onDataReceived(object sender, SerialDataReceivedEventArgs e){try{Byte[] bytes = new byte[serialPort.BytesToRead];serialPort.Read(bytes, 0, serialPort.BytesToRead);m_SyncContext.Post(new SendOrPostCallback((obj) =>{ReceiveMessage.AppendText(Encoding.Default.GetString(bytes));}), bytes);}catch (Exception error){MessageBox.Show(error.Message);}}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

C#使用SerialPort类设计串口通讯程序

C#使用SerialPort类设计串口通讯程序

使用SerialPort类设计串口通讯程序一.概述输送带控制模块的核心技术是与PLC的串口通讯,在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。

但在技术广泛应用的今天,Visual S 没有将此控件加入控件库,所以人们采用了许多方法在Visual 来编写串口通讯程序:第一种方法是通过采用Visual Studio 6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。

现在微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。

NET Framework 2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,这里着重讨论了Visual Studio 6.0的MSComm控件和SerialPort类设计方法的异同点。

二.SerialPort常用属性、方法和事件1.命名空间System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O 和事件驱动的I/ O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using Sys tem.IO.Ports。

2.串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm 中相关的属性是CommPort和Settings。

用C++Builder编写基于线程的串行通信程序

用C++Builder编写基于线程的串行通信程序

用C++Builder编写基于线程的串行通信程序
姜滨
【期刊名称】《计算机与数字工程》
【年(卷),期】2000(028)005
【摘要】本文介绍了Win95下线程多任务的基本原理和串行通信中使用的主要API函数,并使用线程的方法在C++Builder下开发实时性要求很高的Win95下的串行通信程序。

【总页数】5页(P47-51)
【作者】姜滨
【作者单位】华中光电技术研究所,武汉
【正文语种】中文
【中图分类】TP311.1
【相关文献】
1.基于Java的多线程技术开发PC/PLC串行通信程序 [J], 龚建芳;周琴
2.基于Win32 API的多线程串行通信程序设计 [J], 赵彦锋;李钢
3.C++Builder在工业监控串行通信程序中的应用 [J], 黎其武;马钊;季筱隆
4.基于Delphi多线程的串行通信程序设计 [J], 贺建民;闵锐
5.基于Win32的多线程串行通信程序设计 [J], 濮东华;陈离;徐伯庆
因版权原因,仅展示原文概要,查看原文内容请购买。

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