Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现Com端口终端的最简单方法。(Windows,C)_C_Windows_Serial Port - Fatal编程技术网

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

实现Com端口终端的最简单方法。(Windows,C),c,windows,serial-port,C,Windows,Serial Port,我需要编写一个终端来与COM端口通信,并且我需要能够从COM端口以及同时从控制台发送命令。 (我想通过两个相互无线通信的传感器节点访问计算机,因此我仍然需要一种从节点向计算机发送信息的方法) 现在,我已经实现了非重叠串行通信,但我不确定如何实现“同时发送和接收”部分,我只有大约4天的时间来解决这个问题。这里并没有太多的信息,所以我欢迎任何关于如何实现这种最快或最简单的方法的建议 就我所见,重叠I/O通信对时间不太友好。 是否可以使用多线程(仅重叠)执行此操作? 我猜在这种情况下,我必须每隔几毫秒

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

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

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

是否使用重叠I/O并不是真正的问题:重叠只是为程序腾出一些时间。我写过很多这样的程序,结论总是使用一个线程来处理所有COM例程。只要线程空闲地执行WaitForMultipleObjects(),该线程调用重叠方法还是同步方法就不那么重要了

我最近编写COM终端的方式如下(伪):

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


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

非常感谢您的快速回答。我只需要一些东西来传输几KB的数据(图片)也许还有一些命令。我想,我必须尽可能地简化这个过程,并以一种只接收数据而我不能输入任何东西的模式进行构建(它应该是远程控制的)这是一个短期暑期学校项目的一部分,我告诉我的导师,建造一个航站楼太多了,但无论如何,非常感谢,这证实了我的观点,这是“一点”如果你的程序除了串行通信没有做很多其他的事情,那么这个项目就容易多了,因为你可以不用线程或者重叠的I/O。
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)
                         );

}