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是的串口是不是支持同时发送与接收,还是我使用的不正确! 您制作的是读写器吗?? 建立 读线程,写线程...分开处理... 你用的是non-overlapped方式,阻塞是正常的。要非阻塞的话,用overlapped方式。 如果采用overlapped方式,当一个线程在ReadFile时,另一个线程调用WriteFile时,不会阻塞,这点可以肯定,
那是不是意味着,此时的数据也在往外发,即可以同时有数据从串口输入输出! gzrihui 发表于 2014-9-29 18:25
您制作的是读写器吗??
呵呵,不是!简单的做一个数据收发,监听串口数据再通过网络发给其它设备,或是从网络得到数据再发给串口! 当然OK阿,不过如果你处理讯号速度要比通讯更快,因为我之前传送接收都使用 115200 导致电脑WinXP跑当了. 多线程啊,建立一个监听(读)的线程 20062516 发表于 2014-9-29 21:35
多线程啊,建立一个监听(读)的线程
已经使用多线程了,一个线程监听(读),但当这个线程会一直占用这个hSerial,
导致其它线程使用WriteFile(hSerial)时被阻塞!当然这是使用同步模式时,明天试下异步!
但按我的理解,即是同步,一个读一个写也是应该也是可以做到的啊,本来串口就是双工的啊! 呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多了解些的话,就会知道双工和阻塞是没有联系的。 Scarlette 发表于 2014-9-29 22:43
呃……你对Windows的I/O模型不了解,你这样WaitCommEvent肯定梗死在那里。另外如果你对Windows的I/O模型多 ...
以前没有做过PC端的程序,对WINDOW的IO确实不了解,这里有什么资料推荐下! 你这个阻塞跟串口的是不是双工没任何关系,
文件句柄是按照你创建的模式工作的,可以是阻塞,也可以是非阻塞的. hnac_ddh 发表于 2014-9-30 09:09
你这个阻塞跟串口的是不是双工没任何关系,
文件句柄是按照你创建的模式工作的,可以是阻塞,也可以是非阻塞的 ...
其实阻塞不阻塞不重要,只是我在ReadFile时没有完成我的WriteFile可不可以进行! 我现在有情况是当ReadFile线程没有数据到来时,其它调用WriteFile线程将无法将数据发送出去! 好像不可以,会报错的,不允许那样的操作. 都说了你让不要用WaitCommEvent呀,你不用overlapped模式还要用WaitCommEvent,当然是两条线程一起阻塞。你先翻下MSDN,看看WaitCommEvent的详细说明就知道了。 说到Win32 I/O模型资料的话,直接看MSDN最准确了,我看多过好多网上的说法,都很扯淡 楼主,给你一个很好的参考资料,那就是.net框架。我不是叫你去编写托管应用,而是用Red Gate's .NET Reflector看.net框架的源代码,以C#或C++形式呈现的;
你就看.net的Serial类如何实现,它就对Win32 API进行了很好的封装,用的是overlapped方式。除了串口,你还可以看到几乎一切.net对Win32的包装。
楼上说得很好,头像更精彩 您好 ,您这个串口搞定了吗?最近也在做这个没有头绪 ,能不能把串口那部分 让我借鉴下,谢谢了 electrlife 发表于 2014-9-29 21:43
已经使用多线程了,一个线程监听(读),但当这个线程会一直占用这个hSerial,
导致其它线程使用WriteFil ...
用CreateFile创建两次,一次只读,另一次只写,这样获得两个句柄,分别使用试试。因为USB是可以这么干的。
页:
[1]