有了虚拟COM口后,就是写一个DEMO进行测试。具体可以参看这篇文件章《win7系统下用vspd软件进行串口编程实例》。
当虚拟COM口可以实现通讯之后,就想着我们的程序是依赖于这个VSPD安装包的,那如果我们是否可以不依赖呢?有两种方案:
方案一:自己写一个虚拟COM的驱动,然后里面实现。有兴趣的可以参看该文《开发虚拟串口驱动程序》。
方案二:VSPD安装包是一个安装程序,为了实现虚拟COM,必然会有相应的驱动。如果我们能够找到这个驱动并安装,之后用相应的接口来调用,或是可行。
方案一想了,但自认还没有这个能耐,于是果断放弃,退而选方案二。那么方案二要实现,首先要解决的问题是接口的调用,因为驱动程序即使不能做到自己安装,但还是可以通过VSPD安装包的安装来解决,那么VSPD中有没有提供这样的接口呢?
查看VSPD的用户手册(User Manual),里面果然有相应的接口(在Using serial port driver in your program下的Functions中),于是有C#写了相应的调用,下面是代码。
using System
using System.Collections.Generic
using System.Linq
using System.Text
//Add
using System.Runtime.InteropServices
namespace Anser.U2Simulator.Model
{
public class VSPD
{
//[DllImport("VSPDCTL.dll", EntryPoint = "CreatePair", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
//public static extern bool CreatePair(byte[] comName1, byte[] comName2)
/// <summary>
/// CreatePair creates a pair of virtual serial ports with given names.
/// It accepts two null-terminated strings determining which ports should be created as input.
/// For example, "COM5" and "COM6".
/// </summary>
/// <param name="comName1">A null-terminated string that defines the name of the first port in a pair</param>
/// <param name="comName2">A null-terminated string that defines the name of the second port in a pair</param>
/// <returns>CreatePair returns TRUE if virtual serial pair was created successfully and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool CreatePair(string comName1, string comName2)
/// <summary>
/// DeletePair deletes a pair of virtual serial ports with a given name.
/// As input it takes name of any virtual serial port in a pair.
/// For example, if you want to remove pair named "COM5"-"COM6",
/// you can pass either "COM5" or "COM6" as argument to DeletePair function.
/// </summary>
/// <param name="comName"> A null-terminated string that defines one of the two port names in a pair you want to delete </param>
/// <returns>DeletePair returns TRUE if virtual serial pair was successfully deleted and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool DeletePair(string comName)
/// <summary>
/// DeleteAll deletes all virtual serial ports currently present in a system. It accepts no arguments at input.
/// </summary>
/// <returns>DeleteAll returns TRUE if all virtual serial pairs were successfully deleted and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool DeleteAll()
[DllImport("vspdctl.dll")]
public static extern bool SetStrictBaudrateName(string comName, bool isStrictBaudrate)
[DllImport("vspdctl.dll")]
public static extern bool SetStrictBaudrateHandle(IntPtr handle, bool isStrictBaudrate)
/// <summary>
/// SetStrictBaudrate enables/disables full baudrate emulation,
/// needs the name of one of the paired virtual ports and boolean parameter
/// that defines if strict baudrate emulation should be enabled or not.
/// </summary>
/// <param name="comName">A null-terminated string that defines one of the two port names in a pair </param>
/// <param name="isStrictBaudrate">A boolean variable which should be TRUE
/// if you want to enable strict baudrate emulation and FALSE if you want to disable it</param>
/// <returns>SetStrictBaudrate returns TRUE if strict baudrate emulation was successfully enabled and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool SetStrictBaudrate(string comName, bool isStrictBaudrate)
/// <summary>
/// SetBreak enables/disables line break emulation in virtual serial ports.
/// </summary>
/// <param name="comName">A null-terminated string that defines one of the two port names in a pair</param>
/// <param name="isBreak">A boolean variable should be TRUE if you want to emulate connection break and FALSE if you want to re-establish it </param>
/// <returns>SetBreak returns TRUE if line break emulation was successfully enabled and FALSE otherwise.</returns>
[DllImport("vspdctl.dll")]
public static extern bool SetBreak(string comName, bool isBreak)
/// <summary>
/// QueryBus: QueryBus sends request to get complete information from the virtual serial bus installed by VSPD.
/// </summary>
/// <param name="inBufferPtr">A pointer to VSBUS_QUERY or VSBUS_QUERY_EX structures.
/// If you want to get information about all current virtual serial ports
/// then use VSBUS_QUERY structure
/// and if you want to get extended information
/// about single virtual serial pair then use VSBUS_QUERY_EX structure.</param>
/// <param name="inBufferSize"></param>
/// <param name="outBufferPtr"></param>
/// <param name="outBufferSize">A pointer to either PORT_INFORMATION or PORT_INFORMATION_EX structures list.
/// If you have used VSBUS_QUERY than you should get PORT_INFORMATION list
/// and if you used VSBUS_QUERY_EX then you should get PORT_INFORMATION_EX.</param>
/// <returns></returns>
[DllImport("vspdctl.dll")]
public static extern bool QueryBus(IntPtr inBufferPtr, long inBufferSize, IntPtr outBufferPtr, long outBufferSize)
/// <summary>
/// SetWiring sets custom signal lines wiring (pinout).
/// </summary>
/// <param name="comName">A null-terminated string that defines one of the two port names in a pair </param>
/// <param name="bufferPtr">A pointer to VSERIAL_WIRING structure </param>
/// <param name="bufferSize">Size of Buffer parameter in bytes </param>
/// <returns>SetWiring returns TRUE if signal lines wiring was created successfully and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool SetWiring(string comName, IntPtr bufferPtr, long bufferSize)
/// <summary>
/// SetAccessList restricts access to created virtual serial ports for various applications.
/// </summary>
/// <param name="comName">A null-terminated string that defines one of the two port names in a pair </param>
/// <param name="bufferPtr">A pointer to PROGRAM_ACCESS array </param>
/// <param name="bufferSize">Size of Buffer parameter in bytes </param>
/// <returns>SetAccessList returns TRUE if port access list was created successfully and FALSE otherwise</returns>
[DllImport("vspdctl.dll")]
public static extern bool SetAccessList(string comName, IntPtr bufferPtr, long bufferSize)
//[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
public struct _VSBUS_QUERY
{
/// <summary>
/// VSBUS_QUERY structure size
/// </summary>
ulong Size
/// <summary>
/// Has QUERYTYPE_PORTS = 1 value. Can be extended in the future.
/// </summary>
ulong QueryType
}
private const int MAX_PORTNAME_LEN = 6
public struct _VSBUS_QUERY_EX
{
/// <summary>
/// VSBUS_QUERY_EX structure size
/// </summary>
ulong Size
/// <summary>
/// 1:query all virtual ports.
/// 2:query particular virtual pair
/// 3:query particular virtual pairname of the application, which created the port, is returned.
/// </summary>
ulong QueryType
/// <summary>
/// Unicode name of any port in the pair you want to delete.
/// For instance, if "COM6-COM7" virtual serial ports pair was created,
/// then to remove it, PortName's value should be COM6 or COM7.
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PORTNAME_LEN)]
string PortName
}
}
}
用VSPM吧,UDP模式,新建两个串口,接收和发送IP地址都为本机IP,不过接收端口和发送端口的设置上,两个虚拟串口设置成相反的。比如,你将COM2的接收端口设置成7102,发送端口设置成7101,那么COM3的接收端口设置成7101,发送端口设置成7102.就可以了~~欢迎分享,转载请注明来源:内存溢出
评论列表(0条)