引用: 引用 19 楼 xumercury 的回复:
引用 17 楼 gooogleman 的回复:
createfile在应用上啊,

自己写个串口打开的程序测测。一个个打开过去就知道了。。。不是有串口调试助手吗。。。如果串口被打开了就不能重复打开的。哎。。。


汗,我是一个客户拿出一个没有源码的串口程序,他要求这样做。

我也没有办法。

以前见过一些人用hook的啥办法,搞的。

我不会。
点赞  2009-12-30 16:57
CreateFile 会去呼叫到 XXX_Open, 并将 XXX_Init 的传回值当做第一个参数传给 XXX_Open.

所以, lz 还是要在 XXX_Init 中去判断该值并记录, 并在 XXX_Open 中取用.

Paul, Chao @ Techware
点赞  2009-12-30 17:00
引用: 引用 21 楼 paul_chao 的回复:
CreateFile 会去呼叫到 XXX_Open, 并将 XXX_Init 的传回值当做第一个参数传给 XXX_Open.

所以, lz 还是要在 XXX_Init 中去判断该值并记录, 并在 XXX_Open 中取用.

Paul, Chao @ Techware


哦,原来如此。
XXX_Open (Device Manager) This function opens a device for reading, writing, or both. An application indirectly invokes this function when it calls CreateFile to obtain a handle to a device.
This function is required to access the device with CreateFile.

PB帮助有说明了。
3Q
点赞  2009-12-30 17:19
下班回家了,明天来试试。呵呵。
点赞  2009-12-30 17:20
引用: 引用 21 楼 paul_chao 的回复:
CreateFile 会去呼叫到 XXX_Open, 并将 XXX_Init 的传回值当做第一个参数传给 XXX_Open.

所以, lz 还是要在 XXX_Init 中去判断该值并记录, 并在 XXX_Open 中取用.

Paul, Chao @ Techware


热闹, 学习了..
点赞  2009-12-30 17:37
我现在有个问题了。。你驱动层的可以用retailmsg体现。。。但是看你的描述。。其实是要在AP体现你现在用的是什么com。。难道要获取以后写个文本记录出来?
点赞  2009-12-30 17:41
device.dll(exe) 加载串口驱动的时候就 COM_Init(),先于CreateFile(),COM_Init()完后串口的Index已经记录了,CreateFile()会呼叫 COM_Open 来打开对应的串口。
LZ的意思是 PC机 类似串口监视精灵之类的东西, Hook截获串口数据,知道程序打开了哪个串口。。。
这个在CE上不知道能不能实现,不过仅仅为了知道打开了哪个串口而去hook它,似乎有点小题大作了。
点赞  2009-12-30 18:08
引用: 引用 21 楼 paul_chao 的回复:
CreateFile 会去呼叫到 XXX_Open, 并将 XXX_Init 的传回值当做第一个参数传给 XXX_Open.

所以, lz 还是要在 XXX_Init 中去判断该值并记录, 并在 XXX_Open 中取用.

Paul, Chao @ Techware

这个要学一下
点赞  2009-12-30 18:10
加载驱动的时候,注册表项是com1,com2自动变化的。你的驱动install里可以判断
点赞  2009-12-30 18:46
引用: 引用 28 楼 oncancel 的回复:
加载驱动的时候,注册表项是com1,com2自动变化的。你的驱动install里可以判断


我不要加载的时候判断的。

----------------------------------------------------------------------------
This function opens a device for reading, writing, or both. An application indirectly invokes this function when it calls the CreateFile function to open special device file names.

DWORD XXX_Open(
  DWORD hDeviceContext,
  DWORD AccessCode,
  DWORD ShareMode
);
Parameters
hDeviceContext
[in] Handle to the device context. The XXX_Init (Device Manager) function creates and returns this handle.
AccessCode
[in] Access code for the device. The access is a combination of read and write access from CreateFile.
ShareMode
[in] File share mode of the device. The share mode is a combination of read and write access sharing from CreateFile.
——我觉得paul.chao的方法还是不行,因为这个COM_Init 被加载了多次,他的返回值都是不同的。
所以有点难搞,我继续研究。也许我的表达没有让大家明白,呵呵。我继续努力ing
点赞  2009-12-31 09:14
CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

我想上面也是根据这个TEXT("COM1:")去寻找对应COM1的DLL的,但是这部分是如何实现的,所以我觉得我的问题估计解决不了了。准备放弃!
点赞  2009-12-31 10:02
引用: 引用 29 楼 gooogleman 的回复:
——我觉得paul.chao的方法还是不行,因为这个COM_Init 被加载了多次,他的返回值都是不同的。
所以有点难搞,我继续研究。也许我的表达没有让大家明白,呵呵。我继续努力ing


放心, 绝对可以的, 若是不行那也是你没弄清楚.

COM_Init 会去 LocalAlloc 一个 struct, 这个 struct 会去存该次载起来的 ioaddress, irq 等资讯, 所以 COM1 & COM2 虽然是执行同一个 dll, 但是其 struct 内存的 ioaddress 必定不同.

所以, LZ 在 COM_Open 中去比较其 ioaddress, 若是 COM1 的, 就去做一些您想做的事, 不就得了.

Paul, Chao @ Techware
点赞  2009-12-31 10:15
引用: 引用 31 楼 paul_chao 的回复:
引用 29 楼 gooogleman 的回复:
——我觉得paul.chao的方法还是不行,因为这个COM_Init 被加载了多次,他的返回值都是不同的。
所以有点难搞,我继续研究。也许我的表达没有让大家明白,呵呵。我继续努力ing


