实现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调用全部结束
非常感谢你的快速回答,我只需要一些东西来传送几千字节的数据(图片)可能还有一些命令 我认为,我必须保持这个尽可能简单,并建立一个只接收数据的模式,我不能打任何东西(它应该是远程控制的) 它是作为暑期学校项目的一部分,我告诉我的顾问,这个建设一个终端是太多的工作,但是... 无论如何,非常感谢你,这证实我相信这是“顶一下”。 – 2012-08-10 10:09:26
@JayEfGee如果你的程序除了串行通信以外没有其他的工作,这个项目就容易多了,因为你可能没有线程或者重叠的I/O。 – Lundin 2012-08-10 10:42:29