使用win32 API 实现串行通信 (一)

本文基于wince平台,使用win32 API实现串行通信

1、打开和关闭串行端口

串行端口设备使用CreateFile函数打开,所使用的名称要遵循特定的格式,即3个字符

COM后紧跟要打开的COM端口号,再加个冒号,冒号是Windows CE所必需的。

如,hser=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE,0,

NULL,OPEN_EXISTING,0,NULL),为以可读可写的方式打开COM1端口。

调用CloseHandle函数关闭一个串行端口。

2、读写串行端口

调用ReadFlie与WriteFile函数进行读与写,由于Windows CE不支持重叠I/O,因此不要试图从主线程读或写大量的串行数据。所以常用的方法是使用单独的线程读写串口,即读和写分别建立线程,使用各自的线程函数进行处理。

3、异步串口I/O

虽然Windows CE不支持重叠I/O,但是可以使用多线程来实现同样功能的重叠操作,在主线程忙碌的时候,启动单独线程进行处理同步I/O操作。

这个时候,可以使用WaitCommEvent函数,该函数将阻塞一个线程直到一个预先选择的串行事件发生,即串口没有数据的时候等待,一旦有数据继续执行。要等待某一个事件,首先使用SetCommMask来设置事件掩码,通常是EV_EXCHAR参数,接收一个字符。

4、配置串行端口

可以使用GetCommState和SetCommState来配置串行端口。

需要注意的是,首先用GetCommState获得BCD结构体数据,这里BCD结构体有系统默认的值,不需要你去修改,然后使用SetCommState进行设置,主要设置波特率、起始位、数据位、停止位、奇偶检验。

5、设置端口的超时值

使用GetCommTimeouts和SetCommTimeouts进行设置。

对于串口编程,数据的解析很重要,以上代码写好,基本不会变。下来就是解析和分发。

时间: 2024-10-10 11:09:28

使用win32 API 实现串行通信 (一)的相关文章

win32 api

Microsoft在StrSafe.h定义了新的安全字符串函数 为了防止缓冲区溢出,在将一个可写缓冲区作为参数传递时,必须传递它的大小,大小可以有_countof获得, _countof获取字符数, sizeof获取字节数 for example: int a[10]; // _countof(a) == 10 _CrtSetReportMode(_CRT_ASSERT, 0); // in head of program 可以禁止C run time可能触发的debug assertion f

C#调用Win32 api时的内存操作

一般情况下,C#与Win 32 Api的互操作都表现的很一致:值类型传递结构体,一维.二维指针传递IntPtr.在Win32 分配内存时,可以通过IntPtr以类似移动指针的方式读取内存.通过IntPtr移动时,需要考虑指针的计算.规则总体上来说显得一致,但Win32 Api庞杂,总有一些令人困惑的函数.比如GetIpForwardTable.该函数的功能是返回Ip(v4)的路由表.在win32 的结构体定义如下: DWORD GetIpForwardTable( _Out_ PMIB_IPFO

【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

注:这里的服务是指Windows 服务. 市面上常见的安装一个服务的方法大概有这么几种: 用Process类调用sc.exe.Installutil.exe等外部工具进行安装.极不推荐,须知创建一个进程开销不小,并且依赖外部工具有损程序健壮性 使用TransactedInstaller和AssemblyInstaller安装类进行安装.不推荐,既然都用托管方法,何不用更好的方法呢 用ManagedInstallerClass.InstallHelper进行安装.这个我认为是托管方法中首选的方法,

通过 WIN32 API 实现嵌入程序窗体

写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做到, 以下是详细注释过的主要源代码. 我把它封装到一个类中: [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys

重温WIN32 API ------ 最简单的Windows窗口封装类

1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C++作为C的超集,能实现所有C能实现的功能.其实反之亦然,C本身也能完成C++超出的那部分功能,只是可能需要更多行的代码.就本人理解而言, 对于巨大型项目,还是使用纯C来架构更加稳妥: 对于中小型项目来说,C++可能更方便快捷.由于目前做的是中小项目,所以决定把C++作为主要开发语言. 1.2 关于C

C# call Win32 api时,-1如何转换为DWORD

当使用(uint)-1时,编译器会给出警告:常量-1无法转换为uint,使用unchecked语句重写.DWORD在转换为C#类型时为uint,既然无法使用uint强制转型(-1),那就需要其他办法了.既然编译器给出的提示是使用unchecked语句重写,可以一试.之前没有使用过unchecked语句,所以不熟悉其用法.看了下参考文档,MSDN是这样描述unchecked的: The unchecked keyword is used to suppress overflow-checking

Detours简介 (拦截x86机器上的任意的win32 API函数)

Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得)用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为.具体用途是:拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的

利用win32 api实现进程通信---通过剪切板

// c#中win32 api的调用 //windows 消息机制的原理 //clipboard viewer chain. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.I

.NET 框架程序使用 Win32 API

.NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库.DllImport 属性用于指定包含外部方法的实现的dll 位置.       DllImport 属性定义如下:      namespace System.Runtime.InteropServices   {    [AttributeUsage(AttributeTargets.Method)]    public class DllImportAttribute: System.Attribute    {    p