13737|28

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince虚拟串口的实现?wince下将一个真实物理串口虚拟成两个串口来用?大家帮帮忙! [复制链接]

各位大虾帮帮忙!
   小弟最近在搞一块板,由于我的真实物理串口不够用,在wince5.0下通过GPIO来模拟串口的想法又不可行(之前发过一个帖:wince下通过GPIO来模拟

串口,最终是不行),因此我想在一个真实串口上实现两个虚拟串口,即这两个虚拟串口对应着同一个物理串口,而对应用程序用户层来说就像两个真实

的串口,我给用户层提供不同的串口流驱动接口,比如:COM3,COM4.这样用户层调用不同的串口接口实现不同的通信。但是终端产品跟我的设备在物理串

口上通信时会有不同协议的数据发送过来,要求我的设备这边接收到不同协议的数据会分别给到不同的虚拟串口,比如收到0xFF开头的协议数据时要求给

到COM3, 0xEE开头的协议数据要求给到COM4,发送的也一样数据先封装再发送。请问我该怎么实现?有什么好的方案,或者好的思路,大家不妨帮忙提一

下阿!小弟在此谢过了!

最新回复

Paul, Chao  写的很详细啊,万分感谢   详情 回复 发表于 2010-6-7 17:31
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
拿微软的MDD层来改一下就行了,PDD层去掉
 
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
哈, 軟體有無限的可能, 但硬體限制就多了.

硬體上, 一個序列埠只能接一個設備 (理論上 TX 只要 fan out 夠, 就不受限制, 但 RX 就不行了), 所以這個要先能解決.

軟體上, 可先用一支 driver, 透過 CreateFile(L"COM1:",..) 的方式, 再用 Point to Point Message Queues 的架構來實現
  RX: 收到 package 後, 判斷是哪一個, 再 write 到對應的 msgQueue.
  TX: 看是哪一個 msgQueue 送來的, 再加包 header 成一個 package 送出去

另外再寫一個 COM_Init.... 的 driver, 透過 registry 掛成 COM3: & COM4:, 比較麻煩的是 COM_IOControl, 有些 WIN32 API 要對應的函式 (ex:WaitForCommEvent...) 必須在這裡實現.

類似的程式我曾在 2 年前寫過, 是 1 對 1 的 (從 COM port 收到 AGPS 的信號, 再將其轉成 GPS-NEMA 的格式給導航軟體叫用), 但原理並無不同, 故應是可行的.
  
Paul, Chao @ Techware
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
二楼的abclansheng,你好,感谢您的答复!
  能否将MDD的修改思路讲解一下?还有为什么要去掉PDD层,我底层最终是一个真实的物理串口呀,我肯定要对他进行操作的。因此我觉得PDD层不应该去掉的。

三楼的paul_chao,你好!
 感谢你的答复!从你的思路上看应该是在应用层实现的,通过对物理串口上接收到的数据的判断,然后再发往不同的msgQueue。如何将com3,com4将对应的msgQueue相联系起来?是不是还要虚拟串口对?那要在底层是实现的话应该怎么去做?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 abclansheng 的回复:
拿微软的MDD层来改一下就行了,PDD层去掉


这方法不错。

哈哈,楼主,这个玩意你照着abclansheng 说的做。

把虚拟串口的PDD部分删除掉。改为你说的OXFF等什么数据来接收,这样可以做到了

还有MDD的一些和硬件相连的代码也要修改一下,避免初始化失败。

我没有做过,但是我觉得这样是可行的。

就是不知道这样是否算虚拟串口了。哈哈。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 paul_chao 的回复:
哈, 軟體有無限的可能, 但硬體限制就多了.

硬體上, 一個序列埠只能接一個設備 (理論上 TX 只要 fan out 夠, 就不受限制, 但 RX 就不行了), 所以這個要先能解決.

軟體上, 可先用一支 driver, 透過 CreateFile(L"COM1:",..) 的方式, 再用 Point to Point Message Queues 的架構來實現
  RX: 收到 package 後, 判斷是哪一個, 再 write 到對應的 msgQueue.
  TX: 看是哪一個 msgQueue 送來的, 再加包 header 成一個 pack…


paul_chao 太牛了,学习了。

怎么是繁体字呢?莫非不是大陆人士?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果在mdd层修改的话,比如我的设备从外部接收到数据,那么串口会把接收到的数据通过移位寄存器移到硬体FIFO中,硬体FIFO又把数据送到软体环行FIFO中.当我们调用COM_Read()时,程序会把软体环行FIFO中的数据直接copy到用户传进去的buffer中,这样就完成了数据的接收.那么数据在什么时候判断,又在什么时候分离呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
1. Driver 算是應用層嗎?? 不過不改原來 serial port 的 driver, 而是架在它上面增加自己的功能, 這樣看也算是應用層的...

2. 寫 2 支 driver, registry 略如下
2.1 呼叫 CreateFile(L"COM1:",..), 並負責 protocol layer 及實際 COM port r/w 的處理
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serialx]
   "Dll"="SerialDispatch.Dll"
   "Order"=dword:80  ;; must be larger than Serial.Dll
   "Priority256"=dword:67
   "Flags"=8  ; DEVFLAGS_NAKEDENTRIES, Entry points don't have Prefix prepended

