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

合集下载

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>/// <param name="disposing">如果应释放托管资源,为true;否则为false。

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

在C++中实现多线程网络服务器

在C++中实现多线程网络服务器

在C++中实现多线程网络服务器多线程网络服务器是一种可以同时处理多个客户端请求的服务器。

它使用多个线程来处理客户端连接和请求,以便提高服务器的并发性能和响应速度。

在C++中,可以使用标准库中的线程和套接字类来实现多线程网络服务器。

首先,我们需要创建用于接受客户端连接的套接字,并绑定到一个特定的端口上。

可以使用socket和bind函数来完成这一步骤。

然后,我们可以使用listen函数来监听套接字上的连接请求。

一旦有客户端连接请求到达服务器,我们需要创建一个新的线程来处理该客户端的请求。

可以使用std::thread类来创建新的线程,并把处理函数作为参数传递给线程对象的构造函数。

处理函数可以是一个无限循环,不断接收客户端请求并处理。

可以使用accept函数来接受客户端连接,并用recv函数来接收客户端发送的数据。

在处理函数中,我们可以根据客户端的请求进行相应的处理。

例如,可以根据不同的请求类型执行不同的操作,或者将请求转发给其他线程或进程进行处理。

处理完成后,可以使用send函数将响应发送给客户端。

为了保证多个线程之间的数据安全性,我们需要使用互斥锁来对共享资源进行加锁和解锁。

可以使用std::mutex类来创建互斥锁,并使用std::lock_guard类来自动处理加锁和解锁。

除了互斥锁之外,我们还可以使用条件变量来实现线程之间的同步。

条件变量可以用来等待某个条件的发生,并在条件满足时通知其他线程。

可以使用std::condition_variable类来创建条件变量,并使用std::unique_lock类来对条件变量进行加锁和解锁。

在编写多线程网络服务器时,需要注意以下几点:1.线程安全性:确保多个线程之间对共享资源的访问是安全的,避免出现竞态条件等问题。

2.数据同步:使用互斥锁和条件变量来进行线程之间的同步,以保证数据的正确性和一致性。

3.异常处理:处理线程中可能出现的异常,包括网络连接异常和数据处理异常等。

VC++之线程和进程之用剪贴板实现进程间通信

VC++之线程和进程之用剪贴板实现进程间通信

