2
votes

I am using a USB port port operating as a virtual COM port to achieve serial communication with an external device using MATLAB or Visual Basic 6. I am facing baud rate limitations depending on the software I use to communicate with the device. MATLAB (2018a) has no problems because it can set high baud rates. Visual Basic 6 on the other hand faces limitations on the baud rates that can be set in the software. In terms of solutions, I have looked into this to set a higher baud rate in Visual Basic 6: https://www.mev.co.uk/pages/Support/VB-Baud.html

The drivers for the virtual COM port are made by FTDI and can be found here: http://www.ftdichip.com/Drivers/VCP.htm . After configuration in the Device Manger, the device I am communicating with appears under 'Ports (COM & LPT)' as 'USB Serial Port (COM4)' in the Device Manager.

The device requires a baud rate of 1000000 and 2 stop bits for successful communication (if you need any more information, please let me know). As far as I am aware, the baud rate set in the software to communicate via the serial port has to be 1000000 to match that of the external device I am using. I think my problem might require a bit an explanation of how serial communication works when a USB port is acting as a virtual COM port because I worry that it differs from communication using a 'real' serial port, if possible. The FTDI driver appears to be very flexible so I do not understand why Visual Basic cannot tap into this flexibility. Is it impossible to set a baud rate of 1000000 in Visual Basic 6? If it is impossible, are there any methods to overcome this limitation?

The VB6 code for baud rate setting is found below, where 'Port' is the address of COM port e.g. COM4, COM3:

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

If anyone can help me understand how serial communication works in this setting and if I can overcome the constraints of Visual Basic 6, I would be very grateful.

1
Can you edit your question to include the relevant snippets of VB6 code? Also, how does the limitation on baud rate manifest itself - are you getting an error?StayOnTarget
@DaveInCaz Thanks for the response. I have edited it for you. There is no error. Instead, a value between 1 and 100 on the device remains unchanged.velvetshelter
So, it you use "9600,N,8,1" then you can send/receive data OK? What happens differently if you used "1000000,N,8,1" ?StayOnTarget
I think you should be able to get arbitrary baud rates on Windows, using the Windows API (SetCommState specifically), and FTDI drivers. I think I have done that myself before. But just to double-check, you should read the datasheet of the FTDI chip to see what baud rates it supports. You neglected to tell us what USB-to-serial adapter you are using or what FTDI chip it has on it so I was unable to do that check myself.David Grayson
@DavidGrayson We are not using a USB-to-serial adapter. We are using a USB cable connected to the VCP; this works just fine in MATLAB. The documentation states that the baud rate can operate up to 3,000,000.velvetshelter

1 Answers

5
votes

It seems that you are using MSComm32.ocx, not VB6 directly.
The maximum speed you can set for this is 256,000 bps.

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

The following baud rate values are valid: 110, 300, 600, 1200, 2400, 4800, 9600 (default), 14400, 19200, 28800, 38400, 56000, 57600, 115200, 128000, 256000.

If you want more speed, please use Win32 API directly with the following library etc.

Serial port programming VB6 via Win32 API

Serial Port Communication

Serial port programming on Visual Basic with Windows API

grricks/vb6SerialAPI


Or, can it be used if the library provided by FTDI is defined by Declare Function like the above library?

D2XX Programmer's Guide

6.9 FT_W32_SetCommState
Example

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