COM端口上的设备模拟
Device simulation on COM port
我有一个向COM端口发送数据的设备。我想在它没有插入时模拟这个设备。我认为只需将数据发送到特定的COM端口即可实现:
int main() {
char *port = "\\.\COM40";
HANDLE hCom = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hCom==INVALID_HANDLE_VALUE) return 0;
DWORD writeBytes;
int buffer = 0xDEADBEAF;
BOOL success = WriteFile(hCom, &buffer, 4, &writeBytes, NULL);
FlushFileBuffers(hCom);
Sleep(1000);
HANDLE hCom2 = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hCom2==INVALID_HANDLE_VALUE) return 0; // Exit. GetLastError() == 5
DWORD readBytes;
success = ReadFile(hCom2, &buffer, 4, &readBytes, NULL);
CloseHandle(hCom);
CloseHandle(hCom2);
return 0;
}
不幸的是,这不起作用,第二个CreateFile()
将最后一个错误设置为ERROR_ACCESS_DENIED
。我错过了什么?
对于模拟,请安装虚拟COM端口驱动程序,如com0com。然后,您可以定义驱动程序中链接在一起的2个COM端口。不需要硬件。写入一个端口的任何内容在另一个端口上都是可读的。然后,您可以通过对CreateFile()的单独调用打开每个端口的句柄。
我自己也用这个技巧,效果很好。当我需要编写一个与设备通信的应用程序时,我通常会编写一个单独的模拟生成供主应用程序读取的数据并消耗主应用程序发送的数据的应用程序。主应用程序不知道它没有与真实设备通信,所以你不必更改主应用程序中的任何代码来支持模拟.
不能通过两次打开同一个端口在串行端口上发送东西。串行端口有两条不同的物理线,一条用于传输,另一条用于接收。由于端口上没有插入任何东西,这两条电线将无法连接,信号也不会自动从其中一条移动到另一条。
话虽如此,可以构建一个将TX和RX引脚连接在一起的加密狗,并接收您写入的相同字节。不过,这是一个物理组件,你不能只在软件中完成(好吧,除非你创建了一个"环回设备"COM端口驱动程序,它甚至不需要与硬件对话)。
快速谷歌搜索表明,物理加密狗和环回驱动程序都不难获得。
您可以使用两个不同的COM端口进行此测试。使用一个作为设备模拟器,另一个作为主机系统接收数据。这样就不必在同一个端口上CreateFile
两次。
串行端口不是IPC管道。如果你想要环回,要么必须在驱动程序中模拟,要么必须启用硬件环回模式。我认为驱动程序正在阻止设备上的两个句柄打开,尽管共享标志已传递给CreateFile
。(我从来没能让Windows上的两个串行应用程序都打开同一个串行端口。)
http://msdn.microsoft.com/en-us/library/ms810467.aspx
我在DCB
结构中看不到任何用于配置环回的标志,即使像16550 UARTS这样的芯片具有这种功能。
因此,可以通过零调制解调器电缆进行扩展环回。
- 如何使用Google Mock来模拟gettimeofday()
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- G锁定铸造到基础上会释放模拟行为
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 两个 COM 组件中 ENUM 的重复条目
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- COM 接口 c# 封送数组数组
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何模拟不同边数的骰子滚动?
- 在Java,C 或C#中模拟COM端口
- WMP COM 无法在后续用户模拟下运行
- COM端口上的设备模拟
- 在模拟线程中使用COM对象
- 在c++中模拟一个COM接口