我正在使用的操作系统是Windows 7.我需要以一定的时间间隔从宽带卡上获取数据。 这辆车发送数据到两个单独的COM端口。 COM 3和COM 4.每隔一段时间我需要查询两个串口上的信息行并将其写入文件。
我如何从两个COM端口读取? 我必须使用线程吗? 是否同时打开两者的好习惯?
看看这个教程 。 如果打开COM端口,然后在重叠的IO中调用WaitComEvent ,则会在OVERLAPPED中获得可用于WaitForMultipleObjects的句柄 。
你应该可以在一个简单的线程中完成,总体概述如下:
HANDLE hSerial3; hSerial3 = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //... WaitCommEvent(hSerial3, &dwEventMask, &ov3); WaitCommEvent(hSerial4, &dwEventMask, &ov4); //pack ov.hEvent into arHandler WaitForMultipleObjects (3,arHandles,FALSE,INFINITE);
由于来自@JimRhodes的反馈而大量编辑
您将从两个端口读取与您从一个端口读取相同的方式。 由于两个港口都是独立的,所以没有问题。 有一个线程从COM3读取,另一个线程从COM4读取。 是的,从两个端口同时读取是绝对没问题的。 事实上,你甚至可以同时阅读更多的端口,而不只是两个。
你可以查看这个网站给出的例子http://www.fogma.co.uk/foggylog/archive/140.html
您需要打开每个端口作为文件。 要使用的名称将是“COM3:”和“COM4:”。 您将需要设置一个事件掩码(SetCommEvent)并创建一个从每个端口读取的线程。 您在线程中使用WaitCommEvent并检查事件是否用于接收数据。 如果是的话,你使用ReadFile来读取数据。
这听起来像你的设计是轮询端口排队的数据。 这是从这些端口读取数据的最简单的方法。 您可以使用一个线程轮询两个端口,一个接一个。
Open COM3 Open COM4 LOOP Check for data on COM3. If data, read and process Check for data on COM4. If data, read and process Sleep for remainder of polling interval repeat from LOOP
所有这些应该可能在一个线程中完成,以便另一个主线程可以在轮询线程休眠的同时监视用户交互等。
是否在这个线程或在另一个数据处理取决于…很多的细节。
与COM端口通信时,应始终使用线程。
否则,你的程序将是那些令人难以置信的业余软件中的另一个,在等待COM端口时完全锁定主GUI线程。 在我看来,没有什么比这样的程序尖叫“我是一个糟糕的程序员”。
在这个特殊情况下,使用多个线程听起来像是一个明智的选择。