zoukankan      html  css  js  c++  java
  • windows串口编程Win32,PComm串口开发

    https://blog.csdn.net/u011430225/article/details/51496456

    https://blog.csdn.net/eit520/article/details/7861029

    关于串口编程的,有用API的,有用mscomm的。

    其实用了Pcomm lite,很多问题都不会碰到,只需要打开串口,建个线程收数据,然后只需要关注自己要收发的数据就行了。

    PComm Lite是家叫moxa的公司出的,做了几十年工业串口卡、串口服务器之类设备了。提供的pcomm易用性、可靠性久经考验。

    下载地址:http://www.moxa.com/product/download_pcommlite_info.htm

    目前最新版是Version 1.5 Released 2010-09-20 支持XP/win7, 32/64bit的库都有,开发环境支持VC/VB/Delphi。

    注意可以会搜到另外一个Version 2.6. Released Jul 8, 2008是WIN9x/NT4用的,不要看版本号高下错了。

    国外工业上还有很多老系统在用。

    用起来很简单,pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windowssystem32下。
    整个库包含50多个函数,最常用的也就10来个:
    打开、关闭、设波特率的:sio_open ()、sio_close()、sio_baut()
    发送数据的:sio_putch(),sio_write() 
    接收数据的:sio_getch(),sio_read()
    查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue()
    有时可能要设读写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts()
    这些函数见名知义,用法查一下PComm.chm就行了。
    接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。

    这些基本就齐活了。需要控制DTS/RTS、自动流控件有都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。

    Windows下串口编程

     造冰箱的大熊猫@cnblogs 2019/1/27

    将Windows下串口编程相关信息进行下简单小结,以备后用。

    1、打开串口

    打开串口使用CreateFile()函数。以打开COM6为例:

    HANDLE hComm;
    
    hComm = CreateFile( TEXT("COM6"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

     其中:

    - "COM6",待打开串口的串口名。

    - GENERIC_READ | GENERIC_WRITE,串口读写权限。

    - 0,固定值。

    - NULL,指向SECURITY_ATTRIBUTES的指针。通常设置为NULL,此时CreateFile()函数返回的句柄不能被子进程继承。

    - OPEN_EXISTING,固定值。

    - FILE_ATTRIBUTE_NORMAL,文件属性。

    - NULL,固定值。

    - hComm,函数返回的句柄。如果打开串口成功,则在后续操作中使用该句柄访问串口。如果打开串口失败,函数返回句柄为INVALID_HANDLE_VALUE

     这里两点需要说明:

     一是CreateFile()、CreateFileA()[1]和CreateFileW()[2]的区别。在大部分说明如何使用Win32 API打开串口的文档中都介绍用CreateFile()函数打开串口,但某些文档中却使用CreateFileA()或CreateFileW()函数。实际上三个函数的功能是相同的,只是所采用的字符串编码格式不同。CreateFileA()函数名中的A代表ANSI,而CreateFileW()中的W代表UNICODE。所谓ANSI编码,是各国根据自己的语言定义的字符编码格式,其中0~0x7F与ASCII字符相同,其余则与具体语言相关。因此,中文ANSI编码(GB2312)和日文ANSI编码无法互通。UNICODE则是将所有语言的编码进行统一,用同一个编码空间覆盖所有语言文字。从下面的代码中可以清楚地看出三个函数的关系。 在前面CreateFile()示例中,TEXT宏的用途就是根据当前操作系统的编码格式对字符串"COM6"进行适当的格式转换。

    复制代码
    HANDLE CreateFileA(
        __in     LPCSTR lpFileName,
        __in     DWORD dwDesiredAccess,
        __in     DWORD dwShareMode,
        __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        __in     DWORD dwCreationDisposition,
        __in     DWORD dwFlagsAndAttributes,
        __in_opt HANDLE hTemplateFile
        );
    
    HANDLE CreateFileW(
        __in     LPCWSTR lpFileName,
        __in     DWORD dwDesiredAccess,
        __in     DWORD dwShareMode,
        __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        __in     DWORD dwCreationDisposition,
        __in     DWORD dwFlagsAndAttributes,
        __in_opt HANDLE hTemplateFile
        );
    
    #ifdef UNICODE
    #define CreateFile CreateFileW
    #else
    #define CreateFile CreateFileA
    #endif
    复制代码

    二是对于串口号大于9的串口(例如COM12),在CreateFile()函数中串口名应写作".COM12"。

    2、关闭串口

    关闭串口则使用CloseHandle()函数。示例如下:

    CloseHandle(hComm);

    3、配置串口工作参数

    以设置串口为波特率115200,数据位8bit,停止位1bit为例:

    复制代码
    DCB dcb;
    
    GetComm(hComm, &dcb);
    
    dcb.BaudRate = CBR_115200;
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;
    
    SetCommState(hComm, &dcb); 
    复制代码

    4、写串口

    以发送字符串"abcd"为例:

    复制代码
    char  buf[] = "abcd";
    DWORD buf_len = 4; // 待写入串口的字节数
    DWORD written_cnt; // 实际写入串口的字节数
    
    WreteFile( hComm, (void *)buf, buf_len, &written_cnt, NULL );
    复制代码

     5、读串口

    以读取12个字符为例:

    复制代码
    char  buf[128];
    DWORD toread_cnt = 12; // 要从串口读入的字节数
    DWORD read_cnt;        // 实际从串口读入的字节数
    
    ReadFile( hComm, (void *)buf, toread_cnt, &read_cnt, NULL );
    复制代码

    6、清除串口缓冲区

    当串口接收到一个字节时,串口驱动程序将接收到的字节写入内存的某个位置(输入缓冲区)。当应用程序读取串口时,操作系统按照“先进先出”的原则从输入缓冲区取出数据交给应用程序。在某些应用场景下,应用程序需要舍弃输入缓冲区内当前数据。这可通过PurgeComm()函数实现。

    PurgeComm( hComm, PURGE_RXCLEAR );

    7、其它

    在Windows操作系统中,计算机上实际存在的或者虚拟的通信端口,包括串口和并口等,统称为通信资源(Communication Resource)。本文总结的串口编程信息对通信资源也是适用的。

     本文只涉及简单的串口读写操作,对于流量控制、异步读写、读写操作超时等复杂的串口控制,请参考相关函数微软文档中的详细说明。

    参考资料:

    [1] 函数CreateFileA()说明 @ Microsoft

    [2] 函数CreateFileW()说明 @ Microsoft

    [3] 结构DCB说明 @ Microsoft

    [4] 函数PurgeComm()说明 @ Microsoft

  • 相关阅读:
    对象与内存控制1---实例变量和类变量
    数组与内存控制2--数组使用
    数组与内存控制1--数组初始化
    Java 三大特征之--多态
    简述Java面向对象三大特征:封装、继承、多态
    java程序初始化的顺序
    关于public static void main(String[] args)相关知识
    Java的优点
    前端面试攻略3------HTML和CSS部分
    前端面试攻略2------计算机网络部分
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11518703.html
Copyright © 2011-2022 走看看