放心, 绝对可以的, 若是不行那也是你没弄清楚.

COM_Init 会去 LocalAlloc 一个 struct, 这个 struct 会去存该次载起来的 ioaddress, irq 等资讯, 所以 COM1 & COM2 虽然是执行同一个 dll, 但是其 struct 内存的 ioaddress 必定不同.

所以, LZ 在 COM_Open 中去比较其 ioaddress, 若是 COM1 的, 就去做一些您想做的事, 不就得了.

Paul, Chao @ Techware

学习了..
点赞  2009-12-31 12:34
引用: 引用 30 楼 gooogleman 的回复:
CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

我想上面也是根据这个TEXT("COM1:")去寻找对应COM1的DLL的,但是这部分是如何实现的,所以我觉得我的问题估计解决不了了。准备放弃!

AP层的程序你可以同步上去以后用spy抓一下看看有没有对COM口的相关描述,如果有的话还可以想办法抓一下窗体信息,如果没有就基本上没办法了。不过我还是没懂你是自己要做一个AP来配合客户AP还是从驱动层来解决这个问题?
点赞  2009-12-31 12:55
                if(pHWHead1->dwIOBase == 0x50000000)        // add by perry
                {
                        pHWHead->bINT = BIT_UART0;
                        pHWHead->bTxINT = INTSUB_TXD0;
                        pHWHead->bRxINT = INTSUB_RXD0;
                        pHWHead->bErrINT = INTSUB_ERR0;
                #if USEVIRTUAL
                        pHWHead->s2440SerReg = (S2440_UART_REG *)v_pUART0regs;
                        pRegBase = (PUCHAR)pHWHead->s2440SerReg;
                #else               
                        pRegBase = (PUCHAR)UART0_BASE;
                        pHWHead->s2440SerReg = (S2440_UART_REG *)pRegBase;
                #endif
                }
                else if(pHWHead1->dwIOBase == 0x50004000)
                {
                        pHWHead->bINT = BIT_UART1;
                        pHWHead->bTxINT = INTSUB_TXD1;
                        pHWHead->bRxINT = INTSUB_RXD1;
                        pHWHead->bErrINT = INTSUB_ERR1;
                #if USEVIRTUAL
                        pHWHead->s2440SerReg = (S2440_UART_REG *)v_pUART1regs;
                        pRegBase = (PUCHAR)pHWHead->s2440SerReg;
                #else               
                        pRegBase = (PUCHAR)UART1_BASE;
                        pHWHead->s2440SerReg = (S2440_UART_REG *)pRegBase;
                #endif
                       
                }
                else if(pHWHead1->dwIOBase == 0x50008000)
                {                       
                        pHWHead->bINT = BIT_UART2;
                        pHWHead->bTxINT = INTSUB_TXD2;
这不是判断打开的是COM1,还是其他COM,比如COM2/3
点赞  2009-12-31 13:34
引用: 引用 34 楼 lzj84 的回复:
if(pHWHead1->dwIOBase == 0x50000000) // add by perry
{
pHWHead->bINT = BIT_UART0;
pHWHead->bTxINT = INTSUB_TXD0;
pHWHead->bRxINT = INTSUB_RXD0;
pHWHead->bErrINT = INTSUB_ERR0;
#if USEVIRTUAL
pHWHead->s2440SerReg = (S2440_UART_REG *)v_pUART0regs;
pRegBase = (PUCHAR)pHWHead->s2440SerReg;
#else
pRegBase = (PUCHAR)UART0_BASE;
pHWHead->s2440SerReg = (S2440_UART_REG *)pRegBase;
#endif
}
else if(pHWHead1->dwIOBase == 0x50004000)
{
pHWHead->bINT = BIT_UART1;
pHWHead->bTxINT = INTSUB_TXD1;
pHWHead->bRxINT = INTSUB_RXD1;
pHWHead->bErrINT = INTSUB_ERR1;
#if USEVIRTUAL
pHWHead->s2440SerReg = (S2440_UART_REG *)v_pUART1regs;
pRegBase = (PUCHAR)pHWHead->s2440SerReg;
#else
pRegBase = (PUCHAR)UART1_BASE;
pHWHead->s2440SerReg = (S2440_UART_REG *)pRegBase;
#endif

}
else if(pHWHead1->dwIOBase == 0x50008000)
{
pHWHead->bINT = BIT_UART2;
pHWHead->bTxINT = INTSUB_TXD2;
这不是判断打开的是COM1,还是其他COM,比如COM2/3


这个是在加载阶段执行的,这个不满足我的要求,paul.chao的应该可以。

刚才解决一个产品BUG去了。
现在可以试试了呵呵。
点赞  2009-12-31 14:44
mark下。去年最后一天的帖子比较有意义。
点赞  2009-12-31 17:28
paul.chao的回帖
总能让人看得津津有味
嘎嘎
——————————————————————————
JOYZML(菜鸟朱铭雷)
点赞  2009-12-31 22:05
GM大侠
我只能友情支持你啦
顶上去
——————————————————————————
JOYZML(菜鸟朱铭雷)
点赞  2009-12-31 22:06
引用: 引用 2 楼 rzsheng 的回复:
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,


打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等

这个要看是在XP平台还是CE平台!
...
点赞  2010-1-2 09:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复