2.2 創建出 COM port 應有的介面 (參考 Microsoft serial port MDD code), 並與 SerialDispatch.Dll 透過 Point-to-Point Message Queue 做溝通
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial3]
   "Prefix"="COM"
   "Dll"="VirtualSerial.Dll"
   "Order"=dword:81 ;; must be larger than SerialDispatch.Dll
   "Priority256"=dword:67
   "Index"=dword:3
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4]
   "Prefix"="COM"
   "Dll"="VirtualSerial.Dll"
   "Order"=dword:81 ;; must be larger than SerialDispatch.Dll
   "Priority256"=dword:67
   "Index"=dword:4

最後, 還是那句老話, 你確定硬體可以接??? 外部設備收送進來的 protocol 也可以修改????

Paul, Chao @ Techware
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

9
 
没有人再帮我顶一下吗!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 dimhp 的回复:
没有人再帮我顶一下吗!


paul_chao 说的很好啊。让人开眼界。
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

11
 
多谢 Paul, Chao @ Techware,我确定硬体可以接,外部設備收送進來的 protocol 也可以修改的。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
不好意思,刚才我发的时候还没看到 Paul, Chao @ Techware,所以....
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

13
 
你的串口驱动保留,比如是COM1,依然可以打开这个COM1
然后你写个虚拟串口驱动,虚拟成COM2,COM3,这个虚拟串口驱动不是需要操作实际的物理串口的,所以没必要用到PDD
只需在MDD层里实现COM2和COM3的分流,在虚拟串口驱动里实现对COM1的打开,读写等操作
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

14
 
你把串口驱动的MDD层看一遍,看明白整个流程架构,然后你就应该会写了
以前我写过,用起来感觉性能还行吧
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
Paul, Chao ,非常感谢,你讲解的很好,讲得很详细! 不过我还几个地方不太明白:请原谅!
    1. Serial.Dll是不是真实串口的驱动?
     2. SerialDispatch.Dll是負責 protocol layer 及實際 COM port r/w 的處理的驱动
     3. VirtualSerial.Dll 与 SerialDispatch.Dll通过Point-to-Point Message Queue 如何做沟通? 这一块我不太了解!
比如SerialDispatch.Dll,中RX: 收到 package 後, 判斷是哪一個, 再 write 到對應的 msgQueue.而应用层通过CreateFile
(L"COM3:",..),或者CreateFile(L"COM4:",..),COM_Read(...)从msgQueue读出数据对吗?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

16
 
引用 13 楼 abclansheng 的回复:
你把串口驱动的MDD层看一遍,看明白整个流程架构,然后你就应该会写了
以前我写过,用起来感觉性能还行吧
[/quote]
[quote]引用 12 楼 abclansheng 的回复:
你的串口驱动保留,比如是COM1,依然可以打开这个COM1
然后你写个虚拟串口驱动,虚拟成COM2,COM3,这个虚拟串口驱动不是需要操作实际的物理串口的,所以没必要用到PDD
只需在MDD层里实现COM2和COM3的分流,在虚拟串口驱动里实现对COM1的打开,读写等操作


很有启发,非常感谢!之前也研究过微软的MDD层,可是没研究透。现在要仔细研究研究!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 dimhp 的回复:
Paul, Chao ,非常感谢,你讲解的很好,讲得很详细! 不过我还几个地方不太明白:请原谅!
1. Serial.Dll是不是真实串口的驱动?
YES
2. SerialDispatch.Dll是負責 protocol layer 及實際 COM port r/w 的處理的驱动
YES, 透過 filesystem & win32api 與 Serial.Dll 做溝通, 所以原來的 Serial.Dll 的 Registry 不要修改, 讓它也能被載起來
3. VirtualSerial.Dll 与 SerialDispatch.Dll通过Point-to-Point Message Queue 如何做沟通? 这一块我不太了解!
比如SerialDispatch.Dll,中RX: 收到 package 後, 判斷是哪一個, 再 write 到對應的 msgQueue.而应用…
YES, 若有任何問題, 請看一下 online help 關於 Point-to-Point Message Queue 的用法
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
mark
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

19
 
Paul, Chao
    非常感谢您的帮助!目前我已经在SerialDispatch.Dll实现了协议解释那部分了,并且建立了两个MsgQueue,并判断接收到不同的帧则调用不同的WritMsgQueue()写进不同的MsgQuueue里了,我同时在SerialDispatch.DLl,也实现了虚拟串口的流式接口,创建了相应的MsgQueue。可是我目前没法实现在COM_Read()中如何去读相应的消息队列.比如说虚拟口COM3要读数据时,用WaitForSingleObject等待MsgQueue1有数据,然后调用ReadMsgQueue从MssgQueue1中读取消息,如果是COM4那么对应MsgQueue2. 那么我怎么来判断是哪个虚拟口要读书据呢?
  
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

20
 
1. MsgQueue 是可以有名字的, 故在 COM3: 中, 可用 CreateMsgQueue(L"Serial3", &msgOptions), 在 COM4: 中, 可用 CreateMsgQueue(L"Serial4", &msgOptions), 而在 SerialDispatch.Dll 中也是用相同的名字 CreateMsgQueue 這兩個, 再分別根據 packet header 用 WriteMsgQueue 來送給這兩個 MsgQueue.

2. 若是不清楚如何分辨 COM3 or COM4, 則參考另一篇 http://topic.eeworld.net/u/20090327/17/0ea45b07-d8bc-4630-984f-2eded21785fc.html, 哎, 兩篇搞在一起了.

Paul, Chao @ Techware
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表