串口编程中SerialPort类介绍以及应用
- 格式:pdf
- 大小:54.50 KB
- 文档页数:4
前几篇串口编程大致讲述了Windows下串口的大致操作,接下来分析流行的SerialPort类,它把Windows API封装好,方便开发利用1、Win32下串口大致操作流程(1)打开串口:CreateFile函数(2)建立串口通信事件:CreateEvent函数(3)初始化串口:SetCommState函数(4)建立监视线程,即读写数据线程,因为我们不知道什么时候数据会到来,这里是一个异步事件(5)写数据:WriteFile(6)结束:关闭线程->停止WaitCommEvent->CloseHandle2.SerialPort类的数据结构大致了解操作流程后,先看一下SerialPort类,均在代码注释了数据成员:view plaincopy to clipboardprint?public:int m_nWriteSize; //要写入串口的数据大小HANDLE m_hComm; //串口句柄protected:// thread监视线程CWinThread* m_Thread;// synchronisation objects//临界资源CRITICAL_SECTION m_csCommunicationSync;//监视线程运行标志BOOL m_bThreadAlive;// handles/*事件句柄*/HANDLE m_hWriteEvent;HANDLE m_hShutdownEvent;// There is a general shutdown when the port is closed.//事件数组,包括一个写事件,接收事件,关闭事件HANDLE m_hEventArray[3];// structuresOVERLAPPED m_ov; //异步I/O模型COMMTIMEOUTS m_CommTimeouts; //超时设置DCB m_dcb; //设备控制块// owner windowCWnd* m_pOwner;// miscUINT m_nPortNr;char* m_szWriteBuffer; //写缓冲区DWORD m_dwCommEvents; //DWORD m_nWriteBufferSize; //写缓冲大小函数成员:view plaincopy to clipboardprint?public:/*******************Port Operation***********************/// port initialisation/*初始化串口*/BOOL InitPort(CWnd* pPortOwner,UINT portnr = 1,UINT baud = 19200,char parity = 'N',UINT databits = 8,UINT stopbits = 1,DWORD dwCommEvents = EV_RXCHAR,UINT writebuffersize = 1024);//关闭端口void ClosePort();// start/stop comm watching//控制串口监视线程BOOL StartMonitoring(); //开启BOOL RestartMonitoring(); //复位BOOL StopMonitoring(); //停止DWORD GetWriteBufferSize();//获取写缓冲大小DWORD GetCommEvents(); //获取事件DCB GetDCB(); //获取DCB//写数据到串口void WriteToPort(char* string);void WriteToPort(char* string,int n);void WriteToPort(LPCTSTR string);void WriteToPort(LPCTSTR string,int n);protected:/***************** protected memberfunctions **********************/ void ProcessErrorMessage(char* ErrorText);//线程函数static UINT CommThread(LPVOID pParam);//接收字符static void ReceiveChar(CSerialPort* port, COMSTAT comstat);//写字符static void WriteChar(CSerialPort* port);3.串口操作(1)初始化串口流程:检查参数-->检测线程-->创建事件(监视线程)-->打开端口-->设置异步IO结构参数,详细见代码:view plaincopy to clipboardprint?/*初始化串口*/BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)UINT portnr, // portnumber (1..4)UINT baud, // baudratechar parity, // parityUINT databits, // databitsUINT stopbits, // stopbitsDWORD dwCommEvents, // EV_RXCHAR, EV_CTS etcUINT writebuffersize) // size to the writebuffer{assert(portnr > 0 && portnr < 5);assert(pPortOwner != NULL);// if the thread is alive: Kill//线程在的话关断它if (m_bThreadAlive){do{SetEvent(m_hShutdownEvent);} while (m_bThreadAlive);TRACE("Thread ended\n");}// create events//创建事件if (m_ov.hEvent != NULL)ResetEvent(m_ov.hEvent);m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hWriteEvent != NULL)ResetEvent(m_hWriteEvent);elsem_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hShutdownEvent != NULL)ResetEvent(m_hShutdownEvent);elsem_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);// initialize the event objects//事件数组初始化,设定优先级别m_hEventArray[0] = m_hShutdownEvent; // highest prioritym_hEventArray[1] = m_ov.hEvent;m_hEventArray[2] = m_hWriteEvent;// initialize critical section//初始化一个临界资源对象InitializeCriticalSection(&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!/*********************************************多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。
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>/// 设计器支持所需的方法- 不要/// 使用代码编辑器修改此方法的内容。
串⼝serial port 属性详解⽬次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 控件。
ms-help://MS.VSCC.v80/MS.MSDN.v80/DEV FX.v20.chs/cpref8/html/T_Syst em_IO_P ort s_Ser ialPo rt_Me mbers.htm//串口控件一.概述在Visua l Studio 6.0中编写串口通讯程序,一般都使用M icros oft Commun icati on Contro l(简称MSCo mm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在Micr osof技术广泛应用的今天,Visual Studi没有将此控件加入控件库,所以人们采用了许多方法在Visu al Studi来编写串口通讯程序:第一种方法是通过采用V isual Studio 6.0中原来的M SComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用AP I 写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。
现在微软推出了最新版本的Visu al Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。
NET Framew ork 2.0 类库包含了S erial Port类,方便地实现了所需要串口通讯的多种功能,为了使MSC omm 编程方法快速转换到以Se rialP ort类为核心的串口通讯的设计方法,本文着重讨论了Visu al Studio 6.0的MSCo mm控件和Seria lPort类设计方法的异同点。
二.Serial Port常用属性、方法和事件1.命名空间System.IO.Ports命名空间包含了控制串口重要的Se rialP ort类,该类提供了同步I/O 和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Us ing System.IO.Ports。
C#串⼝通信SerialPort类因为公司项⽬需要将USB扫码枪改为串⼝扫码枪,串⼝扫码的好处在于不需要⼀个输⼊框来接受USB扫出来的⽂本,能解决多个扫码枪⼀起扫码时的并发问题,所以需要⽤到多线程及串⼝技术。
⼀、串⼝通信简介串⾏接⼝(串⼝)是⼀种可以将接受来⾃CPU的并⾏数据字符转换为连续的串⾏数据流发送出去,同时可将接受的串⾏数据流转换为并⾏的数据字符供给CPU的器件。
⼀般完成这种功能的电路,我们称为串⾏接⼝电路。
串⼝通信(Serial Communications)的概念⾮常简单,串⼝按位(bit)发送和接收字节。
尽管⽐按字节(byte)的并⾏通信慢,但是串⼝可以在使⽤⼀根线发送数据的同时⽤另⼀根线接收数据。
串⼝通信最重要的参数是波特率、数据位、停⽌位和奇偶校验。
对于两个进⾏通信的端⼝,这些参数必须匹配。
1. 波特率:这是⼀个衡量符号传输速率的参数。
指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送960个字符,⽽每个字符格式包含10位(1个起始位,1个停⽌位,8个数据位),这时的波特率为960Bd,⽐特率为10位*960个/秒=9600bps。
2. 数据位:这是衡量通信中实际数据位的参数。
当计算机发送⼀个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。
标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。
3. 停⽌位:⽤于表⽰单个包的最后⼏位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每⼀个设备有其⾃⼰的时钟,很可能在通信中两台设备间出现了⼩⼩的不同步。
因此停⽌位不仅仅是表⽰传输的结束,并且提供计算机校正时钟同步的机会。
4. 校验位:在串⼝通信中⼀种简单的检错⽅式。
有四种检错⽅式:偶、奇、⾼和低。
当然没有校验位也是可以的。
⼆、C#串⼝编程类从.NET Framework 2.0开始,C#提供了SerialPort类⽤于实现串⼝控制。
C++中的SerialPort用法一、概述在C++编程中,SerialPort(串口)是一种常用的通信方式。
它可以用于连接各种外部设备,进行数据传输和通信。
本文将详细介绍在C++中如何使用SerialPort,并且通过实例演示其用法。
二、SerialPort的基本概念1. 串口是一种通过串行通信接口进行数据传输的设备,它通过一根线缆(串口线)进行数据传输。
2. 串口通信有多种标准,如RS-232、RS-485等,不同的标准有不同的电气特性和数据传输速率。
3. 在C++中,可以使用串口库来实现串口通信,常见的串口库有Boost.Asio、Qt SerialPort等。
三、使用Boost.Asio进行串口通信Boost.Asio是一个开源的C++库,用于实现异步I/O操作。
它提供了丰富的网络和串口通信功能,可以方便地进行串口通信开发。
1. 安装Boost库在使用Boost.Asio之前,首先需要安装Boost库。
可以从Boost全球信息站(网络协议sxxx)下载最新版本的Boost库,并按照全球信息站提供的安装说明进行安装。
2. 创建SerialPort对象在C++中使用Boost.Asio库进行串口通信,首先需要创建一个SerialPort对象,并指定串口名称、波特率等参数。
```c++#include <boost/asio.hpp>using namespace boost::asio;// 创建SerialPort对象io_service io;serial_port serial(io, "COM1"); // 指定串口名称serial.set_option(serial_port::baud_rate(9600)); // 设置波特率```3. 读写串口数据创建好SerialPort对象之后,即可通过它进行串口数据的读写操作。
```c++// 向串口写入数据std::string write_data = "Hello, SerialPort!";write(serial, buffer(write_data));// 从串口读取数据char read_data[100];size_t len = read(serial, buffer(read_data, 100));```4. 异步串口通信Boost.Asio库支持异步串口通信,可以通过回调函数处理串口数据的读写操作。
SerialPort类的⽤法与⽰例Microsoft .Net框架SerialPort类的⽤法与⽰例从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,⽤户可以⾮常简单地编写少量代码就完成串⼝的信息收发程序。
本⽂将介绍如何在PC端⽤C# .Net 来开发串⼝应⽤程序。
1. 串⼝硬件信号定义DB9 Connector 信号定义针脚信号定义作⽤1DCD载波检测Received Line Signal Detector(Data Carrier Detect)2RXD接收数据Received Data3TXD发送数据Transmit Data4DTR数据终端准备好Data Terminal Ready5SGND信号地Signal Ground6DSR数据准备好Data Set Ready7RTS请求发送Request To Send8CTS清除发送Clear To Send9RI振铃提⽰Ring Indicator2. 串⼝端⼝号搜索⼀个最简单的办法:string[] portList = System.IO.Ports.SerialPort.GetPortNames();for (int i = 0; i < portList.Length; i++){string name = portList[i];comboBox.Items.Add(name);}还有⼀种通过调⽤API的⽅法来获取实现,可以获取详细的完整串⼝名称,对于USB-to-COM虚拟串⼝来说特别适⽤。
通过下⾯程序可以获取到与设备管理器中⼀样的名字,例如“Prolific USB-to-Serial Comm Port(COM34)”,⽽上⾯的⽅法只能获取到“COM34”。
/// <summary>/// 枚举win32 api/// </summary>public enum HardwareEnum{// 硬件Win32_Processor, // CPU 处理器Win32_PhysicalMemory, // 物理内存条Win32_Keyboard, // 键盘Win32_PointingDevice, // 点输⼊设备,包括⿏标。
一、什么是串口串口是计算机与外部设备进行数据通信的一种接口,通过串口可以实现计算机与外部设备之间的数据传输。
通常情况下,串口包括一个发送线路和一个接收线路,用于传输数据。
串口通信可以通过物理连接或虚拟连接进行,常见的物理连接方式包括RS232,RS422和RS485等,而虚拟连接方式则包括USB转串口、蓝牙串口等。
二、串口的使用场景1. 工业控制领域在工业控制领域,串口被广泛应用于PLC(可编程逻辑控制器)、传感器、仪器仪表等设备的数据通信中。
通过串口,这些设备可以向主控计算机发送数据,或者接收主控计算机发送的控制指令,实现自动化控制。
2. 嵌入式系统开发在嵌入式系统开发中,串口通信也扮演了重要的角色。
开发人员可以通过串口与嵌入式设备进行通信,进行程序烧录、调试、数据传输等操作,方便对嵌入式设备进行控制和管理。
3. 通信设备通信设备如调制解调器、路由器等网络设备,也常使用串口进行数据传输和控制,例如通过串口进行配置、升级、诊断等操作。
4. 数据采集与监控在数据采集与监控系统中,串口可以连接各种传感器和监控设备,实现实时数据的采集和监控。
气象站、环境监测站的数据采集设备,通过串口与上位机进行数据传输。
三、串口的基本使用方法1. 串口的配置在使用串口进行通信之前,首先需要对串口进行配置,如波特率、数据位、停止位、奇偶校验等。
这些配置需要与通信的外部设备保持一致,才能够确保正常的数据传输。
2. 串口的打开和关闭在进行串口通信时,需要打开串口以建立通信连接,并在通信结束后关闭串口以释放资源,避免资源的浪费和冲突。
3. 串口的数据收发在串口通信中,数据的发送和接收是必不可少的部分。
通过串口发送数据时,需要将待发送的数据写入串口缓冲区,然后通过串口发送功能将数据发送出去;而在接收数据时,则需要通过串口接收功能从串口缓冲区中读取数据。
4. 串口的事件处理除了常规的数据收发操作,串口通信还需要处理一些事件,如串口接收到数据的事件、串口发送完成的事件等。
serialport 使用方法(原创版3篇)目录(篇1)1.引言2.serialport 的定义和作用3.serialport 的使用方法4.serialport 的常见问题及解决方法5.结论正文(篇1)一、引言在电子设备和计算机之间的通信中,串行通信是一种常见的通信方式。
而在 Python 中,我们可以使用 pyserial 库中的 serialport 模块来实现串行通信。
本文将为大家介绍 serialport 的使用方法。
二、serialport 的定义和作用serialport,即串行端口,是计算机上的一个硬件设备,负责实现串行通信。
在 Python 中,我们可以通过 pyserial 库来操作 serialport,从而实现与外部设备的通信。
三、serialport 的使用方法1.导入库首先,我们需要导入 pyserial 库。
在命令行中输入以下命令:```pip install pyserial```然后在 Python 代码中加入以下导入语句:```pythonimport serial```2.创建串行对象使用`serial.Serial()`方法创建一个串行对象,其中参数`port`表示串行端口号,`baudrate`表示波特率,`parity`表示校验方式,`stopbits`表示停止位,`bytesize`表示数据位。
```pythonser = serial.Serial(port="COM3", baudrate=9600,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)```3.打开串行端口使用`ser.open()`方法打开串行端口。
如果端口打开成功,`ser.isOpen()`方法将返回 True。
```pythonif ser.isOpen():print("串行端口已打开")else:ser.open()```4.读写数据使用`ser.read()`方法从串行端口读取数据,使用`ser.write()`方法向串行端口发送数据。
SerialPort类的常用属性及方法.一、 SerialPort类的常用属性三、数据发送示例Private Sub fasong()serialPort1.PortName = "COM1"serialPort1.BaudRate = 9600serialPort1.Open()Dim data As Byte() = Encoding.Unicode.GetBytes(textBox1.Text)Dim str As String = Convert.ToBase64String(data)serialPort1.WriteLine(str)MessageBox.Show("数据发送成功!", "系统提示")End Sub四、接受示例Private Sub jieshou()Dim data As Byte() = Convert.FromBase64String(serialPort1.ReadLine())textBox2.Text = Encoding.Unicode.GetString(data)serialPort1.Close()MessageBox.Show("数据接收成功!", "系统提示")End Sub五、通过串口关闭对方计算机(1)新建一个项目,命名为Ex13_02,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于打开通信串口和关闭对方计算机。
(3)主要程序代码。
Private Sub button1_Click(sender As Object, e As EventArgs) '打开串口serialPort1.PortName = "COM1"serialPort1.Open()button1.Enabled = Falsebutton2.Enabled = TrueEnd Sub'数据接收事件,等待接收关机命令Private Sub serialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)Dim data As Byte() = Convert.FromBase64String(serialPort1.ReadLine())Dim str As String = Encoding.Unicode.GetString(data)serialPort1.Close()If str = "关机" ThenDim p As New Process()p.StartInfo.FileName = "cmd.exe"eShellExecute = Falsep.StartInfo.RedirectStandardInput = Truep.StartInfo.RedirectStandardOutput = Truep.StartInfo.RedirectStandardError = Truep.StartInfo.CreateNoWindow = Truep.Start()p.StandardInput.WriteLine("shutdown /s")p.StandardInput.WriteLine("exit")End IfEnd Sub'发送关机命令Private Sub button2_Click(sender As Object, e As EventArgs) If button2.Text = "关闭计算机" Then'发送关机命令数据Dim data As Byte() = Encoding.Unicode.GetBytes("关机") Dim str As String = Convert.ToBase64String(data) serialPort1.WriteLine(str)button2.Text = "取消关机"Elsebutton2.Text = "关闭计算机"button1.Enabled = Truebutton2.Enabled = False'取消关机Dim p As New Process()p.StartInfo.FileName = "cmd.exe"eShellExecute = Falsep.StartInfo.RedirectStandardInput = Truep.StartInfo.RedirectStandardOutput = Truep.StartInfo.RedirectStandardError = Truep.StartInfo.CreateNoWindow = Truep.Start()p.StandardInput.WriteLine("shutdown /a")p.StandardInput.WriteLine("exit")End If End Sub。