一、创建对话框应用程序工程二、编辑对话框资源控件ID及标题IDD_THREAD_DIALOG 用剪贴板实现进程间通信IDC_STATIC 进程1发送数据:IDC_EDIT_SENDIDC_STATIC 进程2接收数据:IDC_EDIT_RECIDC_SEND 发送IDC_REC 接收三、添加消息响应函数四、于“ThreadDlg.cpp”文件内添加消息响应函数代码void CThreadDlg::OnRec(){// TODO: Add your control notification handler code here if(OpenClipboard()){if(IsClipboardFormatAvailable(CF_TEXT)){HANDLE clipboard;char* buf;clipboard=GetClipboardData(CF_TEXT);buf=(char*)GlobalLock(clipboard);GlobalUnlock(clipboard);SetDlgItemText(IDC_EDIT_REC,buf);CloseClipboard();}}}void CThreadDlg::OnSend(){// TODO: Add your control notification handler code here if(OpenClipboard()) //打开剪贴板 {CString str;HANDLE clipboard;char * buf;EmptyClipboard(); //清空剪贴板GetDlgItemText(IDC_EDIT_SEND,str);clipboard=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);buf=(char*)GlobalLock(clipboard); //空字符作文本数据结尾,多分配一个字节strcpy(buf,str);GlobalUnlock(clipboard);SetClipboardData(CF_TEXT,clipboard);CloseClipboard();}}五、编译六、运行七、函数说明1、SetClipboardData()函数声明HANDLE SetClipboardData(UINT nFormat, //剪贴板格式HANDLE hMen //特定格式之数据句柄)功能:以特定剪贴板格式复制数据到剪贴板。

用c语言实现串口读写程序

用c语言实现串口读写程序

用c语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。

在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。

本文将介绍如何使用C语言实现串口读写程序。

二、硬件准备在进行串口通信之前,需要准备好相应的硬件设备。

一般来说,需要一台计算机和一个串口转USB模块(或者直接使用带有串口接口的计算机)。

同时,在单片机端也需要连接一个串口模块。

三、C语言编程实现1. 打开串口在C语言中,可以通过打开文件的方式来打开串口设备。

下面是一个示例代码:```#include <stdio.h>#include <fcntl.h>#include <termios.h>int open_serial_port(const char *device_path, int baud_rate) {int fd;struct termios options;fd = open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror("open_serial_port: Unable to open device");return -1;}fcntl(fd, F_SETFL, 0);tcgetattr(fd, &options);cfsetispeed(&options, baud_rate);cfsetospeed(&options, baud_rate);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;tcsetattr(fd, TCSANOW, &options);return fd;}```在上述代码中,open_serial_port函数用来打开串口设备,并设置相应的参数。

C语言实现串口通信

C语言实现串口通信

C语言实现串口通信在使用系统调用函数进行串口通信之前,需要打开串口设备并设置相关参数。

打开串口设备可以使用open(函数,设置串口参数可以使用termios结构体和tcsetattr(函数。

以下是一个简单的串口通信接收数据的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>int mainint fd; // 串口设备文件描述符char buff[255]; // 存储接收到的数据int len; // 接收到的数据长度//打开串口设备fd = open("/dev/ttyS0", O_RDONLY);if (fd < 0)perror("Failed to open serial port");return -1;}//设置串口参数struct termios options;tcgetattr(fd, &options);cfsetspeed(&options, B1200); // 设置波特率为1200 tcsetattr(fd, TCSANOW, &options);//接收数据while (1)len = read(fd, buff, sizeof(buff)); // 从串口读取数据if (len > 0)buff[len] = '\0'; // 将接收到的数据转为字符串printf("Received data: %s\n", buff);}}//关闭串口设备close(fd);return 0;```这段代码首先通过open(函数打开串口设备文件"/dev/ttyS0",然后使用tcgetattr(函数获取当前设置的串口参数,接着使用cfsetspeed(函数设置波特率为1200,最后使用tcsetattr(函数将设置好的串口参数写回。

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计一课程设计题目利用MSCOMM串口通信控件进行异步串行通信的VC程序设计二课程设计要求●环境要求:Windows95/98/2000/XP●功能要求:能将键盘上输入的数据发送到另一台计算机上;能将接收到的数据显示到屏幕窗口内;了解常用通信网络设备的操作和应用,掌握常用的通信协议的工作原理,能利用Visual C++、开发工具完成相应的通信程序的设计工作。

学习简明地介绍自己的设计工作。

三课程设计目的用Visual C++编程工具主机提供的接口,解决网络用户之间的交互式对话问题。

进一步深入掌握网络设计和通信程序的设计原理。

使学生对计算机通信网络的设计实现有较深的了解,培养较高的通信网络设计能力。

四程序思路硬件连接方面:数据的发送和接收由软件控制,不进行硬件握手,其连接方法如图真正需要互相连接的是RXD、TXD和GND;软件方面:串行端口的本质功能是作为CPU和串行设备间的编码转换器。

当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。

在接收数据时,串行的位被转换为字节数据在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。

使用非常方便。

⑴.在当前的Workspace中插入MSComm控件。

Project菜单------>Add to Project---->Components and Controls----->RegisteredActiveX Controls--->选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。

VC 串口编程基础之如何用 VC 打开串口和关闭串口

VC 串口编程基础之如何用VC 打开串口和关闭串口在对串口进行操作之前都需要先打开串口,VC 串口编程方法分为利用VC 串口控件(或VC 串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用VC 打开串口。

在Windows 32位以上操作系统(Win98以上)中,将串口(包括其它通信设备)作为文件来处理,所以串口的打开、读写和关闭所用API函数与文件操作函数一样。

所以打开串口用CreateFile,读串口用ReadFile,写串口用WriteFile,关闭串口用CloseHandle。

一、用VC 打开串口、关闭串口的API函数1、打开串口用CreateFile,其声明如下:1HANDLE CreateFile(2LPCTSTR lpFileName, // file name3DWORD dwDesiredAccess, // access mode4DWORD dwShareMode, // sha re mode5LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD6DWORD dwCreationDisposition, // how to create7DWORD dwFlagsAndAttributes, // file attributes8HANDLE hTemplateFile // handle to template file9);部分参数解释如下:●lpFileNam e:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2,若要知道您的电脑有哪此串口,可以打开设备管理器查看,如下图所示,或用丁丁串口调试助手,这个工具启动后会枚举系统当前存在的串口。

●dwDesiredAccess:访问类型,有读(dwDesiredAccess=GENERIC_READ)、写(dwDesiredAccess=GENERIC_WRITE)或两者兼有((dwDesiredAccess=GENERIC_READ | GENERIC_WRITE)。

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语言线程间的通信

c语言线程间的通信
在C语言中,线程间的通信可以通过多种方式实现,包括以下几种常用方法:
1. 共享内存:通过在多个线程之间共享一块内存区域来进行数据通信。

可以使用标准库中的`shmget()`函数创建共享内存,然后使用`mmap()`函数将共享内存映射到各个线程的地址空间。

2. 信号量:通过信号量控制多个线程的访问权限,从而实现线程间的同步和互斥。

可以使用`sem_init()`函数初始化一个信号量,然后使用`sem_wait()`和`sem_post()`函数进行等待和释放操作。

3. 互斥锁:通过互斥锁保护共享资源的访问,从而实现线程间的互斥访问。

可以使用`pthread_mutex_init()`函数初始化一个互斥锁,然后使用`pthread_mutex_lock()`和`pthread_mutex_unlock()`函数对互斥锁进行加锁和解锁操作。

4. 条件变量:通过条件变量实现线程间的等待和唤醒操作,从而实现线程间的同步。

可以使用`pthread_cond_init()`函数初始化一个条件变量,然后使用`pthread_cond_wait()`和
`pthread_cond_signal()`函数进行等待和唤醒操作。

5. 管道:通过管道在多个线程之间传输数据。

可以使用
`pipe()`函数创建一个管道,然后使用`read()`和`write()`函数进行读写操作。

以上是常见的几种线程间通信的方法,具体选择哪种方法取决于具体的需求和场景。

c语言串口编程实例

c语言串口编程实例摘要:1.串口编程基础2.C 语言串口编程步骤3.C 语言串口编程实例4.实例详解5.总结正文:一、串口编程基础串口编程是指通过计算机串行接口进行数据通信的编程方式。

串口(Serial Port)是一种计算机硬件接口,可以通过串行通信传输数据。

与并行通信相比,串行通信只需一条数据线,传输速度较慢,但具有线路简单、成本低的优点。

因此,串口编程在电子设备、计算机外设、通信设备等领域有广泛的应用。

二、C 语言串口编程步骤1.包含头文件:在使用C 语言进行串口编程时,首先需要包含头文件`<reg52.h>`或`<intrins.h>`。

2.配置串口:配置串口包括设置波特率、数据位、停止位、奇偶校验等参数。

3.初始化串口:初始化串口主要是初始化串口硬件,如配置UART(通用异步收发器)等。

4.打开串口:打开串口是指使能串口通信功能,以便数据传输。

5.读写串口:通过`in`和`out`语句实现数据的输入输出。

6.关闭串口:在数据传输完成后,需要关闭串口以节省资源。

7.串口通信:通过循环寄存器、缓存寄存器或FIFO(先进先出)等方法实现数据的收发。

三、C 语言串口编程实例以下是一个简单的C 语言串口编程实例,该实例通过串口发送数据“Hello, World!”:```c#include <reg52.h>#include <intrins.h>sbit UART_TXD = P3^1; // 配置UART TXD 引脚void init_uart(); // 初始化UART 函数void send_data(unsigned char dat); // 发送数据函数void main(){init_uart(); // 初始化UARTsend_data("H"); // 发送字符"H"send_data("e"); // 发送字符"e"send_data("l"); // 发送字符"l"send_data("l"); // 发送字符"o"send_data(" "); // 发送空格send_data("W"); // 发送字符"W"send_data("o"); // 发送字符"r"send_data("r"); // 发送字符"l"send_data("d"); // 发送字符"d"while(1); // 循环等待}void init_uart() // 初始化UART 函数{TMOD = 0x20; // 设置定时器1 为工作状态TH1 = 0xfd; // 设置定时器1 的计数值TL1 = 0xfd; // 设置定时器1 的计数值TR1 = 1; // 使能定时器1SCON = 0x40; // 设置串口工作状态ES = 0; // 开总中断EA = 1; // 开总中断允许}void send_data(unsigned char dat) // 发送数据函数{SBUF = dat; // 将数据存入缓存寄存器while(!TI); // 等待发送缓存清空TI = 0; // 清空发送缓存}```四、实例详解1.配置串口:通过设置UART TXD 引脚为P3.1,确定波特率、数据位、停止位和奇偶校验等参数。

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

借助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(退出;线程所属的进程被终止。 3、多线程在RS-322串口通信中的应用 3.1 串口通信对线程同步的要求 因为同一进程的所有线程共享进程的虚拟地址空间,而在WINDOWS中线程是汇编级中断,所以才有可能实现多个线程同时访问同一个对象。这些对象可以是全局变量、MFC的对象、MFC的API等。而串口通信对每个串口对象只提供一个缓冲区,发送接收都要用到这一个缓冲区,所以要求必须建立同步线程执行,使得一个时刻只能进行一种线程操作,以免通信出错。串口通信处理的多个线程需要协调运行,一个线程必须等待另一线程结束才能开始,在处理一个线程的同时必须把其余待处理的线程挂起等待,以减少其余待处理线程对CPU的资源占用,正处

理的线程一旦处理结束则通过线程间的通信发出信号来击活被挂起的线程中的一个线程进入处理。VC++提供了以下4个同步对象来协调实现多线程的并行:

Csemaphore信号灯对象,允许一定数量的现成访问某个资源,用来控制访问共享资源的线程数量。

Cmutex互斥量对象,一个时刻至多只允许一个线程访问某个资源,未被占用时处于有信号状态,可实现对共享线程的互斥访问。

Cevent事件对象,用于使一个线程统治其余现成某个事件正发生,所以可以用来实现禁止对某个资源的访问,直至该线程结束释放资源使资源处于有信号状态,从而使被挂起的线程被通知得以执行

CcriticalSection临界区对象,将一段代码置入临界缓冲区,并只允许一个线程进入执行这段代码,该临界缓冲区仅在创建这个缓冲区的进程中有效。

3.2 等待函数 为了实现线程在资源对象被占用时把自己挂起而阻塞自己执行,等待资源空闲信号停止阻塞继续执行,从而减少对CPU的资源占用,WIN32 API中提供了两个等待函数来实现这一功能:WaitForSingleObject((只可监控单个同步对象 WaitForMUultipleObjects(可同时监控多个同步对象。在监控系统中,处理串口通信只是CPU的一部分事物,所以必须使用等待函数提高程序的执行效率。

3.3 串口通信的重叠I/O方式 MFC对于串口通信是作为文件设备来处理的,用CreateFile(打开串口获得一个串口句柄。打开后由SetCommState(进行串口端口配置:缓冲区设置、超时设置、数据格式设置等等。设置成功后就可以调用ReadFile(和WriteFile(进行数据的读与写,用WaitCommEvent(监控通信事件。CloseHandle(用于关闭串口。在ReadFile(和WriteFile(进行串口读写时可以采取同步执行方式也可以采用重叠I/O方式。由于采用同步执行方式,被调用的函数必须执行结束后才被返回,这必然要求除正被执行线程外其余线程被挂起等待,效率低;而采用重叠I/O方式,被调用的函数不必等执行结束后才被返回,而是可以立即返回,因为I/O操作在后台执行,这样其他线程就不必等待马上可以进行处理其他事物,实现了不同线程可以在同一串口句柄上基本上接近同时实现读写操作,实现重叠,是通信的实时性提高。

采用重叠I/O方式,线程必须创建OVERLAPPED结构攻读写函数使用,该结构最重要的成员是hEvent事件句柄。它将作为线程的同步对象使用,读写函数完成时hEvent处于有信号状态,表示可以进行读写操作;读写函数未完成时hEvent 被置于无信号状态。

4、多线程应用在串口通信程序中的实现 应用程序需专门建立一个串口通信类,并在串口通信相关程序段中应用相关函数实现多线程的应用,下面给出实现多线程应用的的关键函数的核心代码。

1.专门针对COM1的初始化程序段(只写出涉及多线程应用的关键步骤 BOOL InitComm(//串口初始化 { HANDLE m_hComm; COMMTIMEOUTS m_CommTimeouts; m_hComm = CreateFile(“COM1” , //这里只使用串口1,如要对多个串口初始化需先在初始化前进入代码临界区,以保证在某时刻只对一个串口初始化

GENERIC_READ | GENRIC_WRITE, //定义串口打开类型为可读写 0, //以独占串口资源模式打开串口 NULL, //对该串口不设置安全属性 OPEN_EXISTING,FILE_FLAG_OVERLAPPED, //设置重叠I/O模式 0; if (m_hComm==INVALID_HANDLE_VALUE //串口打开不成功 {return FALSE;} m_CommTimeouts.ReadIntervalTimeout = 1000; //进行超时设置,具体量值根据实际需要调整

m_CommTimeouts.ReadTotaloutMultiplier = 500; //进行超时设置 m_CommTimeouts.ReadTotaloutConstant = 5000; //进行超时设置 m_CommTimeouts.WriteTotaloutMultiplier = 500; //进行超时设置 m_CommTimeouts.WriteTotaloutConstant = 5000; //进行超时设置 if(! SetCommTimeouts(m_hComm,&m_CommTimeouts {CloseHandle(m_hComm; return FALSE;} PurgeComm (m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT |PURGE_TXABORT; //清除串口缓冲区

Reture TRUE; } 在上述串口初始化成功后,监控应用主程序就可以通过应用AfxBejinThread(函数来建立串口监控用的工作者线程从而实现对该串口通信多线程的并行管理,如果要对多个串口同时监控,可以分别对各个串口建立监控线程,各自实现对应串口的通信多线程的并行管理。下面是建立串口监控用的工作者线程的关键程序段代码(只写出涉及多线程应用的关键步骤。

UINT CommThread(LPVOID pParam //用于监控串口用的工作者线程 { BOOL bResult = FLASE; If(m_hComm //查看前述串口初始化程序是否已打开串口 PurgeComm (m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT |PURGE_TXABORT;

for(;; //只要所要监控的串口有线程在运行,就一直处于监视端口行为的无限循环

{ bResult = WaitCommEvent(m_hComm,&Event,&m_ov; // m_ov是OVERLAPPED类型的成员变量

if(! bResult {//进行相关的出错处理的具体函数调用过程。这里与主题无关,略去不表述 } else { Event = WaitForMultipleObjects(4, m_hEvent, FALSE, INFINITE; //无限等待设定的事件发生,其中m_hEvent根据需要设定了须响应的接收、发送、关闭串口事件以及OVERLAPPED类型的hEvent事件

Switch(Event {//串口进行数据读写事件的响应处理过程。这里与主题无关,略去不表述 } return 0; } 在编写远程监控串口通讯主程序时增加上述的关键程序段就可实现串口通讯程序的多线程应用,从而提高串口的事件响应能力,提高远端的数据交互实时性。

5、结束语 做为一个机房远程监控系统的通信组成部分,该应用多线程的串口通信程序在VC++6.0中编译通过,在以WINDOWS操作系统为广电网络安全管理平台(用户人机界面的远程监控管理中运行状况良好,有效的提高了信息管理的实时性。

该程序除了具体开发的应用对象广电网络无人值守机房中适用,还可以推广到相似的只要是以WINDOWS为界面管理平台的一切远程通信的串口管理中,提高串口通信的实时性。

相关文档
最新文档