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

标签 c windows serial-port

我需要编写一个终端来与 COM 端口通信,我需要能够从 COM 端口以及同时从控制台发送命令。 (我想通过两个相互无线通信的传感器节点访问计算机,所以我仍然需要一种从节点向计算机发送内容的方法)

现在,我已经实现了一个非重叠串行通信,但我不确定如何实现“同时发送和接收”部分,我只有大约 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 端口、数据混洗等。可能需要多个 mutices。

如果不是公司属性(property),我会分享真实的、工作的生产代码:( 4 天似乎有点乐观,从我的项目日志来看,我花了几个月的时间开发一个工作的 COM 端口终端以达到生产质量级别。仅 COM 端口驱动程序就在 1k loc 左右,到处都是大量的 Win API 调用。

关于c - 实现 Com 端口终端的最简单方法。 ( Windows ,C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898085/

相关文章:

c - 你如何防止名称在 C 中发生冲突

c# - 有没有办法将事件处理程序附加到 C# 中正在运行的进程列表?

windows - 更改(标准)注册表项的类型(REG_SZ -> REG_EXPAND_SZ)一次

c - "Split"嵌入式系统上的应用程序

c - 使用结构体分配内存时出现段错误

c# - 获取我的 C# 应用程序的版本?

continuous-integration - 用PC切换几个灯泡最简单,最实用的方法是什么?

macos - 从 USB 合成器读取音频

delphi - 串行通信 (RTS) 和 Windows 7

c - 将数据写入.cof 文件