wince串口编程
Windows串口编程技术

串口相关函数详解
函数SetCommState函数根据入口参数中的DCB结构
指针对串口设置进行调整。一般来讲,我们仅需对 DCB结构中的少数几个域进行调整,因此,不应该 直接填充该结构,好的做法是首先调用 GetCommState函数获取当前的DCB结构,然后对 关心的域进行调整。另外GetCommProperties函数 可以帮助获取设备的性能参数,比如设备支持的最 大波特率值:dwMaxBaud。
串口相关函数详解
BOOL SetCommBreak(
HANDLE hFile // 设备句柄 ); 该函数将指定通信设备的数据传输挂起,将数据线置于 BREAK状态,直到ClearCommBreak函数被调用。这里BREAK 并不是向串口设备发送的特殊的中断字符,而是通信线路的电气 状态。 BOOL ClearCommBreak( HANDLE hFile // 设备句柄 ); 该 函数恢复指定通信设备的挂起的数据传输过程,并将数据线置于 NONBREAK状态,参见SetCommBreak函数说明。 BOOL ClearCommError( HANDLE hFile, // 设备句柄 LPDWORD lpErrors, // 错误码 LPCOMSTAT lpStat // 通信状态 );
串口相关函数详解
配置类函数根据输入参数/结构对串口进行配置,
每一个Set**函数对应有一个Get**函数用于获 取当前配置。详细介绍请参阅MSDN文档,这 里我们仅对几个关键函数进行说明。 上面介绍的Set**函数中,除了SetCommMask 和SetupComm外,入口参数中都有对应的配置 结构,参阅相关结构的说明可以知道该函数的 作用。SetCommMask函数用来指定关心的事件, 其参数dwEvtMask与操作类函数中 WaitCommEvent的取值一致。下面说明 SetupComm函数。
Lazarus实战开发之串口通信(WINCE-WIN32)

Lazarus实战开发之串口通信(WINCE/WIN32)Lazarus最吸引人的地方就是她的开发方式类似Delphi,支持超好用的RAD开发方式,并且最厉害的地方是她还支持多个平台,多个CPU,例如ARM9的WINCE。
本文要讲述的就是“如何使用LAZARUS开发Wince上的串口程序”,并且,本文的串口程序同时支持WINCE和WINXP系统,当然编译时要选择平台啦。
WINCE与WINXP 在本文中的代码区别只是OpenPort(‘COM1:’,CBR_9600,8,NOPARITY,ONESTOPBIT);//wince用COM1:表示串口1;WINXP用COM1表示串口1.一、建立一个可重用的类,文件名为CE_Series.pas:unit CE_Series;interfaceusesWindows,Classes, SysUtils, LResources, StdCtrls,ExtCtrls;typeTCE_Series = class(TObject)privatehComm: THandle;publicFunction OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;procedure Send(str:String);Function Receive():String;procedure ClosePort();end;implementation//============================================================================== =================// 语法格式:OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer)// 实现功能:打开串口// 参数:port,串口号;例如wince下为从COM1:,COM2:。
WinCE下串口通信模型设计与实现

第 2 卷 第 8 9 期
Vo . 1 29
计 算 机 工程 与 设 计
Co p e gn eig a dDe i n m e r En ie r n sg n
20 年 4 08 月
Apr 0 .2 08
NO8 .
WiC n E下 串口通信模型设计与实现
o e tdtc n lg , asra o i r n e h oo y e l mmu iainmo es f M C ed sg e n pe ne . T emo e i o nl a elr e e i c ncto d l o AR t P a e in da di lme td o r m h d l dn t yh v g d o a
在 通 信 和 实 时 监控 系 统 中, 行 通 信 因 其 具 有 连 接 简 单 、 串
使 用 灵 活 方 便 、 据 传 输 可 靠 等 优 点 得 到 了广 泛 的 应 用 。 n 数 Wi—
别: @WiC n E只 支 持 U i d 字 符 集 ; E C不 支 持 重 叠 I nc e o ② V / O操
Ke r s ywod :Wi o s Esr lo u i t n bet r ne ;muthed snho ia o ;cas a n w i m n c i ;ojc o etd d C e ac ao i ltra; y crnzt n ls pr i i t
0 引 言
t r u h u s h g a m ec p b l i s b tas a etrr a a i te . T eC m h o g p t , i h r l i a a i te , u l h d b te d b l i s e t i o e i h o n c t r c s e a t d f m o l td u ia i n p o e s ss p a e o c mp i ae o i r r c
WinCE6.0下双模终端的USB转串口驱动开发

0 引 言
我国 3 G牌 照 的 发放 , 宣告 了 3 时代 的到 来 , G
基于 T —C MA和 C MA WC MA 的双 模 终 端 将 DS D D / D 取代 2 时代 的单 模 终 端 。诺 基亚 、 星 、 为 、 G 三 华 中 兴等 国 内外 通 信 厂 商 都 积 极 投 入 到 双 模 手 机 终 端 的开发 中来 , 目前 双模 手 机终 端 的研发 已经 成 为热 点 。当前市场 中主要 的智 能手 机操 作 系统 有 : o i N ka 主推 的 Sm in 开 放 内核 的嵌 入 式 Ln x 微 软 的 y ba , iu , WiC n E等 。由于 WiC 6 0嵌人 式 系统具 有实 时性 n E.
Wi E. U B设备驱动开发只提供了一些底层支持 n 60对 S C
的原因, 以通 信 模 块 厂 商 未 提 供 WiC 6 0下 的 所 nE .
U B驱 动 , 要 实 现 通 信 模 块 的基 本 功 能 , 开 发 S 而 除
纯 U B驱 动 外 , WiC 6 0下 , 需 要 修 改 Mo S 在 nE. 还 . d m源码 , e 存在 着开 发 周 期 长 、 作量 大 、 容 性 差 工 兼 等 问题 , 给开发 人 员带 来 了极 大 的不 便 。而通 过 串 口直接对 Mo e dm进 行操作 , 不仅 避 免 了上述 在开 发 中存 在 的问 题 , 时 由于操 作 Mo e 的 是 虚 拟 串 同 dm 口, 由它来 适 配 Moe 不 会 出 现 由物 理 串 口操 作 d m, Mo e 时制 约 M d m处理速 率 的问题 , 然保持 了 dm oe 仍 U B高 速的特 点 , 开 发人 员 只 需 开发 出对应 模 块 S 故 的 U B转 串 口驱 动 亦 可实 现 上 网 、 电话 等 功 能 ; S 打
WinCE.NET下串口驱动分析及其与PC通信的实现

Anay i fS ra i e n m m u i ai n O C n W i l sso e i lDrv r a d Co n c to f P i nCE. NET
ZH A N G e z -. U Y A NG u o Zh ng hu . 0 Li b
S ra r s a c m m on c m put rs s e i t r a e, s i po t n ol n d t ta m ison. h r c s w o w rt h e ilpo ti o o e y t m n e f c ha m r a t r e i a a r ns s i T e p o e s ofho t ie t e
21 0 0年 第 6期 第 3 7 1
WiC N T下串 口驱动分析及其与 P n E. E C通信的实现
张 正 柱 h 欧 阳 柳 波 ,
(. 南 大学 软 件学 院 湖南 长 沙 1湖 4 0 8 ;. 建 工 程 学 院 软 件 学 院 福 建 福 州 30 0 ) 10 2 2 福 5 0 3
0 引 言
内置 设备 ; 接 口驱 动 程 序 实 现 一 组 固定 的流 接 口函 流 数, 它是一 个 动态链 接 库 ( L ) 由设 备管 理 程 序 负责 D L, 加载 、 管理 ; 单体 驱 动 程 序 把 中断 处 理 、/ 操 作 、 件 IO 硬 控制 等代码 放在 一起 。 分层 驱动程 序把 驱动程 序 的代码 分为 两 层 , 模 型 设 备 驱 动 ( d lD vc r e , 即 Mo e e i D i r e v
基于WinCE系统平台的自动校直机产品串口通信的设计

aP r 实 现 串 口 的异 步 、 步通 信 , 后 所 有 程 序 在 蓝 海 微 芯 公 司 提 供 的 e n 0 0 体 机 上 运 行 测 试 成 功 。 |ot 同 最 Wi7 0 一
关键 词 : n E操 作 系 统 ; 2 0 ; 件 S r l o t WiC VS 0 5 控 eiP r a 中 图 分 类 号 : P 1 T 31 文 献 标 识 码 : B d i1 . 9 9 j i n 1 7 — 4 7 2 1 . 3 0 0 o : 0 3 6 /.s . 6 43 0 . 0 1 0 . 2 s
如下 :
H ANDIE e t Fi Cr a e l e( LPCTSTR i l Na pFie me,
需要 与外 部设 备进 行 数 据 交互 , 口提 供 了数 据传 串
输 的通道 , 并且 使用 起来 非常 方便 , ] 因此 本文 重 点 研究 WiC n E操 作 系 统 串 口通 信 的 基 本 编 程 技 术 ,
Ke wo d : i y r s W nCE S;V ¥2 O5; Se i l O O ra Por t
了测 试 。
引 言
2 WiC 串 口编 程基 础 nE
wiC n E操作 系统具 有实 时性 好 , 支持 多 任务 可
切换 , 一体 化 的人机 界面 , 适用 于 多种开 发语 言等特 点, 因此越 来越 受 到工业 控制 领域 编程人 员 的青睐 。 基 于 WiC n E平 台 的校直 机 产 品 在工 作 过 程 中经 常
为实 现 wiC n E操 作 系 统 的 串 口通 信 , 文 所 本
选 的编程 工具 为 VS 0 5 微 软 公 司 为 WiC 20 , n E操 作
Windows串口编程API函数

Windows串口编程API函数发表时间:2010-12-26 点击数:1232·打开串口:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);在Windows CE下,利用CreateFile函数打开一个COM口时,dwShareMode(共享模式)必须设置为0,表示独占方式;lpSecurityAttributes(安全参数)必须设置为NULL;hTemplateFile(模板文件)必须设置为NULL;dwCreationDisposition需要设置为OPEN_EXISTING。
则上述函数简化为:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,0,NULL,OPEN_EXISTING,DWORD dwFlagsAndAttributes,NULL);其中dwDesiredAccess设置为GENERIC_READ表示可读,设置为GENERIC_WRITE表示可写。
通常可通过如下示例打开一个串口。
CreateFile(_T("COM1:"),GENERIC_READ | GENERIC_WRITE, //允许读和写0, //独占方式(共享模式)NULL,OPEN_EXISTING, //打开而不是创建(创建方式)0,NULL);打开串口成功,函数返回串口句柄;打开串口失败,函数返回INVALID_HANDLE_VALUE ·关闭串口:BOOL CloseHandle(HANDLE hObject);如:CloseHandle(m_hComm); //m_hComm是CreateFile函数返回的串口句柄。
基于WinCE的串口应用程序编写及测试

基于WinCE的串口应用程序编写及测试摘要:串口在嵌入式系统与PC通信时可以起到非常重要的作用,但是对于串口应用程序的测试却因为种种原因非常麻烦。
详细论述了如何对串口应用程序进行测试。
关键词:WinCE;串口;串口应用程序测试串口也称为串行接口或串行通信接口,在实际嵌入式学习或开发中可以深刻地体会到串口在开发板与PC通信过程中起了很好的作用。
然而编写和测试串口应用程序并非那么容易,本文将结合实际WinCE与PC的特点讲述如何实现对串口的操作。
1串口应用程序的编写1.1WinCE下串口通信简介在WinCE下运行的程序,一般都是在Windows环境下开发,再通过USB线或U盘等下载到嵌入式设备中运行的。
文中使用.NET Compact Framework (简称.NET CF),并使用C#进行串口应用程序开发。
由于在.NET CF下提供了专门的SerialPort类来操作串口,所以开发WinCE下的串口应用程序相对来说会比较容易。
1.2串口应用程序的编写在串口应用程序中,“发送区”文本框名为txtSend,“接收区”文本框名为txtRecv,项目当中添加了一个SerialPort控件,名为port,“发送”按钮名为btnSend。
下面给出接收和发送部分的主要代码。
port控件中DataReceived事件(用于接收)对应的处理函数如下:void port_DataReceived(object send,SerialDataReceivedEventArgs e){int bytesToRead = port.BytesToRead;byte[] arr = new byte[bytesToRead];port.Read(arr,0,bytesToRead);string str = Encoding.Default.GetString(arr,0,bytesToRead);txtRecv.Text += str;}“发送”按钮单击事件对应的处理函数如下:void btnSend_Click(object send,EventArgs e){byte[] arr = Encoding.Default.GetBytes(txtSend.txt);port.Write(arr,0,arr.Length);}总体来说,使用C#开发串口应用程序非常简单、方便。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中串口通信设计
摘要:
利用Evc开发Wince中的串口设计
关键字:
WINCE、Evc、串口通信
作者
Tony
§串口通信程序开发过程:几个概念:
1. 仿真器(Emulator):在开发平台上,模拟应用程序的运行环境(Run Environment),产生与目标机上运行程序同样的效果,就像在目标机上运行一样。
在eMeded Micosoft Visual C++4.0上都带有仿真器,我们开发的软件不需要在特定的WinCE目标机上运行,只需要在仿真器上运行正确就可以了。
当然,在目标机上更加能够看到想得到的效果。
2. 系统运行环境:主要是CPU系列,我们在产生WinCE的应用程序的时候,有一个选择,要求所选择的CPU架构与之相符,如果多选了,就有可能出如下错误:找不到vcxxx.exe文件。
通常情况下,我们所用的Cpu都是X86系列,所以我们就选择X86和一个仿真器就可以了,如下图所示:
3. eMbeded VC++:专门用来做window ce上的应用程序的开发工具,作用等同于pc 机上window平台下的VC++。
eMbeded VC++开发的程序不能在Win32平台下运行,VC++开发的程序不能在WinCE下运行。
L 串口测试软件的详细设计。
采用面向对象的程序设计方法,把一些业务逻辑抽象出来,形成一些通用的类,方便移植与继承,同时也方便维护。
类描述了一组有相同特性(数
据元素)和相同行为(函数)的对象。
在eMbded VC++集成环境中,选择File->New,然后选择Project,输入工程名称,单击OK,系统将会为我们生成一些代码及EVC的程序框架。
如下图所示:
1) 串口操作的对象化
串口的操作,首先要打开串口才能操作,就是说首先要打开串口驱动,然后进行下一步的操作。
在操作接收后,需要关闭串口,以释放内存。
我们的串口软件驻留在电子盘上,通过PC104的串口,与单片机的串口进行通信。
在不能确定单片机什么时候发送数据来得情况下,我们必须启动一个线程来监视串口,当有数据(主要是确定有一个8位的字符为标志)到达时,我们就写入缓存,保存下来。
当然,我们也可以往串口写入数据,让单片机去处理,这个处理过程不是我们软件的任务,由单片机程序去处理。
由此,我们抽象一个CPort的类来处理这些过程。
class CPort
{
public:
CPort();
virtual ~CPort();
BOOL Open( int nPort);//, int nBaud);
BOOL PortClose (void);
BOOL SendData( const char *buffer, int size );
int ReadData(BYTE *data);
BOOL m_bOpened;
HANDLE m_hIDComDev;
DWORD dwError;
DWORD dwThreadID;
};
Open是用来打开串口的方法(Method), 有一个参数选择,让用户打开不同的串口。
PortClose 关闭已经打开的串口,所以不需要参数。
SendData往缓存写入规定的Size的字符数量,串口是串行的,一次只写入bit,写入两个bit后就组成一个Byte,单片机在收到一个byte之后,就发送一份报文给PC104串口,我们的程序监控线程监测到这个事件后,启动ReadData 方法,把数据读入缓存,等待处理。
这个CPort类是一个标准的C++类,在EVC中加入自定义类方法如下图所示:
选择New Class,出现如下:
选择Generic Class, 输入我们的串口类:CPort, 单击Ok成功。
1)线程的处理:
线程的作用就在于监视端口,在没有收到数据之前,它都处于阻塞状态,只有在收到字符这个事件发生后才会解除阻塞状态。
在Window 的I/O方式里,对于通讯设备的I/O 可以用像是事件驱动式的方法来达成。
主要是利用一个叫WaitCommEvent()的API. 调用这个API 之后, 会一直block 到设定的事件发生之后才会返回。
在设定等待状态之前,我们必须设定等待事件。
SetCommMask(hCom, EV_RXCHAR);//设置事件驱动的类型,我们用这个函数来设置需要处理的事件,hCom串口句柄,EV_RXCHAR是接收到字符的事件。
WaitCommEvent函数等待这个事件的发生。
在这个事件发生之前,线程的其他处理过程都不能进行:
int CPort::ReadData( BYTE *data )
{
BYTE Byte;
DWORD dwCommModemStatus,dwBytesTransferred;
int len = 0;
SetCommMask (m_hIDComDev, EV_RXCHAR);
if (m_hIDComDev != INV ALID_HANDLE_V ALUE)
{
WaitCommEvent (m_hIDComDev, &dwCommModemStatus, 0);
SetCommMask (m_hIDComDev, EV_RXCHAR);
if (dwCommModemStatus & EV_RXCHAR)
{
do{
if(!ReadFile (m_hIDComDev,
&Byte,
1,
&dwBytesTransferred,
))
::MessageBox (NULL,_T("读取串口失败!"),_T("RIGHT"),MB_OK);
// Display the data read.
if (dwBytesTransferred == 1)
{
data[len] = Byte;
data[len+1] = 0;
len++;
}
}
while (dwBytesTransferred == 1);
}
}
return len;
}
就这个读数据的函数而言,在等待到EV_RXCHAR事件之前,下面的ReadFile操作不会进行,其他调用这个函数的线程的操作也被阻塞。
§串口的参数设置
通常情况下,RS232串口有几个常用的参数需要设置,波特率(指数据在异步信道中传送的速度),数据位(数字电路中,最小的数据单位),停止位(结束标志),效验位(奇偶效验),端口。
Combo Box是由Edit控件和List控件组合而成的,所用在设计的时候,需要把小按钮下拉,再拉长,不然的话在程序运行的时候看不到自己加进去的选项
§协议的解析
我们所有数据的传输,都是基于bit的传输,两个bit组成一个byte,所以在进行数据处理的时候,就要求在处理的时候要一个个byte的处理,读取一个处理一个,而不能按照字符
方式处理。
但是有的信息是一个十进制的数据,比如101,我们必须按照BCD码的方式处理,1×100+0×10+1;这样才能得到101。
解析出来之后,还要转换成可以为普通操作员可以看的懂的字符,我们还需要建立一个表,比如101对应天气,就需要把101解析为天气,而不是单纯的101,所以要建立两张表,一张表存储BCD码,另外一张表存储对应的汉字,方便查找。
双层GroupBox的时候,必须从里往外放置,如果放反了,里面的一个就看不到,就是电文二看不到,这个在VC, Delphi里面是不可能的。
§启动Logo的制作
为了美化程序界面,我们做了一个Logo(暂用本论坛代替)背景的启动界面。
当初设计的时候,是在程序开发的时候静态调用Logo,后来发现一个问题就是图片闪烁,不好看,后来决定采用动态调用图片,在内存中开辟一块兼容的DC,
写入DC,然后显示出来,这样就消除了闪烁的现象
Old_Bitmap = MemDC.SelectObject(&m_Bitmap); //Select DC
dc.StretchBlt(0,
0,
bmBitmap.bmWidth,
bmBitmap.bmHeight,
&MemDC,
0,
0,
bmBitmap.bmWidth,
bmBitmap.bmHeight,
SRCCOPY);。