异步重叠操作之串口

异步重叠操作之串口
异步重叠操作之串口

异步重叠操作之串口

在工控行业,目前总线型通信依然占据半壁江山。常用的如485,CAN等。而面对小型系统时,尤其监控区域遍布在两公里范围内时,通过485-232或者CAN-232转换模块,使用上位机的串口与下属硬件通信组成系统便成了相对节约的一种设计方案。

本文的重点在于讲解异步重叠操作串口的思想以及过程。

所有的IO设备的操作都遵循:创建、读写、关闭三个步骤。

第一步:设计类的成员,其中成员此处不详细讲解,之后方法中用到时再谈

View Code

第二步:创建串口通道,在WINDOWS下,一切都表现得那么像文件操作

m_hPort = CreateFile((LPCWSTR)Device, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

其中CreateFile为API函数,其细节如下:

// 作用: CreateFile函数可用来打开或创建文件和端口,它返回该设备的句柄

// 原型:

// HANDLE CreateFile(

// LPCTSTR lpFileName, // 指向文件名的指针

// DWORD dwDesiredAccess, // 访问模式

(GENERIC_WRITE/GENERIC_READ)。0表示仅允许获得与一个设备有关的信息

// DWORD dwShareMode, // 共享模式

(FILE_SHARE_READ/FILE_SHARE_WRITE)。0表述独占

// LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指

// DWORD dwCreationDisposition, // 创建属

性 CREATE_NEW 创建如果已经存在则冲突

// CREATE_ALWAYS 总是创建,存在则改写

// OPEN_EXISTING 打开现有,由设备提出要求

// OPEN_ALWAYS 打开,不存在则创建

// TRUNCATE_EXISTING 将现有文件缩短为0长度

// DWORD dwFlagsAndAttributes, // 文件属

性 FILE_ATTRIBUTE_ARCHIVE 标记归档属性

// FILE_ATTRIBUTE_COMPRES SED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式

// FILE_ATTRIBUTE_NORMA L 默认属性

// FILE_ATTRIBUTE_HIDDE N 隐藏文件或目录

// FILE_ATTRIBUTE_READO NLY 文件为只读

// FILE_ATTRIBUTE_SYSTE M 文件为系统文件

// FILE_FLAG_WRITE_THRO UGH 操作系统不得推迟对文件的写操作

// FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作

// FILE_FLAG_NO_BUFFERIN G 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块

// FILE_FLAG_RANDOM_AC CESS 针对随机访问对文件缓冲进行优化

// FILE_FLAG_SEQUENTIAL_ SCAN 针对连续访问对文件缓冲进行优化

// FILE_FLAG_DELETE_ON_ CLOSE 关闭了上一次打开的句柄后,将文件删除

// HANDLE hTemplateFile // 用于复制文件句柄,文件模板。如果不为零,则新文件将从这个文件中复制扩展属性

// );

// 返回:

// HANDLE 句柄 INVALID_HANDLE_VALUE 表示出错

此处因为使用异步重叠,所以dwFlagsAndAttributes赋值为

FILE_FLAG_OVERLAPPED。其中Device为设备名称,串口的话直接就是串口号

CHAR Device[80];

sprintf(Device, "COM%d", Port);

第三步:设置串口相关参数:

GetCommState(m_hPort, &dcb); // 读取当前端口的DCB设置

dcb.BaudRate = CBR_9600;

dcb.ByteSize = SERIALPORT_DATABITS_EIGHT; // 库中的选择结

果是5-8,表示5-8位长

dcb.Parity = NOPARITY;

dcb.StopBits = ONESTOPBIT; // 该参数如果开放,则设置不成功

SetCommState(m_hPort, &dcb); // 设置当前端口的DCB设置

//typedef struct _COMMTIMEOUTS {

// DWORD ReadIntervalTimeout; // 读间隔超时

// DWORD ReadTotalTimeoutMultiplier; // 读时间系数

// DWORD ReadTotalTimeoutConstant; // 读时间常量

// DWORD WriteTotalTimeoutMultiplier; // 写时间系数

// DWORD WriteTotalTimeoutConstant; // 写时间常量

// } COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS comTimeouts;

GetCommTimeouts(m_hPort, &comTimeouts);

comTimeouts.ReadIntervalTimeout = MAXDWORD;

comTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD; comTimeouts.ReadTotalTimeoutConstant = SERIALPORT_READ_TIMEOUT; comTimeouts.WriteTotalTimeoutMultiplier = MAXDWORD;

comTimeouts.WriteTotalTimeoutConstant = SERIALPORT_WRITE_TIMEOUT;

// 指定一组事件监控通信设备

// 原

型 BOOL WINAPI SetCommMask(__in HANDLE hFile, __in DWORD dwEvtMas k);

// 参数:

// __in HANDLE hFile 通信设备句柄

// __in DWORD dwEvtMask 可以触发的事件

// EV_BREAK 输入中断

// EV_CTS CTS清除发送信号改变

C++ 串口API 异步操作

C++ 串口API 异步操作50 有谁能说下串口API异步操作的例子,最好有代码的。 如果是BCB的更好,谢谢啦,有些函数直接看的不是很懂。一,我要同时向20个端口发送数据,句柄怎样才能控制好二,如果采用异步操作,怎样操作才最好,需要代码支持谢谢啦初始化: //串行设备句柄; HANDLE hComDev=0; //串口打开标志; BOOL bOpen=FALSE; //线程同步事件句柄; HANDLE hEvent=0; DCB dcb; COMMTIMEOUTS timeouts; //设备已打开 if(bOpen) return FALSE; //打开COM1

if((hComDev=CreateFile(“COM1”,GENERIC?READ|GENERIC?WRITE,0,N ULL,OPEN?EXISTING,FILE?ATTRIBUTE?NORMAL,NULL))==INVALID?HAN DLE?VALUE) return FALSE; //设置超时控制 SetCommTimeouts(hComDev,&timeouts); //设置接收缓冲区和输出缓冲区的大小 SetupComm(hComDev,1024,512); //获取缺省的DCB结构的值 GetCommState(hComDev,&dcb); //设定波特率为9600 bps dcb.BaudRate=CBR?9600; //设定无奇偶校验 dcb.fParity=NOPARITY; //设定数据位为8 dcb.ByteSize=8;

//设定一个停止位 dcb.StopBits=ONESTOPBIT; //监视串口的错误和接收到字符两种事件SetCommMask(hComDev,EV?ERR|EV?RXCHAR); //设置串行设备控制参数 SetCommState(hComDev,&dcb); //设备已打开 bOpen=TRUE; //创建人工重设、未发信号的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”);

UART异步串口

MSP430程序库<二>UART异步串口 串行通信接口是处理器与其他设备进行数据通信最常用的方式之一。我的这个程序库是针对MSP430f14系列和MSP430f16系列的,我常用的单片机是这两款:msp430f149,ms p430f169。这两款单片机中均有两个增强型串行通信接口,都可以进行同步或是异步通信,甚至169的模块USART0还能进行进行I2C协议通信。在这里,我们只讨论异步串行通信。 硬件介绍: MSP单片机的USART模块可以配置成SPI(同步通信)模式或UART(异步通信)模式,这里只讨论UART方式。UART数据传输格式如下: 起始位,数据位由高到低7/8位,地址位0/1位,奇偶校验位奇偶或无,停止位1/2位。数据位位数、地址位、奇偶校验位、停止位均可由单片机内部寄存器控制;这两款单片机都有两个USART模块,有两套独立的寄存器组;以下寄存器命中出现x代表0或是1,0代表对应0模块的寄存器,1代表对应1模块的寄存器;其中,与串口模式设置相关的控制位都位于UxCTL寄存器,与接收相关的控制位都位于UxRCTL寄存器,与发送相关的控制位都位于UxTCTL寄存器;波特率设置用UxBR0、UxBR1、UxMCT L三个寄存器;接收与发送有独立的缓存UxRXBUF、UxTXBUF,并具有独立的移位寄存器和独立的中断;中断允许控制位位于IE1/2寄存器,中断标志位位于IFG1/2寄存器。 波特率设置:430的波特率设置用三个寄存器实现, UxBR0:波特率发生器分频系数低8位。 UxBR1:波特率发生器分频系数高8位。 UxMCTL:波特率发生器分频系数的小数部分实现。 设置波特率时,首先要选择合适的时钟源:USART模块可以设置的时钟源有UCLK引脚、ACLK、SMCLK;对于较低的波特率(9600以下),可选ACLK作为时钟源,这样,在LPM3(低功耗3)模式下,串口仍能正常发送接收数据;另外,由于串口接收过程有一个三取二判决逻辑,这至少需要三个时钟周期,因此分频系数必须大于3;波特率高于9600时,将不能使用ACLK作为时钟源,要调为频率较高的SMCLK作为时钟源;另外还可以外部输入UCLK时钟。分频系数计算公式如下:

Win32API 异步串口通讯

使用Win32API实现Windows下异步串口通讯 目录: 1.异步非阻塞串口通讯的优点 2.异步非阻塞串口通讯的基本原理 3.异步非阻塞串口通讯的基础知识 4.异步非阻塞串口通讯的实现步骤 一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。 例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。 二,异步非阻塞串口通讯的基本原理 首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口; 其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始超时设置; 然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。 三,异步非阻塞串口通讯的基础知识 下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序中将会使用到的几个关键函数 CreateFile() 功能:打开串口设备 函数原型 HANDLE CreateFile( LPCTSTR lpFileName, // 串口名称字符串;如:"COM1" 或"COM2" DWORD dwDesiredAccess, // 设置读写属性(访问模式);一般为GENERIC_READ|GENERIC_WRITE, DWORD dwShareMode, // 共享模式;"必须"为0, 即不能共享 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为NULL DWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值;在这里"必须"为OPEN_EXISTING DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成FILE_FLAG_OVERLAPPED ,实现异步I/O HANDLE hTemplateFile // 临时文件的句柄,通常为NULL ); 说明: 如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。Forexample: Handle m_hComm = CreateFile(com1,GENERIC_READ||GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERL APPED,0);

实现异步串口

异步传输是一种典型的基于字节的输入输出,指数据按每次一个字节进行传输,其传输速度低。同步传输是把数据字节组合起来一起发送,这种组合称之为帧,其传输速度比异步传输快,同步串口的传送速率高,异步串口实现简单,这是异步串口与同步串口间最主要的区别。 一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行。 在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。 在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。 例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。"重叠"一词的含义就在于此。 二,异步非阻塞串口通讯的基本原理 首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口; 其次,为了保护系统对串口的初始设置,调用 GetCommTimeouts()得到串口的原始超时设置; 然后,初始化DCB对象,调用SetCommState() 设置DCB,调用SetCommTimeouts()设置串口超时控制; 再次,调用SetupComm()设置串口接收发送数据的缓冲区大小,串口的设置就基本完成,之后就可以启动读写线程了。 三,异步非阻塞串口通讯的基础知识 VC串口通信技术网下面来介绍并举例说明一下编写异步非阻塞串口通讯的程序 中将会使用到的几个关键函数 CreateFile() 功能:打开串口设备 函数原型 1.HANDLE CreateFile( 2.LPCTSTR lpFileName, // 串口名称字符串;如: "COM1" 或 "COM2" 3.DWORD dwDesiredAccess, // 设置读写属性(访问模式);一般为 GENERIC_READ|GENERIC_WRITE, 4.DWORD dwShareMode, // 共享模式;"必须"为 0, 即不能共享 5.LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性;一般为 NULL 6.DWORD dwCreationDistribution, // 创建方式,串口设置必须设置此值; 在这里"必须"为 OPEN_EXISTING 7.DWORD dwFlagsAndAttributes, // 文件属性和标志;在这里我们设置成 FILE_FLAG_OVERLAPPED ,实现异步I/O 8.HANDLE hTemplateFile // 临时文件的句柄,通常为NULL

异步串行通信的工作方式

异步串行通信的工作方式,然后给出了VB MSComm控件下异步串行通信在电子衡器中的应用实例,包括硬件接口及软件设计。关键词:RS-232 异步串行通信Visual Basic 电子衡器控件计算机一般提供了2个25针或9针的RS-232标准串行口,简称为COM1和COM2。在某些应用中,我们还可以通过插通信卡来获得额外的RS-232标准串行口。利用这些串行口可以与其它数字设备进行一般的数据通信,计算机的串行接口主要用于远程通信和低速输入输出设备。由于串行数据通信传输线条数最少,而且有许多较便宜的专用芯片可实现它,发送和接受器也简单,因而对数据传输速度要求不高的计算机和数字设备间的近程通信,多采用串行通信实现。而目前各个厂家生产的电子衡器的称重仪表多配有与上位机通信的RS—232C串行接口,因而计算机与称重仪表之间的数据通信用串口很容易实现,只需要制作一条2芯或3芯的数据线编写相应的接口程序即可实现,不需要增加其他硬件设备。采用这种方式组成的微机电子衡器有许多优点:称重仪表经过多年的发展,在数据采集、抗干扰、可靠性等方面技术成熟,质量稳定;而计算机在存储容量、数据处理、查询、统计报表等数据管理方面有明显优势。正是两者的完美结合,才使计算机与称重仪表组成的在线式称重管理系统得到了广泛的应用。1串行通信的工作方式串行通信,可分为同步和异步两种方式。异步方式是指在约定的波特率下,传送和接受的数据不需要严格的保持同步,允许有相对的延迟,虽然速度较慢,但经济实用,所以异步串行通信现大量应用于计算机接口技术中。计算机与称重仪表就采用异步通信的方式传送数据。1.1异步串行通信的数据格式在这种通信方式中,一般以一个字符为一帧。一帧最少由三部分组成:起始位、数据位、停止位,开始是一位起始位以发送一个逻辑“0”表示,接着是表示这个数据的数据位,数据位可以是5位、6位、7位或8位,再加一位奇偶校验位,然后是一个、一个半或二个停止位,停止位以逻辑“1”表示。1.2波特率串行通信每秒传送的位数,传送时先低位后高位。常用的波特率有600、1200、2400、4800、9600等。1.3端口在计算机中,一般都配有两个标准串行口,用COM1和COM2表示。(通常采用2个9针D型阳性插头。)1.4信号线RS—232C标准规定有25根连线,使用21个信号线。在我们讨论的微机电子衡器中仅用到3根信号线,它们是:发送数据线TXD(输出信号),接受数据线RXD(输入信号线),信号地GND。其余信号线定义可参考相关书籍。2串行通信在电子衡器中的应用实例串行通信接口设计,包括硬件、软件设计两部分。在WINDOWS操作系统下,可选用VC++、VB等可视化开发工具。下面将以上海耀华称重系统公司的XK3190—A1+为例,以VB6.0编程语言,说明串行通信的软、硬件设计过程。 2.1称重仪表仪表选用上海耀华XK3190-A1+仪表,其串口通信格式如下:2.1.1连续方式发送:所传送的数据为仪表显示的当前称量(毛重或净重),每帧数据由12组数据组成。 第X组 内容及注释 1 02(XON)开始 2 +或- 符号位 3 称量数据高位 : 称量数据: : 称量数据: 8 称量数据低位 9

读取串口数据

读取串口数据 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: CommPort 设置并返回通讯端口号,缺省为COM1。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向发送缓冲区写一个字符串。 InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。 InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。 InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。 RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。 以下是通过设置控件属性对串口进行初始化的实例: BOOL CSampleDlg:: PortOpen() { BOOL m_Opened; ...... m_Serial.SetCommPort(2); // 指定串口号 m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置 m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小 m_Serial.SetInBufferCount(0); // 清空接收缓冲区 m_Serial.InputMode(1); // 设置数据获取方式

通用异步串口通信模块使用说明Ver0620

通用异步串口通信模块使用说明(Ver0.6.20) 一、TRS模块简介 TRS通用数传模块是在TRM基础上开发的数传模块,它将TRM模块同步通讯模式更改为标准异步(232)通讯模式。模块具有速率高、频段宽、功率大、功耗低、体积小、易集成等优点。 技术参数 ?供电:DC 5.5-45V 接收电流:<60mA 发射电流:<1.5A ?接口:异步RS232 ?接口速率:9600、19200、38400bps ?空中速率:9600、19200bps ?频率范围:410-470MHz ?频率步进:6.25和5 kHz ?频率稳定性:1.5ppm,-30到+60℃ ?调制方式:GMSK ?功率:0.5-2 瓦可编程设置 ?输出阻抗:50欧姆 ?接收灵敏度12dBSINAD:-116dBm @ 19200bps 二、通信接口说明 6针接口定义如上图所示。其中: 6针双排接口定义

IDC6双排针接口定义说明 1GND 电源、数据地 2VCC 电源DC 5.5-45V 3TXD1 设置数据发送(RS232) 设置串口 4RXD1 设置数据接收(RS232) 5TXD0 无线数据发送(RS232) 数据串口 6RXD0 无线数据接收(RS232)数据口用来无线传输数据,设置口只用来设置工作参数,皆为3线RS232串口。 三、参数设置 缺省工作参数已经设置为: 收发频率:435MHz (410—470MHz可调) 异步串口速率:19200 8 N 1 (9600、19200、38400bps可调) 空中速率:19200bps (9600、19200bps可调) 数据头长度:18个(10—18个可调) 发射功率:低(H、L高低可调) 调制频偏:<90> (1–255可调) 如要改变以上参数,请用Windows自带超级终端(程序→附件→通讯→超级终端),超级终端的“属性”里“端口设置”及“ASCII码设置”如下图所示: 连接模块设置串口后在超级终端里输入命令“@@Setup”(注意S大写),出现如下设置菜单: 菜单号当前参数说明 1. 发送频率 <435MHz> 设置模块发送频率 2. 接收频率 <435MHz> 设置模块接收频率

串口测试方法和步骤

串口测试方法和步骤Prepared on 21 November 2021

信号测试与分析 版号:xxx 编写:xxx 1、232串口信号: 要点:RS232采用三线制传输分别为TXD\RXD\GND,其中TXD为发送信号,RXD 为接收信号。 全双工,在RS232中任何一条信号线的电压均为负逻辑关系。即: -15v ~ -3v 代表1 +3v ~ +15v 代表0 测试结果与分析: 如图所示,以传输一个8位二进制数值“01101010”为例,异步传输数据的一般格式为:起始位+校验位+数据位+停止位。其中,校验位为可选项。因为 RS232电平为负逻辑,当电压为时,发送逻辑‘0’;当电压为时,发送逻辑 ‘1’。空闲状态为负电压(逻辑1)。 波特率计算:如图,传输9bit(1起始位+8数据位)花费的时间为79us。1s 传输的数据量为1/*9 = 113924,可以推测波特设置的波特率为115200。RS485的波特率计算同理。(二进制系统中,波特率等于比特率) 图示为发送端的波形,接收端波形与接收端波形大同小异,符合RS232电平要求。 (TTL波形暂时不进行分析) 2、485串口信号: 要点:RS485采用差分传输(平衡传输)的方式,半双工,一般有两个引脚A、B。AB间的电势差U为UA-UB: 不带终端电阻AB电势差:+2 ~+6v 逻辑‘1’; -2 ~-6v 逻辑‘0’; 带终端电阻 AB电势差:大于+200mv 逻辑‘1’; 小于-200mv 逻辑‘0’;注意:AB之间的电压差不小于200mv。 不带终端电阻 以传输一个8位二进制数值“01101010”为例: 测试结果与分析: 空闲状态:A=, B=0V,为逻辑‘1’。 发送逻辑‘1’时,A=,B=0V,A-B= ; 发送逻辑‘0’时,A=,B=3V,A-B=; 图示为发送端的波形,接收端波形与接收端波形大同小异,符合RS485电平要求。 (TTL波形暂时不进行分析)

UART的异步串口通信VHDL实现

UART 的异步串口通信协议的VHDL 语言实现 异步串行通信的采用的波特率为9600b/s,外配晶体振荡器的频率为3.6864MHZ ,故采用分频电路 package width is constant N:integer:=8; end width; use work.width.all; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity fredivn is GENERIC (N:integer:=6); port(clkin: in std_logic; clkout: out std_logic); end fredivn; architecture behav of fredivn is signal count : integer; begin process(clkin) begin if (clkin'event and clkin=1)then if(count

异步重叠操作之串口

异步重叠操作之串口 在工控行业,目前总线型通信依然占据半壁江山。常用的如485,CAN等。而面对小型系统时,尤其监控区域遍布在两公里范围内时,通过485-232或者CAN-232转换模块,使用上位机的串口与下属硬件通信组成系统便成了相对节约的一种设计方案。 本文的重点在于讲解异步重叠操作串口的思想以及过程。 所有的IO设备的操作都遵循:创建、读写、关闭三个步骤。 第一步:设计类的成员,其中成员此处不详细讲解,之后方法中用到时再谈 View Code 第二步:创建串口通道,在WINDOWS下,一切都表现得那么像文件操作 m_hPort = CreateFile((LPCWSTR)Device, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 其中CreateFile为API函数,其细节如下: // 作用: CreateFile函数可用来打开或创建文件和端口,它返回该设备的句柄 // 原型: // HANDLE CreateFile( // LPCTSTR lpFileName, // 指向文件名的指针 // DWORD dwDesiredAccess, // 访问模式 (GENERIC_WRITE/GENERIC_READ)。0表示仅允许获得与一个设备有关的信息 // DWORD dwShareMode, // 共享模式 (FILE_SHARE_READ/FILE_SHARE_WRITE)。0表述独占 // LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指 针 // DWORD dwCreationDisposition, // 创建属 性 CREATE_NEW 创建如果已经存在则冲突 // CREATE_ALWAYS 总是创建,存在则改写 // OPEN_EXISTING 打开现有,由设备提出要求 // OPEN_ALWAYS 打开,不存在则创建

串口通讯方法的三种实现

串口基本信息 用一台电脑实验串口自发自收,实验前要将串口(以9针为例)的发送引脚(2脚)和接受引脚(3脚)短接。 三线连接:适用于计算机之间尤其是PC机和单片机之间的数据通信。其连接信号对为(TxD,RxD)、(RxD,TxD)、(SG,SG)。即发送数据TxD端和接受数据RxD端交叉连接,信号地SG对应连接。 七线交叉连接:适用于同型号的计算机之间的连接,如PC机间的数据通信。其连接信号对为:(TxD,RxD)、(RxD,TxD)、(SG,SG)、(RTS,CTS)、(CTS,RTS)、(DSR.DTR)、(DTR,DSR)。其中,TxD、RxD、SG与前面信号的含义相同,RTS为请求发送,CTS为准许发送,DSR为数据装置准备好,DTR为数据终端准备好。在本地连接的微机系统中,RTS、CTS、DTR、DSR用作硬件联络控制信号。 目前使用的串口连接线有DB9和DB25两种连接器,用户可以国家使用的具体机器选择相应的连接器。 一个串口通讯类在https://www.360docs.net/doc/4917804044.html,/network/serialport.shtml。 PC机的RS-232接口的电平标准是-12V标示“1”,和+12V表示“0”,有些单片机的信号电平时TTL 型,即大于2.4v表示“1”,小于0.5v表示“0”,因此采用RS-232总线进行异步通信是,发送端和接受端要有一个电平转换接口。 串口通讯方法的三种实现 串口是计算机上一种非常通用的设备通信协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS一232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。串口通信方便易行,应用广泛。在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MSC—51)都具有串行通信口,可以设计相应的串El通信程序,完成二者之间的数据通信任务。 1串口通讯原理 串口通信的原理非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其它线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。 2串口通讯实现 在.net平台下使用C#语言实现串口通信的方法主要有三种:第一种方法是采用VB6.0中提供的MSComm控件,这种方法编程简单.但MSComm控件在使用前需要在系统中注册;第二种方法是采用微软在.net2.0及其以后版本提供的内置的串口操作类--System.IO.SerialPort,使用简单,但欠灵活;第三种方法是Windows的API函数,虽然编程难度高,但这种方法可以清楚地掌握串口通信的机制,并且高效、自由、灵活。 无论那种采用方式实现串口通讯,都需要通过以下四个步骤来完成: 1)打开串口 MSComm控件是通过设置PortOpen属性值来打开和关闭串口.具体语法为:MSComm. PortOpen=True/False. SerialPort类则是调用类的Open()和Close()方法来实现串口的打开和关闭。 API函数是通过CreateFile来打开串口.因为在Win32系统中,串口被看作一个文件,使用与文件相同的操作方式进行操作。 2)配置串口

异步方式winAPI串口通信

使用winAPI串口通信(二) 分类:Windows转载2009-09-23 16:51 263人阅读评论(0) 收藏举报 采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作 ,可以明显提高程序的效率. 为了实现重叠I/O操作,主要有如下几个编程步骤: 定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等. 1. 定义全局变量 HANDLE hCom; //串口句柄 DWORD ThreadProcWrite(LPVOID pParam); //写线程函数 DWORD ThreadProcRead(LPVOID pParam); //读线程函数 OVERLAPPED Wol = { 0 }; //写操作OVERLAPPED结构变量 OVERLAPPED Rol = { 0 }; //读操作OVERLAPPED结构变量 HANDLE hThreadWrite; //写线程句柄 HANDLE hThreadRead; //读线程句柄 HWND hWnd; //窗口句柄 2. 创建串口 hCom = CreateFile ( "COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式 NULL ); if( hCom != INVALID_HANDLE_VALUE) { SetupComm(hCom,1024,512); DCB myDCB; GetCommState( hCom,&myDCB); myDCB.BaudRate=CBR_19200; myDCB.fBinary=TRUE; myDCB.fParity=TRUE; myDCB.ByteSize=8; myDCB.Parity=ODDPARITY; myDCB.StopBits=ONESTOPBIT; SetCommState(hCom,&myDCB); } else { AfxMessageBox("创建串口失败!"); } hWnd = GetSafeHwnd(); //获取当前窗口的句柄

串口通信测试方法

串口通信测试方法 1关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2 实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是 RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,

通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在设计过程中,有如下约定: 0x31:PC机发送0x31,单片机回送0x01,表示选择本单片机; 0x**:PC机发送0x**,单片机回送0x**,表示选择单片机后发送数据通信正常; 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。 ②串行通信程序设计主要有微机发送接收程序和单片机发送接收程序,微机上的发送和接收程序主要采用计算机高级语言编写,如C语言,因为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件,故而这一块计算机通信的程序可不写! 在单片机上主要用汇编或C编写,在使用串口之前,必须先对串口进行初始化,主要是设置产生波特率的定时器1、串口控制和中断控制。具体步骤如下:(1)确定定时器1的工作方式——编程TMOD寄存器(设置波特率); (2)确定串口的控制——编程SCON; (3)串口的中断方式,必须开CPU和源中断——编写IE寄存器; (4)计算定时器1的初值——装载TH1,TL1; (5)启动定时器1——编程TCON中的TR1位。 为何串行口的工作方式选择方式1,这是针对于我们平常最常用的,单纯一块板对应于我们的私人电脑,所以就无须考虑是哪一块板发来的信息,即无须分清是数据帧还是地址帧。因为此时属于直通方式,所以无须考虑的。 方式1为波特率可变的10位异步通讯接口方式,发送或接收一帧信息,包括1个起始位0,8个数据位和一个停止位1,。其中的起始位和停止位在发送时自动插入的。 输出:当单片机执行一条指令将数据写入发送缓冲SBUF且TI=0时,就启动发送。串行数据从TXD引脚输出,发送完一帧数据后,就有硬件置位TI。 输入:在(REN)=1时,串行口采样RXD引脚,当采样到1到0的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。在接收到附加的第9位数据后,当满足(1)RI=0(2)SM2=0或接收到的第9位数据为1时,第9位数据(停止位)才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI.否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。通常串行接口以方式1工作时,SM2置为0. 而我们现实中需要的是一个机器中多块板进行显示和读取数据,所以这里不得不采取SM2=1的多机通信,而且我们一般采取的方式为方式3,TB8发送数据位,在模式2和3是要发送的第9位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。这里就可以根据地址判断出我们需要选取的板是不是方位监测板。 注明:如果用C语言来写的话,无论你是先发地址帧,然后数据帧,还是只发数据帧,最后显示的都是一样的内容,而汇编语言是不行的。 SM2:多机通信控制位,仅用于方式2和方式3. 接收状态时,当串行口工作于方式2或3时,以及SM2=1时,只有当接收

用FPGA实现异步串口与同步串口的转换

用FPGA实现异步串口与同步串口的转换 李文亮,姚冬苹 北京交通大学现代通信研究所,北京(100044) E-mail:li.wenliang4@https://www.360docs.net/doc/4917804044.html, 摘要:TI公司的TMS320C64xx系列DSP芯片的McBSP同步串口不具备与UART异步串口直接通信的能力,为了解决这个问题,扩展DSP芯片的使用范围,本文介绍了一种新的用FPGA来实现McBSP同步串口与UART异步串口之间相互转换的方法,通过必要的硬件连接和VHDL软件编程,实现了两种串口的转换,经测试,数据传输正确可靠。 关键词:串口通信;McBSP;UART;SPI;FPGA;DSP 中图分类号:TP212 1.引言 DSP芯片在现代数字信号处理中,应用特别广泛,尤其是TI公司的TMS320系列的DSP 芯片。在实际的应用中,常常需要DSP芯片与PC机或者其他采用UART异步串口的系统之间进行数据交换。本文采用FPGA,通过必要的软硬件设计解决同步串口与异步串口之间的数据通信问题。 2.DSP的异步串口扩展方案 目前使用较多的方式有以下几种。 (1) 在DSP的并行总线上扩展专用的UART芯片(例如TI的TL16C552),用硬件来实现异步串口扩展。这种方法软件设计简单,但占用了DSP的并行总线,使系统设计复杂化,不利于系统整体设计。 (2) 利用DSP的McBSP和DMA(或者EDMA),在不扩展硬件的基础上,通过软件设计的方式实现异步串口。这种方法虽然不增加硬件,但是软件复杂,增加了CPU的负荷。(3) 利用DSP的McBSP同步串行接口与MAX3111异步串行收发器,实现异步扩展,这种方式的硬件和软件设计都比较简单方便,唯一缺点是使成本较高。 (4) 利用DSP的McBSP同步串行接口,通过使用FPGA现场可编程逻辑器件,将同步串口转换为异步串口,这种方式方便灵活,适应性强。 本文采用第四种方案,使用ALTERA公司的cyclone芯片和MAXIM公司的MAX3232电平转换芯片,通过VHDL语言编程,实现DSP芯片和PC机之间的串口通信。DSP芯片的McBSP配置为SPI从设备模式。 3.串口标准介绍 3.1 UART异步串口协议 我们常用的异步串口时序如图1所示,由1位起始位,8位数据位和1位停止位构成1个帧结构单元。 图1 UART时序图

打开串口和串口设置

打开串口,设置串口 hCom =CreateFile( "COM2 ", GENERIC_READ | GENERIC_WRITE, // 允许读写 0,// 此项必须为0 NULL,// no security attrs OPEN_EXISTING,//设置产生方式 FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信 NULL ); 请大家注意,我们使用了FILE_FLAG_OVERLAPPED结构。这正是使用API实现非阻塞通信的关键所在。 ASSERT(hCom!=INV ALID_HANDLE_V ALUE); //检测打开串口操作是否成功 SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型 SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小 PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCL EAR 错误!超链接引用无效。 | PURGE_RXCLEAR ); //清干净输入、输出缓冲区 COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构 ………… SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时 DCB dcb ; // 定义数据控制块结构 GetCommState(hCom, &dcb ) ; //读串口原来的参数设置 dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE; SetCommState(hCom, &dcb ) ; //串口参数配置

异步串口通信电路的FPGA实现

学术研究 Academic  Forum2011/05 物联网 专用异步串口通信电路的FPGA实现 苏 明,姚冬苹 (北京交通大学电子信息工程学院,北京 100044 )摘 要:提出了一种利用异步串行通信接口电路的FPGA实现方法,该方法运用双端口RAM乒乓操作、CRC校验、状态机、组帧等操作描述了各个功能模块的FPGA设计,同时给出了该异步接口电路在集成开发软件XilinxISE11.1下的Modelsim仿真结果。结果证明,该异步串口通信设计可以简化电路并提高程序的灵活性和实用性,有利于程序在不同场合下的应用。 关键词:异步电路;串口通信;FPGA;CRC校验 中图分类号:TN402 文献标识码:A 文章编号:2095-1302(2011)03-0065- 03FPGA Implementation of Special Asy nchronous Serial Communication Interface CircuitSU Ming,YAO Dong -ping(Electronics and Information Engineering,Beijing Jiaotong University,Beijing  100044,China)Abstract:FPGA implementation method of using asynchronous serial communication interface circuit is proposed.The dual-port RAM pingpong operation,CRC check,state machine,framing and other operations are used in the meth-od to describe,the FPGA design of each module.The Modelsim simulation results of the asynchronous interface circuitunder the integrated development of software is presented.The results show that the asynchronous serial communicationwith FPGA resources can simplify circuit design,improve program flexibility and practicality,and benefit program ap-p lication in different occasions.Key words:asynchronous circuit;serial interface communication;FPGA;CRC check收稿日期:2011-03- 150 引 言 随着FPGA在电子产品中的广泛应用,多片FP-GA芯片中的数据传输也应用的非常广泛。就传输 数据而言, 串口通信是通信系统和控制系统应用中较为广泛的一种。串口通信分为异步和同步两种方式。本文采用RS 232异步通信协议来设计两片FPGA的之间的数据传输电路,同时,为了保证传输的准确性,还在数据的收发端加入了CRC校验。1 专用异步串口通信接口电路设计 本设计的目的是实现两块基带板之间的数据传输,其通信电路的结构框图如图1所示。在每块基带板上均有一片Xilinx公司的XC4VSX55型FPGA 芯片,两块基带板之间通过柔板相连接。为了节约两片FPGA相互通信的I/O口,设计采用RS  232异步串行通信协议和RS  422接口电平,其传输速率为115 200bps。异步串行通信协议是基于FPGA来实现的,并选用MAX3077作为RS  422电平转换芯片。两片FPGA的全局时钟GLOBAL_CLK均由100MHz 的晶振产生 。图1 通信电路的总体结构框图 本设计将整个电路分为接收基带板与发送基带板两部分接口电路。其中接收基带板接口电路包括数据乒乓读取模块、数据组帧模块、CRC编码模块、 5 6

相关文档
最新文档