PDA

View Full Version : Automatic VB6 to pic serial connection



arniepj
- 26th October 2007, 18:18
The attached project files demonstrate how to make an automatic serial connection between a VB6 interface and a pic. This relieves the user from having to know what port the pic is connected to and then manually connect . This is very useful when using a USB to serial converter, as the virtual port numbers can be from com 5 on up and change depending on the USB port being used. The VB6 application functions as follows: As the application loads, the program attempts to open port 1.If this fails, the program errors, leaves the routine, increments the port number and attempts to open the next port. If the opening is successful, the program transmits a character that the pic will recognize, and in turn the pic will begin sending data. The VB6 program will wait for a period of time for data to arrive, if successful the application will finish loading and data will be displayed. If unsuccessful, the program will try all the ports until exhausted, displaying no connection. When the application is shut down, the program transmits a character that the pic will recognize, and in turn the pic will stop sending data. The pic used was a 16F873A. At the very least its another example for serial communication between a pc and a pic. Some of the code was found on VBnet.com and modified.

Ioannis
- 24th November 2007, 18:09
Hi Arnie,

nice example! Thanks for posting.

Ioannis

T.Jackson
- 26th November 2007, 04:25
Suggest using timegettime or gettickcount API's for the delay. This approach will ensure that it runs at the same speed on every machine. Plus, it will also make the process much more efficient, with no dead time - other processes can be processed in the background. A for next loop with an irritation of 10,000 is a big ask for poor'ol slow & obsolete VB6.

Ioannis
- 7th January 2008, 21:58
Hi Trent. How do you use the API's? I am really new at the VB things and appreciate an example if you can.

Thanks,
Ioannis

mister_e
- 7th January 2008, 22:24
The usual way is to call it in a module and use the function in your code.

Add a module to your project and past the following ones...


Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Public Function GetTicks() As Long
GetTicks = GetTickCount()
End Function

In your Form(s), you just need to call it..


Option Explicit
Dim TickValue As Long

Private Sub Form_Load()
Command1.Caption = "Start"
Command2.Caption = "Stop"
Text1.Text = ""
End Sub

Private Sub Command1_Click()
TickValue = GetTicks
End Sub

Private Sub Command2_Click()
TickValue = GetTicks - TickValue
Text1.Text = TickValue
End Sub


HTH

dhouston
- 7th January 2008, 22:42
Windows supports 256 COM ports. While few PCs will have a large number of ports, with the proliferation of USB/serial adapters and ethernet/serial adapters, there may be several ports and they usually do not use contiguous numbers. Testing all 256 possibilities can be quite time consuming. I think it's best to first enumerate the ports, eliminate those that are infrared, modems, etc. and then test the remainder. This is much faster and more reliable. Do a Google search using "VB enumerate COM ports" and you will find lots of example code. Many examples check the registry but this is not an infallible method as users can edit the registry.

Here's an example written in PureBasic which uses the Windows API function EnumPorts. The backslash is PB's equivalent to VB's dot for referencing structure members (VB Type).

;--------------------------------------------------------
;
; SerialPorts.pbi
;
;--------------------------------------------------------

Structure API_PORT_INFO_2
PortName.s
MonitorName.s
Description.s
PortType.l
Reserved.l
EndStructure

Global NewList Portinfos.API_PORT_INFO_2()
Global ports.s
Global NumPorts.l

Procedure.l GetAvailablePorts(ServerName.s="")
Protected res.l, pcbNeeded.l,pcReturned .l,i.l,ret.l
Protected *TempBuff,*pName,*strPortinfos.PORT_INFO_2

If ServerName=""
*pName=0
Else
*pName=@ServerName
EndIf

