none
虚拟串口的问题 RRS feed

答案

  • 你首先需要了解一下WINCE中流接口驱动的原理,知道应用是怎么和驱动交互数据的,就好办了。WINCE中ReadFile的定义是
    BOOL ReadFile( 
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );

    当应用中调用ReadFile时,用户要传递一个指针型变量给ReadFile中的第2个参数,而这个指针会由系统传递到被调用的流驱动中的XXX_Read中的第2个参数,看XXX_Read的定义
    DWORD XXX_Read(
    DWORD hOpenContext,
    LPVOID pBuffer,
    DWORD Count
    );
    也就是说,ReadFile传递一个指针给驱动中的XXX_Read,然后可以在流驱动中把某个内存区域中的数据读出来,填充到这个指针指向的地址,这样,在ReadFile中就可以获得这些数据了。
    而调用WriteFile时,
    BOOL WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
    );
    首先将数据填充到第2个指针参数指向的地址,然后这个指针会由系统传递到流驱动中的XXX_Write的第2个参数,
    DWORD XXX_Write(
    DWORD hOpenContext,
    LPCVOID pBuffer,
    DWORD Count
    );
    然后在XXX_Write中把这个指针指向的地址中的数据写到某个内存地址中去。
    搞清楚这些后,你所要做的就是建立2个流驱动,然后创建一个他们都能访问的共享内存区域。这样就可以调用WriteFile打开一个流驱动,往这个共享区域写入一些数据,而调用ReadFile时,会打开另一个流驱动,把这个区域中的数据取出并回传给应用程序。




    2008年8月11日 6:06

全部回复

  • 不知道楼主要用虚拟串口做什么用?要实现什么功能。如果就是在系统中虚拟一个COM口出来的话,那么只要写一个流式接口驱动,把注册表中三个字的prefix设置成COM即可。

    2008年8月7日 6:37
    版主
  • 我想实现的功能:

     

    同一台机上,样二个软件用虚拟串口进行通讯.

     

    (PC上有TCP/IP socket 转 虚拟串口的方式, 不知WinCE上能不能行得通? )

    2008年8月7日 12:39
  • 请问高手如何实现?谢谢。


     

    2008年8月8日 3:18
  • 你首先需要了解一下WINCE中流接口驱动的原理,知道应用是怎么和驱动交互数据的,就好办了。WINCE中ReadFile的定义是
    BOOL ReadFile( 
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );

    当应用中调用ReadFile时,用户要传递一个指针型变量给ReadFile中的第2个参数,而这个指针会由系统传递到被调用的流驱动中的XXX_Read中的第2个参数,看XXX_Read的定义
    DWORD XXX_Read(
    DWORD hOpenContext,
    LPVOID pBuffer,
    DWORD Count
    );
    也就是说,ReadFile传递一个指针给驱动中的XXX_Read,然后可以在流驱动中把某个内存区域中的数据读出来,填充到这个指针指向的地址,这样,在ReadFile中就可以获得这些数据了。
    而调用WriteFile时,
    BOOL WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
    );
    首先将数据填充到第2个指针参数指向的地址,然后这个指针会由系统传递到流驱动中的XXX_Write的第2个参数,
    DWORD XXX_Write(
    DWORD hOpenContext,
    LPCVOID pBuffer,
    DWORD Count
    );
    然后在XXX_Write中把这个指针指向的地址中的数据写到某个内存地址中去。
    搞清楚这些后,你所要做的就是建立2个流驱动,然后创建一个他们都能访问的共享内存区域。这样就可以调用WriteFile打开一个流驱动,往这个共享区域写入一些数据,而调用ReadFile时,会打开另一个流驱动,把这个区域中的数据取出并回传给应用程序。




    2008年8月11日 6:06
  •  

    谢谢张强老师.

     

    流驱动我不太懂,经您讲解后,我进一步的了解了.

     

    问题(1):假如虚拟串口Com99和COm100对应, Com99数据地址如何定义,在什么地方定义(或者一个共享内存如何与Com99相关联或者WriteFile和ReadFile的地址如何指定)? 是不是要DDK或CreateFileMapping?

     

    问题(2):在调用其它类型的流驱动中,WriteFile 或 ReadFile 函数中的参数地址是不是都是共享内存方式建立的(CreateFileMapping), 一般推荐什么方式建立?

     

    问题(3):用这种方式(老师介绍的方法)实现的流驱动与 目录\WinCE500\Platform\CPU's folder\DRIVERS\SERIAL 下的驱动有何不同? 它们肯定有不同, 如何更好的把这二种驱动的关系理顺?

     

                (不知是否描述清楚了, 请老师们指导)

    2008年8月11日 9:29
  • UP

    2008年8月12日 2:45
  •  

     创建一个都能访问的共享内存区域,这个工作有些麻烦,如何创建一个共享内存区域? 在上述讨论的虚拟串口方式下,有

     

        更方便的方法(数据交流的方法)吗?

    2008年8月12日 8:44
  • 只要保证有一个地方的数据可以同时被2个进程访问就OK啦,比如共享内存,注册表,实在不行还可以创建个文件,作为数据的中转站。
    2008年8月15日 6:51