对于设备间的串口通讯调试开发,在串口通讯程序已经写好的情况下,若可能涉及到通讯数据内容上的修改调试,则要重新搭建硬件环境,比较麻烦。虚拟机的硬件特性使得在一台机器上调试变成现实。
利用虚拟机串口设置的命名管道方式,可以组建虚拟机与虚拟机的串口通讯,这种方式下,程序不用任何改动,只是需要两个虚拟机,要多建一个计算机开发环境,并且也要有足够的内存和硬盘空间支持,仍不如意。还有一种情况是虚拟机与主机之间进行通调试,在这种情况下,只需要在主机程序中进行少量的改动,待调试完毕后即可恢复原来的语句,省却来回搬弄机器的烦恼。
步骤如下:
1、在虚拟机串口配置里设置命名管道方式,比如命名://./pipe/com_2,设置成服务器方式(虚拟机串口随虚拟机启动建立,设成服务器比较合理方便),终端设成一个程序模式。
2、在主机开发程序中的打开串口部分用命名管道代替,例如,你原程序如下:
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
则可以将此句注释掉,用以下语句代替:
char pipenamestr[30];
sprintf(pipenamestr,".//pipe//com_2") ;
if(WaitNamedPipe(pipenamestr,NMPWAIT_WAIT_FOREVER)==FALSE)
{
AfxMessageBox("建立管道失败!");
return FALSE;
}
hCom=CreateFile(pipenamestr,//COM1口
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
调试完毕后还原原来注释的语句,把这段注释重新编译即可,方便吧,试试!
另附:命名管道程序设计的注意事项
1.如果命名管道客户端已打开,函数将会强迫关闭管道,用DisconnectNamedPipe关闭的管道,其客户端还必须用CloseHandle来关闭最后的管道。
2. ReadFile和WriteFile的hFile句柄是由CreateFile及ConnectNamedPipe返回得到。
3.一个已被某客户端连接的管道句柄在被另一客户通过ConnectNamedPipe建立连接之前,服务端必须用DisconnectNamedPipe函数对已存在的连接进行强行拆离。服务端拆离管道会造成管道中数据的丢失,用FlushFileBuffers函数可以保证数据不被丢失。
4.命名管道服务端可以通过新创建的管道句柄或已被连接过其他客户的管道句柄来使用ConnectNamedPipe函数,但在连接新的客户端之前,服务端必须用函数DisconnectNamedPipe切断之前的客户句柄,否则ConnectNamedPipe 将会返回False。
5.阻塞模式,这种模式仅对“字节传输管道"操作有效,并且要求客户端与服务端不在同一机器上。如果用这种模式,则只有当函数通过网络向远端计算机管道缓冲器写数据成功时,才能有效返回。如果不用这种模式,系统会运行缺省方式以提高网络的工作效率。
6.用户必须用FILE_CREATE_PIPE_INSTANCE 来访问命名管道对象。新的命名管道建立后,来自安全参数的访问控制列表定义了访问该命名管道的权限。所有命名管道实例必须使用统一的管道传输方式、管道模式等参数。客户端未启动,管道服务端不能执行阻塞读操作,否则会发生空等的阻塞状态。当最后的命名管道实例的最后一个句柄被关闭时,就应该删除该命名管道。