搜索
bottom↓
回复: 20

WIN32 API 串口支持双工吗?

[复制链接]

出0入0汤圆

发表于 2014-9-29 17:52:04 | 显示全部楼层 |阅读模式
最近在做一个WIN32上的串口程序,使用了WIN32 API来做,即是使用如下接口:

  1.     fd = CreateFile(wString,
  2.                     GENERIC_READ | GENERIC_WRITE,   /* Allow read and write */
  3.                     0,                              /* Exclusive mode */
  4.                     NULL,
  5.                     OPEN_EXISTING,
  6.                     0,                              /* Synchronous mode */
  7.                     NULL);
复制代码


现发现当调用ReadFile时,如果执行WriteFile的线程将初阻塞,
使用下面的方式也是一样。

  1.           if (!SetCommMask(hSerial, EV_RXCHAR)) {
  2.                 return -1;  
  3.         }

  4.         if (!WaitCommEvent(hSerial, &commEvent, NULL)) {
  5.                 return -1;
  6.         }
复制代码


想请熟悉WIN32串口的大侠们说说WIN32是的串口是不是支持同时发送与接收,还是我使用的不正确!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-9-29 18:25:15 | 显示全部楼层
您制作的是读写器吗??

出0入70汤圆

发表于 2014-9-29 19:25:02 | 显示全部楼层
建立 读线程,  写线程...分开处理...

出0入0汤圆

发表于 2014-9-29 19:32:33 | 显示全部楼层
你用的是non-overlapped方式,阻塞是正常的。要非阻塞的话,用overlapped方式。

出0入0汤圆

 楼主| 发表于 2014-9-29 20:31:23 | 显示全部楼层
如果采用overlapped方式,当一个线程在ReadFile时,另一个线程调用WriteFile时,不会阻塞,这点可以肯定,
那是不是意味着,此时的数据也在往外发,即可以同时有数据从串口输入输出!

出0入0汤圆

 楼主| 发表于 2014-9-29 20:34:09 | 显示全部楼层
gzrihui 发表于 2014-9-29 18:25
您制作的是读写器吗??

呵呵,不是!简单的做一个数据收发,监听串口数据再通过网络发给其它设备,或是从网络得到数据再发给串口!

出0入0汤圆

发表于 2014-9-29 21:17:52 | 显示全部楼层
当然OK阿,不过如果你处理讯号速度要比通讯更快,因为我之前传送接收都使用 115200 导致电脑WinXP跑当了.

出0入0汤圆

发表于 2014-9-29 21:35:58 | 显示全部楼层
多线程啊,建立一个监听(读)的线程

出0入0汤圆

 楼主| 发表于 2014-9-29 21:43:09 | 显示全部楼层
20062516 发表于 2014-9-29 21:35
多线程啊,建立一个监听(读)的线程

已经使用多线程了,一个线程监听(读),但当这个线程会一直占用这个hSerial,
导致其它线程使用WriteFile(hSerial)时被阻塞!当然这是使用同步模式时,明天试下异步!
但按我的理解,即是同步,一个读一个写也是应该也是可以做到的啊,本来串口就是双工的啊!

出0入0汤圆

发表于 2014-9-29 22:43:26 | 显示全部楼层
呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多了解些的话,就会知道双工和阻塞是没有联系的。

出0入0汤圆

 楼主| 发表于 2014-9-30 08:58:49 | 显示全部楼层
Scarlette 发表于 2014-9-29 22:43
呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多 ...

以前没有做过PC端的程序,对WINDOW的IO确实不了解,这里有什么资料推荐下!

出0入0汤圆

发表于 2014-9-30 09:09:58 | 显示全部楼层
你这个阻塞跟串口的是不是双工没任何关系,
文件句柄是按照你创建的模式工作的,可以是阻塞,也可以是非阻塞的.

出0入0汤圆

 楼主| 发表于 2014-9-30 09:14:17 | 显示全部楼层
hnac_ddh 发表于 2014-9-30 09:09
你这个阻塞跟串口的是不是双工没任何关系,
文件句柄是按照你创建的模式工作的,可以是阻塞,也可以是非阻塞的 ...

其实阻塞不阻塞不重要,只是我在ReadFile时没有完成我的WriteFile可不可以进行!

出0入0汤圆

 楼主| 发表于 2014-9-30 09:16:48 | 显示全部楼层
我现在有情况是当ReadFile线程没有数据到来时,其它调用WriteFile线程将无法将数据发送出去!

出0入0汤圆

发表于 2014-9-30 09:18:31 | 显示全部楼层
好像不可以,会报错的,不允许那样的操作.

出0入0汤圆

发表于 2014-9-30 17:04:32 | 显示全部楼层
都说了你让不要用WaitCommEvent呀,你不用overlapped模式还要用WaitCommEvent,当然是两条线程一起阻塞。你先翻下MSDN,看看WaitCommEvent的详细说明就知道了。

出0入0汤圆

发表于 2014-9-30 17:07:00 | 显示全部楼层
说到Win32 I/O模型资料的话,直接看MSDN最准确了,我看多过好多网上的说法,都很扯淡

出870入263汤圆

发表于 2014-10-4 09:45:34 | 显示全部楼层
楼主,给你一个很好的参考资料,那就是.net框架。我不是叫你去编写托管应用,而是用Red Gate's .NET Reflector看.net框架的源代码,以C#或C++形式呈现的;
你就看.net的Serial类如何实现,它就对Win32 API进行了很好的封装,用的是overlapped方式。除了串口,你还可以看到几乎一切.net对Win32的包装。

出5入8汤圆

发表于 2014-10-9 11:13:27 | 显示全部楼层
楼上说得很好,头像更精彩

出0入0汤圆

发表于 2015-8-8 08:56:02 | 显示全部楼层
您好 ,您这个串口搞定了吗?最近也在做这个  没有头绪 ,能不能把串口那部分 让我借鉴下,谢谢了

出870入263汤圆

发表于 2015-8-11 09:23:04 | 显示全部楼层
electrlife 发表于 2014-9-29 21:43
已经使用多线程了,一个线程监听(读),但当这个线程会一直占用这个hSerial,
导致其它线程使用WriteFil ...

用CreateFile创建两次,一次只读,另一次只写,这样获得两个句柄,分别使用试试。因为USB是可以这么干的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 21:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表