实现Com Port Terminal的最简单方法。 (Windows,C)

时间:2012-08-10 08:36:42

标签: c windows serial-port

我需要编写一个与COM端口通信的终端,我需要能够同时从COM-Port和Console发送命令。 (我希望通过两个传感器节点访问计算机,这两个传感器节点是无线通信的,所以我仍然需要一种从节点向计算机发送内容的方法)

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

就我所见,重叠的I / O通信并不完全非常友好。 是否可以使用多线程(仅重叠)执行此操作? 我猜测在那种情况下,我必须每隔几毫秒读一次缓冲区并为输入创建一个自己的线程?

1 个答案:

答案 0 :(得分:2)

是否使用重叠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调用。