【问题标题】:Baud rate limits in software and serial communication with an external device与外部设备进行软件和串行通信的波特率限制
【发布时间】:2019-05-02 10:43:35
【问题描述】:

我正在使用作为虚拟 COM 端口运行的 USB 端口,以通过 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信。根据我用于与设备通信的软件,我面临波特率限制。 MATLAB(2018a)没有问题,因为它可以设置高波特率。另一方面,Visual Basic 6 面临可在软件中设置的波特率的限制。在解决方案方面,我已经研究了如何在 Visual Basic 6 中设置更高的波特率:https://www.mev.co.uk/pages/Support/VB-Baud.html

虚拟 COM 端口的驱动程序由 FTDI 制作,可在此处找到:http://www.ftdichip.com/Drivers/VCP.htm。在设备管理器中配置后,我正在与之通信的设备在设备管理器中的“端口(COM 和 LPT)”下显示为“USB 串行端口(COM4)”。

该设备需要 1000000 的波特率和 2 个停止位才能成功通信(如果您需要更多信息,请告诉我)。据我所知,软件中设置的通过串口通信的波特率必须为 1000000 才能匹配我正在使用的外部设备的波特率。我认为我的问题可能需要解释一下当 USB 端口充当虚拟 COM 端口时串行通信的工作原理,因为我担心如果可能的话,它与使用“真实”串行端口的通信不同。 FTDI 驱动程序似乎非常灵活,所以我不明白为什么 Visual Basic 不能利用这种灵活性。在 Visual Basic 6 中是否无法设置 1000000 的波特率?如果不可能,有什么方法可以克服这个限制吗?

波特率设置的 VB6 代码如下所示,其中“端口”是 COM 端口的地址,例如COM4、COM3:

MainForm.MSComm1.CommPort = Port
MainForm.MSComm1.Settings = "9600,N,8,1"

如果有人能帮助我了解串行通信在此设置中的工作原理,并且如果我能克服 Visual Basic 6 的限制,我将不胜感激。

【问题讨论】:

  • 您可以编辑您的问题以包含 VB6 代码的相关 sn-ps 吗?另外,波特率的限制是如何表现出来的——你是不是遇到了错误?
  • @DaveInCaz 感谢您的回复。我已经为你编辑了。没有错误。相反,设备上 1 到 100 之间的值保持不变。
  • 那么,如果你使用 "9600,N,8,1" 那么你可以发送/接收数据好吗?如果您使用 "1000000,N,8,1" 会发生什么不同?
  • 我认为您应该能够使用 Windows API(特别是SetCommState)和 FTDI 驱动程序在 Windows 上获得任意波特率。我想我自己以前也做过。但只是为了仔细检查,您应该阅读 FTDI 芯片的数据表以查看它支持的波特率。您忽略了告诉我们您正在使用什么 USB 转串口适配器或者它上面有什么 FTDI 芯片,所以我自己无法进行检查。
  • @DavidGrayson 我们没有使用 USB 转串口适配器。我们正在使用连接到 VCP 的 USB 电缆;这在 MATLAB 中工作得很好。文档说明波特率最高可达 3,000,000。

标签: matlab vb6 serial-port usb baud-rate


【解决方案1】:

您使用的似乎是MSComm32.ocx,而不是直接使用VB6。
您可以为此设置的最大速度为 256,000 bps。

How to send to the serial port by using Mscomm32.ocx

以下波特率值有效:110、300、600、1200、2400、4800、9600(默认)、14400、19200、28800、38400、56000、57600、115200、128000、256000。

如果你想要更快的速度,请直接使用 Win32 API 和下面的库等。

Serial port programming VB6 via Win32 API

Serial Port Communication

Serial port programming on Visual Basic with Windows API

grricks/vb6SerialAPI


或者,如果FTDI提供的库像上面的库一样是通过Declare Function定义的,可以使用吗?

D2XX Programmer's Guide

6.9 FT_W32_SetCommState
示例

FT_HANDLE ftHandle; // setup by FT_W32_CreateFile 
FTDCB ftDCB; 

if (FT_W32_GetCommState(ftHandle,&ftDCB)) {
    // FT_W32_GetCommState ok, device state is in ftDCB
    ftDCB.BaudRate = 921600; // Change the baud rate
    if (FT_W32_SetCommState(ftHandle,&ftDCB))
        ; // FT_W32_SetCommState ok 
    else
        ; // FT_W32_SetCommState failed
}
else
    ; // FT_W32_GetCommState failed

【讨论】:

  • 谢谢你,我会试一试的。 Win32 API可以设置的波特率是否有任何波特率限制?
  • @user3198014,也许这取决于您使用的硬件和设备驱动程序。请询问这些供应商。
  • @user3198014,我在许多不同的串行适配器上使用 FTDI 产品,我可以设置任意波特率。我们用于所有应用程序的 BR 是 3,000,000 bps,在 Matlab 和 VB 中一切正常。我们使用的是 VB.net,而不是 VB6。
  • @Hoki 谢谢你。我查看了文档(和其他回复),看起来可以通过直接与 FTDI 驱动程序通信来更改波特率。
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2011-12-08
相关资源
最近更新 更多