实现Com端口终端的最简单方法。 (Windows,C)

问题描述:

我需要编写一个终端与COM端口进行通信,并且我需要能够同时从COM端口以及控制台发送命令。我想通过两个传感器节点访问计算机,这两个传感器节点之间以无线方式进行通信,所以我仍然需要一种方法将节点发送到计算机)实现Com端口终端的最简单方法。 (Windows,C)

现在,我已经实现了Non重叠的串行通信,但我不确定,如何实现“同时发送和接收” - 部分和我只有4天左右的时间来解决问题。这里没有太多的信息,所以我欢迎任何关于如何实现最快或最简单的方法的指针。

重叠的I/O通信并不是非常时间友好,据我所知。 是否有可能使用多线程(仅重叠)执行此操作? 我猜在这种情况下,我将不得不读取缓冲区每隔几毫秒,并为输入做一个自己的线程?

是否使用重叠I/O并不是真正的问题:重叠只是为您的程序释放一段时间。我编写了许多像这样的程序,结论总是使用一个线程来处理所有的COM例程。只要线程处于空闲状态,执行WaitForMultipleObjects(),该线程是否调用重叠方法或同步方法就不太相关。

我已经写了我最近的COM端口的方式是这样的(伪):

thread() 
{ 
    while not kill the thread event 
    { 
    WaitForMultipleObjects (open port, close port, kill the thread event) 

    if (open port) 
    { 
     send(); 
     receive(); 
     wait_for_send_and_receive(); 
    } 
    } 
} 

send() 
{ 
    take COM_port mutex 
    if(there is something to send) 
    { 
    copy send_data to local_data, protect this with mutex 
    WriteFileEx(COM_port, 
       local_data, 
       size, 
       some_overlapped_struct_stuff); 

    handle errors 

    } 
    release COM_port mutex 
} 

receive() 
{ 
    take COM_port mutex 

    ReadFileEx(COM_port, ...); 

    handle errors 

    release COM_port mutex 
} 

wait_for_send_and_receive() 
{ 
    WaitForMultipleObjects (open port, 
          close port, 
          kill the thread event, 
          send done event from send callback routine (overlapped I/O), 
          receive done event from receive callback routine (overlapped I/O) 
         ); 

} 

当然,这是一个相当过于简单化,因为你需要打开/关闭COM端口的各种功能,洗牌的数据等。可能需要几个重点。

如果不是公司财产,我会分享真实的工作生产代码:(4天似乎有点乐观,从我的项目日志来看,我花了几个月的时间开发出一个可用的COM端口终端质量水平,单独的COM端口驱动程序大约是1k loc,并且有很多Win API调用全部结束

+0

非常感谢你的快速回答,我只需要一些东西来传送几千字节的数据(图片)可能还有一些命令 我认为,我必须保持这个尽可能简单,并建立一个只接收数据的模式,我不能打任何东西(它应该是远程控制的) 它是作为暑期学校项目的一部分,我告诉我的顾问,这个建设一个终端是太多的工作,但是... 无论如何,非常感谢你,这证实我相信这是“顶一下”。 – 2012-08-10 10:09:26

+0

@JayEfGee如果你的程序除了串行通信以外没有其他的工作,这个项目就容易多了,因为你可能没有线程或者重叠的I/O。 – Lundin 2012-08-10 10:42:29