求C语言大神帮忙看一下这个虚拟串口程序有没有错,波特率9600晶振11.0592M

求C语言大神帮忙看一下这个虚拟串口程序有没有错,波特率9600晶振11.0592M,第1张

有错,再改改吧

串口接收、发送数据不是通过rxd和txd引脚,而是通过SBUF寄存器。接收数据从SBUF,发送数据是把数据放在SBUF上。

最好用中断来做,用延时函数有点浪费CPU。

对你的程序从表述来说是没有区别的。但是如果使用真实串口,一般是需要在物理串口上链接设备或者其他计算机来接收发送数据;而虚拟串口应该是成对出现的,有另外一个程序需要链接另外一个虚拟串口来进行接收发送数据。

在使用的时候确实是只需要在你的程序中修改串口号就可以实现。

特别需要注意的是如果是COM1到COM9的时候,使用的是_T("COMx"),而如果超过了10,则需要使用_T(\\\\\\COMxxx)方式。

网上搜索一番,主要有VSPM和VSPD,前者是在WIN7前使用稳定,后者在WIN7中使用稳定。我的电脑是WIN7_64的,所以选用了VSPD7。于是下了个VSPD71的安装包,安装完成后,利用软件界面就可以创建相应的虚拟COM口了。具体如何使用,可以参看这篇文章《虚拟串口VSPD的使用方法》。记住一点,VSPD的COM通信是成对的,一个用于接收数据,一个用于发送数据。

有了虚拟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 SystemCollectionsGeneric;

using SystemLinq;

using SystemText;

//Add

using SystemRuntimeInteropServices;

namespace AnserU2SimulatorModel

{

public class VSPD

{

//[DllImport("VSPDCTLdll", EntryPoint = "CreatePair", CallingConvention = CallingConventionStdCall, CharSet = CharSetAuto)]

//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("vspdctldll")]

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("vspdctldll")]

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("vspdctldll")]

public static extern bool DeleteAll();

[DllImport("vspdctldll")]

public static extern bool SetStrictBaudrateName(string comName, bool isStrictBaudrate);

[DllImport("vspdctldll")]

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("vspdctldll")]

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("vspdctldll")]

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("vspdctldll")]

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("vspdctldll")]

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("vspdctldll")]

public static extern bool SetAccessList(string comName, IntPtr bufferPtr, long bufferSize);

//[StructLayout(LayoutKindSequential,CharSet=CharSetAnsi,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 pair; name 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(UnmanagedTypeByValTStr, SizeConst = MAX_PORTNAME_LEN)]

string PortName;

}

}

}

首先我认为你知道什么是物理上的串口通信。然后所谓虚拟串口通信,就是在 *** 作系统中安装一个驱动软件,让 *** 作系统以为有一个物理上的串口能够 *** 作和通信,但是这个串口在物理上并不存在,这个虚拟串口的数据来源可以是来自网络上的,或者来自文件的,或者来自其他物理设备然后被软件转发到这个虚拟的串口上的。

以上就是关于求C语言大神帮忙看一下这个虚拟串口程序有没有错,波特率9600晶振11.0592M全部的内容,包括:求C语言大神帮忙看一下这个虚拟串口程序有没有错,波特率9600晶振11.0592M、虚拟串口和真实串口有什么区别吗如果我有一个VC程序可以收发真实串口的数据,是不是对虚拟串口也适用呢、如何应用.dll文件破解虚拟串口等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9328623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存