(SerialPort)串口编程知识整理
串口通信的基本知识
串口通信的基本知识本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。
串口通讯,RS232,RS485,停止位,奇校验,偶校验1 串口通讯串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
2 串口通讯的数据格式一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。
3 通讯方式单工模式(Simplex Communication)的数据传输是单向的。
通信双方中,一方固定为发送端,一方则固定为接收端。
信息只能沿一个方向传输,使用一根传输线。
半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。
数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。
因此半双工模式既可以使用一条数据线,也可以使用两条数据线。
半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。
因为有切换,所以会产生时间延迟,信息传输效率低些。
全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。
因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。
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库支持异步串口通信,可以通过回调函数处理串口数据的读写操作。
Serial接口详解
Serial接口详解Serial接口是一种用于在计算机和其他设备之间传输数据的通信接口,该接口通常被用于串行通信。
本文将详细介绍Serial接口的工作原理和使用方法。
1. 基本概念1.1 串行通信串行通信是一种逐位地传输数据的方式。
与并行通信相比,串行通信只使用一个传输线路来传送数据,这使得串行通信在连接距离较远的设备之间具有更好的灵活性和可扩展性。
1.2 Serial接口Serial接口是一种用于串行通信的硬件和软件接口。
它将计算机或控制器与设备之间的数据传输进行协调和管理。
2. 工作原理2.1 传输方式Serial接口通过逐位地传输数据来进行通信。
数据以比特(bit)的形式通过传输线路传输。
串行通信是一个双向的过程,即数据可以在两个方向上进行传输。
2.2 传输速率Serial接口的传输速率以波特率(baud rate)来度量。
波特率表示每秒钟传输的比特数。
波特率越高,数据传输速度越快。
2.3 数据帧数据帧是Serial接口传输的数据单元。
它包含了数据位、起始位、停止位和可能的校验位。
起始位和停止位用于标识数据的起始和结束,而校验位用于验证数据的完整性。
3. 使用方法3.1 连接设备使用Serial接口进行通信时,首先需要将计算机或控制器与目标设备进行连接。
这通常涉及使用串行线缆将两个设备的串行端口相连。
3.2 配置通信参数在进行Serial通信之前,需要配置一些通信参数,如波特率、数据位、停止位和校验位等。
这些参数需要与目标设备的配置相匹配,才能实现有效的通信。
3.3 通信协议使用Serial接口进行通信时,需要定义一套通信协议。
通信协议包括发送和接收数据的格式、数据帧的结构以及错误处理等内容。
4. 总结通过本文,我们详细了解了Serial接口的工作原理和使用方法。
Serial接口是一种常用的通信接口,它通过串行通信的方式实现数据传输。
熟悉Serial接口的原理和使用方法,有助于我们在实际应用中正确地配置和操作Serial接口,实现可靠的数据传输。
serial_port 用法
一、什么是串口串口是计算机与外部设备进行数据通信的一种接口,通过串口可以实现计算机与外部设备之间的数据传输。
通常情况下,串口包括一个发送线路和一个接收线路,用于传输数据。
串口通信可以通过物理连接或虚拟连接进行,常见的物理连接方式包括RS232,RS422和RS485等,而虚拟连接方式则包括USB转串口、蓝牙串口等。
二、串口的使用场景1. 工业控制领域在工业控制领域,串口被广泛应用于PLC(可编程逻辑控制器)、传感器、仪器仪表等设备的数据通信中。
通过串口,这些设备可以向主控计算机发送数据,或者接收主控计算机发送的控制指令,实现自动化控制。
2. 嵌入式系统开发在嵌入式系统开发中,串口通信也扮演了重要的角色。
开发人员可以通过串口与嵌入式设备进行通信,进行程序烧录、调试、数据传输等操作,方便对嵌入式设备进行控制和管理。
3. 通信设备通信设备如调制解调器、路由器等网络设备,也常使用串口进行数据传输和控制,例如通过串口进行配置、升级、诊断等操作。
4. 数据采集与监控在数据采集与监控系统中,串口可以连接各种传感器和监控设备,实现实时数据的采集和监控。
气象站、环境监测站的数据采集设备,通过串口与上位机进行数据传输。
三、串口的基本使用方法1. 串口的配置在使用串口进行通信之前,首先需要对串口进行配置,如波特率、数据位、停止位、奇偶校验等。
这些配置需要与通信的外部设备保持一致,才能够确保正常的数据传输。
2. 串口的打开和关闭在进行串口通信时,需要打开串口以建立通信连接,并在通信结束后关闭串口以释放资源,避免资源的浪费和冲突。
3. 串口的数据收发在串口通信中,数据的发送和接收是必不可少的部分。
通过串口发送数据时,需要将待发送的数据写入串口缓冲区,然后通过串口发送功能将数据发送出去;而在接收数据时,则需要通过串口接收功能从串口缓冲区中读取数据。
4. 串口的事件处理除了常规的数据收发操作,串口通信还需要处理一些事件,如串口接收到数据的事件、串口发送完成的事件等。
serialport 使用方法
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()`方法向串行端口发送数据。
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,确定波特率、数据位、停止位和奇偶校验等参数。
学习串口参数详解:波特率,数据位,停止位,奇偶校验位
学习串口参数详解:波特率,数据位,停止位,奇偶校验位串口常用参数,串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。
中文名:串口常用参数属性:通用设备通信的协议相关:通用串行总线特点;计算机包含两个基于RS232的串口简介串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:(1)地线,(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配:波特率这是一个衡量符号传输速率的参数。
它表示每秒钟传送的符号的个数。
例如300波特表示每秒钟发送300个符号。
当我们提到时钟周期时,我们就是指波特率,例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
串口基础知识
串口基础知识一、什么是串口?串口(Serial Port),也称为COM口(Communication Port),是一种用于数据传输的通信接口,常用于计算机与外部设备之间的数据传输。
串口采用串行传输方式,即逐位地发送和接收数据,相比并行传输方式,串口的数据传输速率较慢,但具有传输距离远、连接设备数量多的优势。
二、串口的工作原理串口的工作原理是通过发送和接收电平信号来传输数据。
串口通信使用的是两根信号线:发送线(Tx)和接收线(Rx)。
发送线上的电平变化表示发送的二进制数据,接收线上的电平变化表示接收到的二进制数据。
发送方通过发送线将数据按照一定的协议发送给接收方,接收方通过接收线接收数据并进行处理。
三、串口的通信参数串口通信需要设置一些参数,以确保通信的正确性和稳定性。
常用的串口通信参数包括:1. 波特率(Baud Rate):表示每秒钟传输的位数,常用的波特率有9600、115200等。
2. 数据位(Data Bits):表示每个字节的位数,常用的数据位有7位、8位。
3. 停止位(Stop Bits):表示停止位的个数,常用的停止位有1位、1.5位、2位。
4. 校验位(Parity Bit):用于检测数据传输过程中的错误,常用的校验位有无校验、奇校验、偶校验。
四、串口的应用领域串口广泛应用于各种设备之间的数据通信,常见的应用领域有:1. 电脑与外部设备之间的数据传输,如打印机、扫描仪、数码相机等。
2. 嵌入式系统中,用于与传感器、执行器等外部设备进行数据交互。
3. 工业自动化领域,用于控制和监控设备之间的数据传输。
4. 通信设备中,如调制解调器、路由器等。
五、串口的优缺点串口作为一种通信接口,具有以下优点:1. 传输距离远:串口的传输距离可以达到几百米,适用于远距离通信。
2. 连接设备数量多:串口可以通过串口转换器扩展连接多个设备。
3. 通信稳定可靠:串口通信采用的是同步传输方式,可以保证数据的准确传输。
qserialport高级编程
qserialport高级编程QSerialPort是Qt框架中用于串口通信的类,它提供了一种方便的方式来在Qt应用程序中进行串口通信。
在进行QSerialPort高级编程时,我们可以从以下几个方面来全面了解和使用它:1. 打开和关闭串口,使用QSerialPort类可以很容易地打开和关闭串口。
在打开串口时,我们可以设置串口的参数,如波特率、数据位、停止位和校验位等。
而在关闭串口时,我们需要确保在不需要使用串口时及时关闭,以释放资源。
2. 读写数据,QSerialPort类提供了read和write方法来进行数据的读取和写入。
在高级编程中,我们可以通过设置超时时间、使用信号槽机制等方式来确保数据的稳定和准确的读写。
3. 错误处理,在串口通信中,可能会出现各种错误,如串口无法打开、数据传输超时、校验错误等。
在高级编程中,我们需要考虑如何处理这些错误,可以通过捕获错误码、设置错误处理策略等方式来保证程序的稳定性和可靠性。
4. 事件驱动,QSerialPort类支持事件驱动的串口通信,我们可以利用信号槽机制来处理串口事件,比如数据到达事件、错误事件等。
在高级编程中,我们可以充分利用事件驱动的特性来实现更加灵活和高效的串口通信。
5. 跨平台兼容性,Qt框架具有良好的跨平台兼容性,因此使用QSerialPort进行高级编程时,可以在不同的操作系统上实现相似的串口通信功能,这为开发者提供了很大的便利。
总之,QSerialPort类提供了丰富的API和功能,可以满足各种复杂的串口通信需求。
在进行高级编程时,我们需要充分了解其特性和用法,从多个角度全面考虑和处理各种情况,以确保程序的稳定性和可靠性。
serialportparameter参数
经过仔细评估和思考,我将为您撰写一篇关于“串口参数(serial port parameter)”的文章。
在文章中,我将从串口参数的定义、作用、设置方法以及应用领域等方面进行深入探讨,并共享我个人对这一主题的观点和理解。
【串口参数(Serial Port Parameter)】1. 串口参数的定义和作用串口参数是指用于配置和控制串行端口或串口通信的一系列参数,它们包括波特率(Baud Rate)、数据位(Data Bits)、停止位(Stop Bits)、奇偶校验(Parity)和流控制等。
这些参数的设置可以影响串口通信的稳定性、速度和可靠性,对于串口通信的正常运作起着至关重要的作用。
2. 串口参数的设置方法对于不同的串口设备和应用场景,串口参数的设置方法可能有所不同。
一般来说,可以通过串口通信软件或者编程语言中的串口通信库来进行参数的配置和设置。
在具体操作时,需要根据串口设备的要求和通信需求,依次设置波特率、数据位、停止位、奇偶校验等参数,以确保串口通信的稳定和可靠。
3. 应用领域串口通信作为一种传统的数据传输方式,在很多领域都有着广泛的应用。
工业自动化领域中的设备监控、通信设备之间的数据传输、嵌入式系统中的传感器数据采集等都离不开串口通信。
在一些老旧设备的维护和调试过程中,也经常需要使用串口通信来进行数据传输和通信。
4. 我的观点和理解在我看来,串口参数的设置是串口通信中至关重要的一环。
合理的串口参数设置能够保证数据的准确传输,提高通信的稳定性和效率。
而对于不同的应用场景和串口设备,需要根据具体需求来灵活设置串口参数,以满足通信的要求。
随着现代通信技术的发展,串口通信虽然显得有些陈旧,但在某些特定领域仍然具有不可替代的地位和价值。
总结回顾:通过本文的深入探讨,我们了解了串口参数的定义、作用和设置方法,以及它在实际应用中的广泛领域。
我也共享了个人对这一主题的观点和理解。
在未来的实际操作中,我们需要根据具体需求和设备要求,合理设置串口参数,以确保串口通信的稳定和可靠。
Android 串行接口(serial port)编程
Android 串行接口(serial port)编程本例子来自实际的出租车项目,背景:客户下载Android/iOS客户端订车系统,出租车司机的Driver系统接受订单后,驾驶至目的地,客户上车,计价器off/on,客户下车。
Android程序需要读取计价器的off/on状态,进行后继处理。
解决方案:利用开源的android-serialport-api项目(/p/android-serialport-api/),重新连接usb线到Adapter(USB to RS232 adapters,参考/p/android-serialport-api/wiki/android_to_rs232_guideline?tm=6。
),连接后如下图: n nn n 编码: android-serialport-api项目包装了串行接口的通讯,因此我们不需要关心jni的调用等一系列的过程。
自带的sample实例,演示了怎样读取串行口的信号码,代码也比较简单,稍微修改拿过来使用即可。
直接上代码SerialApplication.java [java]n package com.whyonly.serial; n nn nn nn importjava.io.File; n import java.io.IOException; n import java.security.InvalidParameterException; n nn nn import android.app.Application; n import android.content.SharedPreferences; n import android.location.Location; n import android.preference.PreferenceManager; n importandroid.util.Log; n import android_serialport_api.SerialPort; n importandroid_serialport_api.SerialPortFinder; n nn public class SerialApplication extends Application { n n n private static final String TAG = "SerialApplication"; n n n private SharedPreferences mPrefs; n nn nn n n @Override n n n public void onCreate(){ n n n n n Log.d(TAG,"load...."); n n n n n super.onCreate(); n n n n n //will save the values to Preference later. n n n n n mPrefs = PreferenceManager.getDefaultSharedPreferences(this); n n n } n n n nn n n nn n n nn n n public SharedPreferences getmPrefs() { n n n n n return mPrefs; n n n } n nn nn nn n n public String getUserId() { n n n n n // TODO Auto-generated method stub n n n n n return null; n n n } n n n nn n n nn n n //for serial port n n n public SerialPortFinder mSerialPortFinder = new SerialPortFinder(); n n n private SerialPort mSerialPort = null; n nn n n public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException { n n n n n if (mSerialPort == null) { n n n n n n n /* Read serial port parameters */ n n n n n nn //SharedPreferences sp = getSharedPreferences("android_serialport_api.sample_preferences", MODE_PRIVATE); n n n n n n n SharedPreferences sp = ((SerialApplication)this.getApplicationContext()).getmPrefs(); n n n n n n n String path = sp.getString("DEVICE", ""); n n n n n n n int baudrate = Integer.decode(sp.getString("BAUDRATE", "-1")); n nn n n n n n n /* Check parameters */ n n n n n n n if ( (path.length() == 0) || (baudrate == -1)) { n n n n n n n n n throw new InvalidParameterException(); n n n n n n n } n nn n n n n n n /* Open theserial port */ n n n n n n n mSerialPort = new SerialPort(new File(path), baudrate, 0); n n n n n } n n n n n return mSerialPort; n n n } n nn n n public void closeSerialPort() { n n n n n if (mSerialPort != null) { n n n n n n n mSerialPort.close(); n n n n n n n mSerialPort = null; n n n n n } n n n } n nn nn nn n n nn } n n MainActivity.java n [java] n package com.whyonly.serial; n nn nn import android.os.Bundle; n import android.app.Activity; n import android.util.Log; n import android.view.Menu; n nn public class MainActivity extends Activity { n nn n n private static final String TAG = "MainActivity"; n n n nn n n private USBSerialHelper usbSerialHelper; n nn n n @Override n n n protected void onCreate(Bundle savedInstanceState) { n n n n nsuper.onCreate(savedInstanceState); n n n n n setContentView(yout.activity_main); n n n n n usbSerialHelper = new USBSerialHelper(MainActivity.this); n n n } n nn n n @Override n n n public boolean onCreateOptionsMenu(Menu menu) { n n n n n // Inflate the menu; this adds items to the action bar if it is present. n n n n n getMenuInflater().inflate(R.menu.main, menu); n n n n n return true; n n n } n nn n n public void flag(int onoff) { n n n n n //the message returned from serial port, do anything you want. n n n n n Log.d(TAG,"onoff:"+onoff); n n n n n nn n n } n n n nn n n @Override n n n protected void onDestroy() { n n n n n super.onDestroy(); n n n n n Log.d (TAG,"onDestroy()"); n n n n n stopUSBSerial(); n n n } n n n nn n n private void stopUSBSerial() { n n n n n if(usbSerialHelper != null){ n n n n n n n usbSerialHelper.onDestroy(); n n n n n } n n n n n nn n n } n nn } n n USBSerialHelper.java n [java] n package com.whyonly.serial; n nn import java.io.IOException; n import java.io.InputStream; n import java.io.OutputStream; n import java.security.InvalidParameterException; n nn nn import android_serialport_api.SerialPort; n nn nn nn nn public class USBSerialHelper { n n n nn n n private MainActivity activity; n n n protected SerialApplication mApplication; n n n protected SerialPort mSerialPort; n n n protected OutputStream mOutputStream; n n n private InputStream mInputStream; n n n private ReadThread mReadThread; n n n nn n n public USBSerialHelper(final MainActivity mActivity){ n n n n nthis.activity = mActivity; n n n n n mApplication = (SerialApplication) mActivity.getApplication (); n n n n n Preferences.saveUSBSetting(mActivity); n n n n n start(); n n n } n n n nn n n public void start(){ n n n n n try { n n n n n n n mSerialPort = mApplication.getSerialPort(); n n n n n n n mOutputStream = mSerialPort.getOutputStream(); n n n n n n n mInputStream = mSerialPort.getInputStream(); n nn n n n n n n /* Create a receiving thread */ n n n n n n n mReadThread = new ReadThread(); n n n n n n n mReadThread.start(); n n n n n } catch (SecurityException e) { n n n n n n n DisplayError(R.string.error_security); n n n n n } catch (IOException e) { n n n n n n n DisplayError(R.string.error_unknown); n n n n n } catch (InvalidParameterException e) { n n n n n n n DisplayError(R.string.error_configuration); n n n n n } n n n } n n n nn n n private void DisplayError(int resourceId) { n n n n nDialogUtil.showWarningDialog(activity, resourceId); n n n } n n n nn n n private String lastStatus = "";//1:flag off;2:flag on;0 power off n nn n n private void onDataReceived(final byte[] buffer, final int size) { n n n n n activity.runOnUiThread(new Runnable() { n n n n n n n public void run() { n n n n n n n n n //receive serial number from usb serial device. n n n n n n n n n String signal = new String(buffer, 0, size); n n n n n n n n n if(signal.length()>0){ n n n n n n n n n n n String status = signal.substring(0,1); n n n n n n n n n n n if(!status.equals ("0") && !lastStatus.equals(status)){ n n n n n n n n n n n n n lastStatus = status; n n n n n n n n n n n n n if(status.equals("1")){//flag on status n n n n n n n n n n n n n n n activity.flag (1); n n n n n n n n n n n n n }else if(status.equals("2")){//flag off status n n n n n n n n n n n n n n n activity.flag(0); n n n n n n n n n n n n n } n n n n n n n n n n n } n n n n n n n n n } n n n n n n n } n n n n n }); n n n } n n n nn n n public void onDestroy() { n n n n n if (mReadThread != null) n n n n n n n mReadThread.interrupt(); n n n n nmApplication.closeSerialPort(); n n n n n mSerialPort = null; n n n } n n n nn n n private class ReadThread extends Thread { n nn n n n n @Override n n n n n public void run() { n n n n n n n super.run(); n n n n n n n while(!isInterrupted()) { n n n n n n n n n int size; n n n n n n n n n try { n n n n n n n n n n n byte[] buffer = new byte[64]; n n n n n n n n n n n if (mInputStream == null) return; n n n n n n n n n n n size = mInputStream.read(buffer); n n n n n n n n n n n if (size > 0) { n n n n n n n n n n n n n onDataReceived(buffer, size); n n n n n n n n n n n } n n n n n n n n n } catch (IOException e) { n n n n n n n n n n n e.printStackTrace(); n n n n n n n n n n n return; n n n n n n n n n } n n n n n n n } n n n n n } n n n } n } n n Preferences.java n [java]n package com.whyonly.serial; n nn import android.content.Context; n import android.content.SharedPreferences; n import android.content.SharedPreferences.Editor; n nn public class Preferences { n n n public static void saveUSBSetting(Context activity){ n n n n n SharedPreferences pref = getAppPrefs(activity); n n n n n Editor editor = pref.edit(); n n n n n editor.putString("DEVICE", "/dev/ttyUSB0"); n n n n n editor.putString("BAUDRATE", "9600"); n n n n n mit(); n n n n n } nn n n nn n n public static SharedPreferences getAppPrefs (Context context) { n n n n n return ((SerialApplication)context.getApplicationContext()).getmPrefs(); n n n } n } n n DialogUtil.java [java] n package com.whyonly.serial; n nn nn nn import android.app.AlertDialog; n import android.content.Context; n importandroid.content.DialogInterface; n nn public class DialogUtil { n n n nn n n public static void showWarningDialog(Context context,int messageid){ n n n n n showWarningDialog(context,context.getResources().getString(messageid)); n n n } n n n nn n n public static void showWarningDialog(Context context,String message){ n n n n n String warningTitle =context.getResources().getString(R.string.defaultWarningTitle); n n n n n String warningButtonName = context.getResources().getString(R.string.defaultWarningButton); n n n n n showWarningDialog(context,warningTitle,message,warningButtonName); n n n } n n n nn n n private static void showWarningDialog(Context context,String title,String message,String positive){ n n n n n final AlertDialog.Builder builder = new AlertDialog.Builder(context); n n n n nbuilder.setTitle(title).setMessage(message); n n n n n builder.setPositiveButton(positive, new DialogInterface.OnClickListener() { n n n n n n n n public void onClick(DialogInterface dialog, int which) { n n n n n n n n n dialog.dismiss(); n n n n n n n n } n nn n n n n n n}); n n n n n builder.create().show(); n n n } n nn } n n strings.xml [html] n <?xml version="1.0"encoding="utf-8"?> n <resources> n nn n n <string name="app_name">serial</string> n n n <string name="action_settings">Settings</string> n n n <string name="hello_world">Hello world!</string> n n n <string name="defaultWarningTitle">Taxi Driver</string> n n n <stringname="defaultWarningButton">Yes</string> n n n <string name="error_configuration">Please configure your serial port first.</string> n n n <string name="error_security">You do not have read/write permission to the serial n n n n n port.</string> n n n <stringname="error_unknown">The serial port can not be opened for an unknown n n n n n reason.</string> n nn </resources> n n。
串口编程(SerialPort类)
串⼝编程(SerialPort类)近期由于项⽬中⽤到串⼝编程,⽽以前有从未使⽤过,查阅相关资料,先将串⼝编程整个过程整理如下,以备不时之需。
SerialPort类简述此类位于System.IO.Ports命名空间下。
⽤于控制串⾏端⼝⽂件资源,此类提供同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串⾏驱动程序的访问。
SerialPort类⽀持⼀下编码:ASCIIEncoding、UTF8Encoding、UnicodeEncoding、UTF32Encoding以及mscorlib.dll中定义的代码页⼩于50000或者为54936的所有编码。
(摘⾃MSDN,)SerialPort常⽤属性BaudRate 获取或设置串⾏波特率BreakState 获取或设置中断信号状态BytesToRead 获取接收缓冲区中数据的字节数BytesToWrite 获取发送缓冲区中数据的⾃⼰数DataBits 获取或设置每个字节的标准数据位长度(默认为8)DtrEnable 获取或设置⼀个值,该值指⽰Null字节在端⼝和接收缓冲区之间传输时是否被忽略Encoding 获取或设置传输前后的⽂本转换的字节编码IsOpen 获取⼀个值,该值指⽰SerialPort对象的打开或关闭状态NewLine 获取或设置⽤于解释ReadLine和WriteLine⽅法调⽤结束的值Parity 获取或设置奇偶校验检查协议PortName 获取或设置通信端⼝,包括但不限于所有可⽤的COM端⼝ReadBufferSize 获取或设置SerialPort输⼊缓冲区的⼤⼩ReadTimeOut 获取或设置读取操作未完成时发⽣超时之前的毫秒数ReceivedBytesThreshold 获取或设置DataReceived事件发⽣前内部输⼊缓冲区中的字节数RtsEnable 获取或设置⼀个值,该值指⽰在串⾏通信中是否启⽤请求发送RTS信号StopBits 获取或设置每个字节的标准停⽌位数WriteBufferSize 获取或设置串⾏端⼝输出缓冲区的⼤⼩WriteTimeout 获取或设置写⼊操作未完成时发⽣超时之前的毫秒数SerialPort的主要⽅法Close 关闭端⼝连接,将IsOpen属性设置成为false,并释放内部Stream对象Dispose 释放SerialPort对象使⽤的⾮托管资源GetPortNames 获取当前计算机的串⾏端⼝名称数组Open 打开⼀个新的串⾏端⼝连接Read 从SerialPort输⼊缓冲区中读取ReadByte 从SerialPort输⼊缓冲区中同步读取⼀个字节ReadChar 从SerialPort输⼊缓冲区中同步读取⼀个字符ReadExisting 在编码的基础上,读取SerialPort对象的流和输⼊缓冲区中所有⽴即可⽤的字节ReadLine ⼀直读取到输⼊缓冲区中的NewLine值ReadTo ⼀直读取到输⼊缓冲区中指定value的字符串Write 将数据写⼊到串⾏端⼝输出缓冲区WriteLine 将指定的字符串和NewLine值写⼊到输出缓冲区DataReceived 表⽰将处理SerialPort对象的数据接收事件的⽅法ErrorReceived 表⽰处理Serialport对象的错误事件的⽅法SerialPort类编程实例讲解ing System;ing System.Collections.Generic;ing ponentModel;ing System.Data;ing System.Drawing;ing System.Linq;ing System.Text;ing System.Windows.Forms;ing System.IO.Ports;ing System.Text.RegularExpressions;space SerialportSample12.{13. public partial class SerialportSampleForm : Form14. {15. private SerialPort comm = new SerialPort();16. private StringBuilder builder = new StringBuilder();//避免在事件处理⽅法中反复的创建,定义到外⾯。
串口通信知识点详解
串⼝通信知识点详解串⼝通信的基本概念:1.在计算机上进⾏数据的通信有两种⽅式。
串⾏⽅式和并⾏⽅式。
也就是串⼝通信和并⾏通信。
即串⼝通信是计算机传输数据的⼀种通信⽅式。
2.并⾏通信以字节为但是进⾏传输数据,相⽐于串⼝通信,他的速度快,传输距离近。
串⼝通信以⽐特位传输数据,相⽐于并⾏通信,他的传输速度慢,但是传输距离远。
并且串⼝通信是异步通信,因此,端⼝可以在⼀根线上发送数据的同时在另⼀根线上接收数据3.串⼝通信最重要的参数是波特率、数据位、停⽌位和奇偶校验。
对于两个进⾏通信的端⼝,这些参数必须匹配。
(1)波特率:传输速率。
如每秒钟传送240个字符,⽽每个字符格式包含10位(1个起始位,1个停⽌位,8个数据位),这时的波特率为240Bd,⽐特率为10位*240个/秒=2400bps。
(2)数据位:数据包中发送端想要发送的数据(3)停⽌位:⽤于表⽰单个包的最后⼀位,结束标志以及校正时钟同步(4)奇偶校验:检错⽅式。
⼀共有四种检错⽅式:偶、奇、⾼和低。
4.串⼝通信的应⽤场景:串⼝通信是指外设和计算机间,通过数据线按位进⾏传输数据的⼀种通讯⽅式。
这种通信⽅式使⽤的数据线少,在远距离通信中可以节约通信成本,但其传输速度⽐并⾏传输低。
⼤多数计算机(不包括笔记本)都包含两个RS-232串⼝。
串⼝通信也是仪表仪器设备常⽤的通信协议。
Windows下串⼝通信:1.在windows下,串⼝是作为⽂件进⾏处理。
2.串⼝通信分为四⼤步骤:打开串⼝,关闭串⼝,配置串⼝,读写串⼝(1)打开串⼝:使⽤CreateFile函数:HANDLE WINAPI CreateFile(_In_ LPCTSTR lpFileName,//要打开或创建的⽂件名_In_ DWORD dwDesiredAccess,//访问类型_In_ DWORD dwShareMode,//共享⽅式_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全属性_In_ DWORD dwCreationDisposition,//指定要打开的⽂件已存在或不存在的动作_In_ DWORD dwFlagsAndAttributes,//⽂件属性和标志_In_opt_ HANDLE hTemplateFile//⼀个指向模板⽂件的句柄);参数说明:1).lpFileName:要打开或创建的⽂件名2).dwDesiredAccess:访问类型。
serialport串口收发原理与实现
serialport串口收发原理与实现一、概述SerialPort是C#中用于串行通信的一种常见方式,它允许应用程序与硬件设备进行交互。
串行通信是一种通过串行数据线传输数据的方式,常见于计算机与外部设备的通信,如打印机、扫描仪和传感器等。
本篇文章将详细介绍SerialPort串口收发原理与实现。
二、串口通信基础串行通信是一种按位传输的方式,数据按位(一个字节)逐个传输,每一位数据占据一个时间槽,这种方式使得数据传输速率相对较低,但具有简单、成本低、易实现的优点。
在串行通信中,数据传输方向通常分为单工、半双工和全双工。
单工通信只能单向传输数据,半双工通信则允许数据在两个方向上传输,但同一时刻只允许一个方向上的数据传输。
全双工通信则允许数据在两个方向上同时传输,但需要使用两根数据线。
三、SerialPort类介绍SerialPort类是System.IO.Ports命名空间下的一个重要组成部分,它提供了串行通信的功能。
SerialPort类的主要属性包括端口号、波特率、数据位、停止位、奇偶校验等。
通过这些属性,我们可以配置串口以适应不同的通信需求。
四、SerialPort使用示例下面是一个简单的SerialPort使用示例:```csharpusing System.IO.Ports;// 创建一个新的SerialPort对象SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);// 打开串口serialPort.Open();// 发送数据serialPort.Write("Hello, world!");// 接收数据string receivedData = serialPort.ReadLine();// 关闭串口serialPort.Close();```这个示例展示了如何打开一个串口,发送一条消息,接收一条消息,然后关闭串口。
C#串口通信SerialPort类
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#和232串口通信方法(SerialPort控件)
本例程主要讲解使用C# ,实现与232 串口通信。
达到采集串口数据,监控,可视化处理等。
一.概述在Visual Studio 6.0 中编写串口通讯程序,一般都使用Microsoft Communication Control (简称MSComm )的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
但在 技术广泛应用的今天,Visual 没有将此控件加入控件库,所以人们采用了许多方法在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 System.IO.Ports 。
2.串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式( 波特率、数据位、停止位和校验位) ,在MSComm 中相关的属性是CommPort 和Settings SerialPort 类与MSComm 有一些区别:a. 通讯端口号[PortName] 属性获取或设置通信端口,包括但不限于所有可用的COM 端口,请注意该属性返回类型为String ,不是mPort 的short 类型。
串口serial
串⼝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 控件。
C# SerialPort通信详细介绍
C# SerialPort通信(转)(现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越普遍。
例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据传输到另一台计算机上,那么利用串口通信就可以实现。
运行本程序,在“发送数据”文本框中输入要传送的数据,单击【发送】按钮,将传送的数据发送到所选择的端口号中;单击【接收】按钮,传递的数据被接收到“接收数据”文本框中。
如图13.1所示。
技术要点在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等。
下面主要介绍该类的主要属性(表13.1)和方法(表13.2)。
表13.1 SerialPort类的常用属性续表表13.2 SerialPort类的常用方法注意:用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。
串口截面图如图13.2所示。
图13.2 串口截面图实现过程(1)新建一个项目,命名为Ex13_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e){serialPort1.PortName = "COM1";serialPort1.BaudRate = 9600;serialPort1.Open();byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);string str = Convert.ToBase64String(data);serialPort1.WriteLine(str);MessageBox.Show("数据发送成功!","系统提示");}private void button2_Click(object sender, EventArgs e){byte[] data = Convert.FromBase64String(serialPort1.ReadLine());textBox2.Text = Encoding.Unicode.GetString(data);serialPort1.Close();MessageBox.Show("数据接收成功!","系统提示");}举一反三根据本实例,读者可以实现以下功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(SerialPort)串口编程知识整理一、(SerialPort)串口编程知识整理:(一)基本概念和项目实践概述二、(SerialPort)串口编程知识整理:(二)串口编程中经常用到的进制转换和其他公共方法三、(SerialPort)串口编程知识整理:(三)串口编程的系统设计实用经验总结四、(SerialPort)串口编程知识整理:(四)多串口系统的分布式架构设计五、SerialPort常用属性、方法和事件(SerialPort)串口编程知识整理:(一)基本概念和项目实践概述1.基本概念MS在.NET FrameWork2.0中对串口通讯进行了封装,我们可以在.net2.0及以上版本开发时直接使用SerialPort 类对串口进行读写操作。
SerialPort类的属性主要包括:串口名称(PortName)波特率(BaudRate)数据位DataBits停止位StopBits奇偶校验Parity握手协议HandshakeSerialPort类的事件主要包括:DataReceived:用于异步接收串口数据SerialPort类的方法主要包括:Open();Close();Read();Write()等。
相关内容可以参考MSDN或者博文/tony-yang/archive/2009/06/03/learnserialport.html/hocylan/archive/2008/03/13/1103624.html2、需求和场景介绍本文是基于之前开发的一个油站项目,主要功能是实现对加油机数据的采集和对加油机的一些控制,例如停开机、设置单价、定量定额加油等操作。
系统通过PC机串口,与下位机进行通讯,下位机和加油机进行通讯,负责采集加油机数据和控制加油机的操作。
3、设计思想(1)在界面设计上,由于系统启动后要始终实时监控加油数据,采用了SDI展示方式。
截图如下:(2)在系统设计方面,加油机监控软件具有一定的实时性、稳定性和数据并发的非功能性需求。
所以在对加油数据采集时,使用事件DataReceived,用于异步接收串口数据。
使用watchdog方式监控系统消息,通过缓存池对数据进行过滤,减轻数据库的压力,提高系统性能。
4、代码演示系统采用CS结构,使用SerialPort类进行串口通讯。
对SerialPort类进行了封装,以保证多个窗体间对串口实例的调用。
封装的串口通讯类参考:/yefanqiu/archive/2007/03/27/1543187.aspx串口通讯类:SerialPortDao.cs/*----------------------------------------------------------------// Copyright (C) 北京****科技有限公司// 版权所有。
//// 文件功能描述:封装串口组件,实现对串口的统一访问和操作////// 创建标识:** 2009-5-23//// 修改标识:**// 修改描述://----------------------------------------------------------------*/using System;using System.Collections.Generic;using System.Text;using System.IO.Ports;namespace LY.FuelStationPOS.Protocol{///<summary>///提供对串口的统一访问///</summary>public sealed class SerialPortDao{#region事件和字段定义public event PortDataReceivedEventHandle Received;public SerialPort serialPort = null;public bool ReceiveEventFlag = false; //接收事件是否有效 false表示有效private static readonly SerialPortDao instance = new SerialPortDao();#endregion#region属性定义private string protName;public string PortName{get { return serialPort.PortName; }set{serialPort.PortName = value;protName = value;}}#endregion#region构造函数private SerialPortDao(){LoadSerialPort();}private void LoadSerialPort()serialPort = new SerialPort();serialPort.BaudRate = 9600;serialPort.Parity = Parity.Even;serialPort.DataBits = 8;serialPort.StopBits = StopBits.One;serialPort.Handshake = Handshake.None;serialPort.RtsEnable = true;serialPort.ReadTimeout = 2000;serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived); }#endregion#region串口操作集合///<summary>///返回串口对象的单个实例///</summary>///<returns></returns>public static SerialPortDao GetSerialPortDao(){return instance;}///<summary>///释放串口资源///</summary>~SerialPortDao(){Close();}///<summary>///打开串口///</summary>public void Open(){try{if (!serialPort.IsOpen){serialPort.Open();}}catch (Exception ex){throw ex;}}///<summary>///关闭串口///</summary>public void Close(){if (serialPort.IsOpen){serialPort.Close();}}///<summary>///串口是否打开///</summary>///<returns></returns>public bool IsOpen(){return serialPort.IsOpen;}///<summary>///数据发送///</summary>///<param name="data">要发送的数据字节</param>public void SendData(byte[] data){try{serialPort.DiscardInBuffer();serialPort.Write(data, 0, data.Length);}catch (Exception ex){throw ex;}}///<summary>///发送命令///</summary>///<param name="SendData">发送数据</param>///<param name="ReceiveData">接收数据</param>///<param name="Overtime">超时时间</param>///<returns></returns>public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime) {if (serialPort.IsOpen)try{ReceiveEventFlag = true; //关闭接收事件serialPort.DiscardInBuffer(); //清空接收缓冲区serialPort.Write(SendData, 0, SendData.Length);System.Threading.Thread.Sleep(50);int num = 0, ret = 0;while (num++ < Overtime){if (serialPort.BytesToRead >= ReceiveData.Length){break;}System.Threading.Thread.Sleep(50);}if (serialPort.BytesToRead >= ReceiveData.Length){ret = serialPort.Read(ReceiveData, 0, ReceiveData.Length);}else{ret = serialPort.Read(ReceiveData, 0, serialPort.BytesToRead); }ReceiveEventFlag = false; //打开事件return ret;}catch (Exception ex){ReceiveEventFlag = false;throw ex;}}return -1;}///<summary>///数据发送///</summary>///<param name="data">要发送的数据字符串</param>public void SendData(string data){//禁止接收事件时直接退出if (ReceiveEventFlag){return;}if (serialPort.IsOpen){serialPort.Write(data);}///<summary>///将指定数量的字节写入输出缓冲区中的指定偏移量处。