我正在使用的操作系统是Windows 7.我需要从宽带卡以特定间隔获取数据。这辆车将数据发送到两个独立的COM端口。 COM 3和COM 4.每个时间间隔我都需要查询两个串行端口上的信息行并将它们写入文件。
如何从两个COM端口读取?我必须使用线程吗?同时打开这两个是好的做法吗?
答案 0 :(得分:2)
您将从两个端口读取与从一个端口读取的方式相同的方式。由于两个端口都是独立的,因此没有问题。有一个线程可以从COM3读取,另一个线程可以从COM4读取。是的,同时从两个端口读取是绝对没问题的,没有任何问题。实际上,您甚至可以同时从更多端口读取而不仅仅是两个端口。
答案 1 :(得分:2)
看看这个tutorial。如果您打开了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
的反馈,我们进行了大量编辑答案 2 :(得分:0)
答案 3 :(得分:0)
您需要将每个端口作为文件打开。要使用的名称是“COM3:”和“COM4:”。您将需要设置事件掩码(SetCommEvent)并创建一个从每个端口读取的线程。您在线程中使用WaitCommEvent并检查该事件是否用于接收数据。如果是这样,您使用ReadFile读取数据。
答案 4 :(得分:0)
听起来您的设计是轮询端口以查找排队的数据。这是从这些端口读取数据的最简单方法。您可以使用一个线程一个接一个地轮询两个端口。
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
所有这一切都应该在一个线程中完成,这样当轮询线程休眠时,另一个主线程可以监视用户交互等。
是否在此线程或其他线程中进行数据处理取决于很多细节。
答案 5 :(得分:0)
在与COM端口通信时,应始终使用线程。
否则你的程序将成为另一个那些在等待COM端口时完全锁定主GUI线程的非常糟糕的业余程序。在我看来,没有什么比这些程序更能说“我是一个糟糕的程序员”。
在这种特殊情况下,使用多个线程听起来是一个明智的选择。