;Get the number of bytes needed To contain the Data returned by the API call
ret = EnumPorts_(*pName, 2, 0, 0, @pcbNeeded, @pcReturned)
If pcbNeeded
*TempBuff = AllocateMemory(pcbNeeded) ; Allocate the Buffer
ret = EnumPorts_(*pName, 2, *TempBuff, pcbNeeded, @pcbNeeded, @pcReturned)
If ret
For i = 0 To pcReturned - 1
;set structure over the memory area
*strPortinfos.PORT_INFO_2=*TempBuff+(i*SizeOf(PORT _INFO_2))
AddElement(Portinfos())
Portinfos()\PortName=PeekS(*strPortinfos\pPortName )
Portinfos()\MonitorName=PeekS(*strPortinfos\pMonit orName)
Portinfos()\Description=PeekS(*strPortinfos\pDescr iption)
Portinfos()\PortType=*strPortinfos\fPortType
If Not FindString(LCase(Portinfos()\Description),"infrared",1)
If Not FindString(LCase(Portinfos()\Description),"modem",1)
If Not FindString(ports,Portinfos()\PortName,1)
If Left(Portinfos()\PortName,3)="COM" And FindString(Portinfos()\Description," Port",1)
;test each here by trying to open it
ports+Portinfos()\PortName
numPorts+1
EndIf
EndIf
EndIf
EndIf
Next
EndIf
;Free the Heap Space allocated for the Buffer
If *TempBuff
FreeMemory(*TempBuff)
EndIf
EndIf

ProcedureReturn pcReturned
EndProcedureHere's a link to a VB example. http://vbnet.mvps.org/index.html?code/enums/enumports.htm

EnumPorts returns all of the printer ports on the PC. The COM ports are a subset of the printer ports.

mister_e
- 7th January 2008, 22:51
Yup, that's one method, i already did it but, using CreateFile.. but some says it doesn't work with Me/2000

However, there's no good reason to stick with VB6. All the above is 90% standard in .NET... the problem is just to move on .NET syntax :eek:

Ioannis
- 8th January 2008, 12:05
Thanks all for the tips.

Steve: About .NET and newer, one must have a super-duper machine to install the new IDE...

Tried the 2005 and waited about 20 min to install!

Then to open it about 40-50 seconds...

Until I can have a quad core PC, VB6 is OK for me!

Ioannis

mister_e
- 8th January 2008, 17:02
:D yeah it sucks, even worst with 2008. You can speed it a little bit if you disable all web features in.. but, it's still really slow on most of my machines here. BUt once the code is compiled and works, that's nice.

The major point i guess is more about Vista compatibility. Not sure enough how bad/good most VB6 program will behave with. Still good in XP in most case. .NET is not bad, it's just a bit had to move on and to understand the whole new syntax/traps.

Ioannis
- 9th January 2008, 09:39
I think that the new IDE can accept the old DLL's from the VB6 for example and use the old controls too. A friend of mine said he just open the libraries and workd ok.

I cannot test this as I got rid off the monster!

Also said that the old syntax is acceptable too (may be with some trick though).

By the way, Steve, is there a way to access a bit in a variable array in PBP? I meen for example like this: array[7].4=1

I know the link of Melanies that is accessing as an array of bits the whole byte array, but is not easy to remember the 267th bit!

I overcome this by reloading the array byte to a variable and then back to array again.

Ioannis

Darrel Taylor
- 9th January 2008, 11:22
is there a way to access a bit in a variable array in PBP? I meen for example like this: array[7].4=1

If you're really using constants as shown, then you can alias the location and access the individual bit

TheByte VAR array(7)

TheByte.4 = 1But you probably want variables for both the byte and bit index's ...

ByteIDX VAR BYTE
BitIDX VAR BYTE

ByteIDX = 7
BitIDX = 4

array.0((ByteIDX<<3)+BitIDX) = 1

Ioannis
- 9th January 2008, 13:38
Hey, look ma, how we can things more complicate!!!

OK, thanks for the tips Darrel. The second is clever, but I suppose it is cpu power hungry.

I 'll take the first, thank you!

Ioannis

dhouston
- 9th January 2008, 15:22
I know the link of Melanies that is accessing as an array of bits the whole byte array, but is not easy to remember the 267th bit!It's simple enough to keep track of bytes & bits using the Division (/) and Modulus (//) operators.

267 / 8 = 33
267 // 8 = 3

33 * 8 + 3 = 267

Ioannis
- 10th January 2008, 08:57
Thanks for the tip Dave.

Ioannis