electrlife 发表于 2014-9-29 17:52:04

WIN32 API 串口支持双工吗?

最近在做一个WIN32上的串口程序,使用了WIN32 API来做,即是使用如下接口:

    fd = CreateFile(wString,
                  GENERIC_READ | GENERIC_WRITE,   /* Allow read and write */
                  0,                              /* Exclusive mode */
                  NULL,
                  OPEN_EXISTING,
                  0,                              /* Synchronous mode */
                  NULL);


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

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

        if (!WaitCommEvent(hSerial, &commEvent, NULL)) {
                return -1;
        }


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

gzrihui 发表于 2014-9-29 18:25:15

您制作的是读写器吗??

SkyGz 发表于 2014-9-29 19:25:02

建立 读线程,写线程...分开处理...

Scarlette 发表于 2014-9-29 19:32:33

你用的是non-overlapped方式,阻塞是正常的。要非阻塞的话,用overlapped方式。

electrlife 发表于 2014-9-29 20:31:23

如果采用overlapped方式,当一个线程在ReadFile时,另一个线程调用WriteFile时,不会阻塞,这点可以肯定,
那是不是意味着,此时的数据也在往外发,即可以同时有数据从串口输入输出!

electrlife 发表于 2014-9-29 20:34:09

gzrihui 发表于 2014-9-29 18:25
您制作的是读写器吗??

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

mobile02 发表于 2014-9-29 21:17:52

当然OK阿,不过如果你处理讯号速度要比通讯更快,因为我之前传送接收都使用 115200 导致电脑WinXP跑当了.

20062516 发表于 2014-9-29 21:35:58

多线程啊,建立一个监听(读)的线程

electrlife 发表于 2014-9-29 21:43:09

20062516 发表于 2014-9-29 21:35
多线程啊,建立一个监听(读)的线程

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

Scarlette 发表于 2014-9-29 22:43:26

呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多了解些的话,就会知道双工和阻塞是没有联系的。

electrlife 发表于 2014-9-30 08:58:49

Scarlette 发表于 2014-9-29 22:43
呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多 ...

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

hnac_ddh 发表于 2014-9-30 09:09:58

你这个阻塞跟串口的是不是双工没任何关系,
文件句柄是按照你创建的模式工作的,可以是阻塞,也可以是非阻塞的.

electrlife 发表于 2014-9-30 09:14:17

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

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

electrlife 发表于 2014-9-30 09:16:48

我现在有情况是当ReadFile线程没有数据到来时,其它调用WriteFile线程将无法将数据发送出去!

hnac_ddh 发表于 2014-9-30 09:18:31

好像不可以,会报错的,不允许那样的操作.

Scarlette 发表于 2014-9-30 17:04:32

都说了你让不要用WaitCommEvent呀,你不用overlapped模式还要用WaitCommEvent,当然是两条线程一起阻塞。你先翻下MSDN,看看WaitCommEvent的详细说明就知道了。

Scarlette 发表于 2014-9-30 17:07:00

说到Win32 I/O模型资料的话,直接看MSDN最准确了,我看多过好多网上的说法,都很扯淡

armstrong 发表于 2014-10-4 09:45:34

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

icoyool 发表于 2014-10-9 11:13:27

楼上说得很好,头像更精彩

yxylxj 发表于 2015-8-8 08:56:02

您好 ,您这个串口搞定了吗?最近也在做这个没有头绪 ,能不能把串口那部分 让我借鉴下,谢谢了

armstrong 发表于 2015-8-11 09:23:04

electrlife 发表于 2014-9-29 21:43
已经使用多线程了,一个线程监听(读),但当这个线程会一直占用这个hSerial,
导致其它线程使用WriteFil ...

用CreateFile创建两次,一次只读,另一次只写,这样获得两个句柄,分别使用试试。因为USB是可以这么干的。
页: [1]
查看完整版本: WIN32 API 串口支持双工吗?