[VBS] Aansturen COM Poort

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 20-09 13:18
Hoi allemaal,

Ik probeer een commando via VBS te sturen naar een COM poort.
Er is een tool (een .exe) gemaakt door iemand anders om bepaalde dingen te sturen naar een COM poort voor het aansturen van een apparaat.

Ik heb van de leverancier van het apparaat een complete data sheet gekregen hoe ik het apparaat kan aansturen, dus commando's weet ik.

Nu heb ik de volgende VBS:

VBScript:
1
2
3
4
5
set fso = CreateObject("Scripting.FileSystemObject")
set com = fso.OpenTextFile("COM1:9600,N,8,1",2)
com.write("C00" & vbCr)
WScript.Sleep(10)
com.close()


Opzich werkt het MAAR!
Het werkt pas nadat het programma van de leverancier heb opgestart (die doet dus nog iets met de COM poort).
Leuk en aardig, dus even portmon van sysinternals er over gelaten.

Nu krijg ik bij de tool van de leverancier dit:
0 0.00005236 RS232C_TOOL.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 0.00000341 RS232C_TOOL.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
2 0.00000538 RS232C_TOOL.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 25600 OutSize: 2560
3 0.00000302 RS232C_TOOL.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
4 0.00000094 RS232C_TOOL.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:5000
5 0.00000189 RS232C_TOOL.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
6 0.00000173 RS232C_TOOL.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
7 0.00000130 RS232C_TOOL.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
8 0.00000224 RS232C_TOOL.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
9 0.00000127 RS232C_TOOL.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
10 0.00000189 RS232C_TOOL.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR TXEMPTY CTS DSR RLSD BRK ERR RING
11 0.00000107 RS232C_TOOL.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS
12 2.32581410 RS232C_TOOL.exe IOCTL_SERIAL_WAIT_ON_MASK Serial0 SUCCESS
13 0.00000114 RS232C_TOOL.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS
14 0.00000086 RS232C_TOOL.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS
15 0.00000086 RS232C_TOOL.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS
16 0.00000725 RS232C_TOOL.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 19200
17 0.00000352 RS232C_TOOL.exe IOCTL_SERIAL_CLR_RTS Serial0 SUCCESS
18 0.00000359 RS232C_TOOL.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS
19 0.00000242 RS232C_TOOL.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
20 0.00000121 RS232C_TOOL.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
21 0.00000523 RS232C_TOOL.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:0 XonLimit:6400 XoffLimit:6400
22 0.00000191 RS232C_TOOL.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT TXCLEAR
23 0.00000137 RS232C_TOOL.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0 SUCCESS
24 0.00000194 RS232C_TOOL.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: RXABORT RXCLEAR
En nog een lijst met IOCTL_SERIAL_GET_COMMSTATUS (tool van leverancier leest namelijk ook de COM poort uit, maar dit is voor mij niet nodig).

Voor mijn VBS krijg ik het volgende als output:
0 0.00005109 cscript.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 0.00000114 cscript.exe IRP_MJ_SET_INFORMATION Serial0 SUCCESS -140613956
2 0.00002582 cscript.exe IRP_MJ_WRITE Serial0 SUCCESS Length 4: C00.
3 0.00000352 cscript.exe IRP_MJ_CLEANUP Serial0 SUCCESS
4 0.10936699 cscript.exe IRP_MJ_CLOSE Serial0 SUCCESS
Ik zie nergens waar een BAUD rate of iets wordt ingesteld.


Nu is mijn vraag dus, wat is er nu verkeerd aan mijn script, en zijn er nog andere mogelijkheden om dit te doen?

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
In regel 2 van jouw script stel je een baudrate in en dat zit waarschijnlijk in regel 2 (met nummer 1) van de portmon output van je script. Vermoedelijk is het een combinatiecommando. De leverancier tool stelt hem blijkbaar in op 19200, dus als je dat getal nu eens probeert?

Maar wat is het probleem nu precies? Wil je zonder de tool van de leverancier je ding kunt doen? Als je die tool toch hebt, dan kun je hem toch ook starten met een VBS commando? Hoef jij niet te gaan klooien met COM commando's.

Misschien dat je van de oplossing op de volgende pagina gebruik kan maken:
http://www.programmershea...omm-in-vbscript/?S=B20000

Ik weet niet of het een standaard object is, maar goed, misschien heb je daar wat meer controle over de commando's die je naar de COM poort stuurt.

[ Voor 23% gewijzigd door bigbeng op 22-04-2009 10:35 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
En dit staat in WEB omdat... :?

WEB >> PRG

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 20-09 13:18
bigbeng schreef op woensdag 22 april 2009 @ 10:32:
In regel 2 van jouw script stel je een baudrate in en dat zit waarschijnlijk in regel 2 (met nummer 1) van de portmon output van je script. Vermoedelijk is het een combinatiecommando. De leverancier tool stelt hem blijkbaar in op 19200, dus als je dat getal nu eens probeert?

Maar wat is het probleem nu precies? Wil je zonder de tool van de leverancier je ding kunt doen? Als je die tool toch hebt, dan kun je hem toch ook starten met een VBS commando? Hoef jij niet te gaan klooien met COM commando's.

Misschien dat je van de oplossing op de volgende pagina gebruik kan maken:
http://www.programmershea...omm-in-vbscript/?S=B20000

Ik weet niet of het een standaard object is, maar goed, misschien heb je daar wat meer controle over de commando's die je naar de COM poort stuurt.
De eindgebruiker moet 1 commando sturen, en hiervoor is de tool te uitgebreid. Het is dus geen optie om de tool gebruiken, omdat een stuk of 100 gebruikers dan met de tool bekend moeten worden ;).

De tool start en stop ik nu elke keer bij een boot, dit werkt ook wel, maar ik zo een nettere oplossing.


MSComm krijg ik niet werkend, heb je een .ocx nodig die blijkbaar alleen in VB6 zit (licensed OCX) ;(

Acties:
  • 0 Henk 'm!

  • Maasluip
  • Registratie: April 2002
  • Laatst online: 13:41

Maasluip

Frontpage Admin

Kabbelend watertje

KennieNL schreef op woensdag 22 april 2009 @ 08:55:

Ik zie nergens waar een BAUD rate of iets wordt ingesteld.
16 0.00000725 RS232C_TOOL.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 19200
Ik wel.

Signatures zijn voor boomers.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik denk dat hij op 't tweede blokje log doelt ;)
0 0.00005109 cscript.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open
1 0.00000114 cscript.exe IRP_MJ_SET_INFORMATION Serial0 SUCCESS -140613956
Maar die konden 't ook wel eens zijn; bij het createn zou je al die opties al kunnen setten; en anders lijkt me een waarschijnlijke candidaat de "SET_INFORMATION" wel ;)

[ Voor 24% gewijzigd door RobIII op 22-04-2009 11:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 20-09 13:18
Ja ok, maar dat is van de tool van de leverancier, niet van mijn VBS.

Hij werkt op beide 19200/9600 BAUD niet, tevens gaf de leverancier aan dat beide gebruikt mochten worden.

SET_INFORMATION vind ik niet erg veel op.


Zijn er nog makkelijke manieren om een COM poort aan te sturen? Of kan ik beter iets in C of andere taal bouwen?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
KennieNL schreef op woensdag 22 april 2009 @ 12:01:
[...]
Ja ok, maar dat is van de tool van de leverancier, niet van mijn VBS.

Hij werkt op beide 19200/9600 BAUD niet, tevens gaf de leverancier aan dat beide gebruikt mochten worden.

SET_INFORMATION vind ik niet erg veel op.


Zijn er nog makkelijke manieren om een COM poort aan te sturen? Of kan ik beter iets in C of andere taal bouwen?
In een andere taal zal het zeker mogenlijk zijn om het te maken aangezien er genoeg libraries voor andere talen beschikbaar zijn.

In het .NET framework heb je bijvoorbeeld de SerialPort class die een hoop voor je afhandeld. Voor Java/C/C++ zal er vast ook het een en ander beschikbaar zijn.

Maar dat betekent niet dat het in VBS niet mogenlijk is. Zie je met je VBS scriptje wel gewoon data over de COM poort gaan? Dan zal het waarschijnlijk inderdaad aan een setting liggen die anders ingesteld staat. Ik zie ( zoals hierboven ook al opgemerkt ) dat jij de baud-rate op 9600 zet en de tool van de leverancier op 19200. Misschien dat er nog wat anders in is gesteld met betrekking tot de handshake?

[ Voor 3% gewijzigd door Woy op 22-04-2009 12:23 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:17
Het was me niet bekend dat je op die manier de com settings kunt instellen, anders dan dat zie ik dat de tool zelf ook handshaking instelt, terwijl jouw code dat niet doet.

Ik heb een sterk vermoeden dat met jouw device string geen com parameters worden ingesteld. ( Zou je kunnen proberen door in het configuratiescherm de settings goed te zetten en dan jouw tool proberen ). Serial settings kun je ook instellen met het mode commando.

Overigens, SET_INFORMATION IRP wordt niet gebruikt voor settings, maar volgens mij voor het flushen van je receive buffer.

[ Voor 5% gewijzigd door farlane op 22-04-2009 15:09 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • KennieNL
  • Registratie: Mei 2007
  • Laatst online: 20-09 13:18
Woy schreef op woensdag 22 april 2009 @ 12:21:
[...]

In een andere taal zal het zeker mogenlijk zijn om het te maken aangezien er genoeg libraries voor andere talen beschikbaar zijn.

In het .NET framework heb je bijvoorbeeld de SerialPort class die een hoop voor je afhandeld. Voor Java/C/C++ zal er vast ook het een en ander beschikbaar zijn.

Maar dat betekent niet dat het in VBS niet mogenlijk is. Zie je met je VBS scriptje wel gewoon data over de COM poort gaan? Dan zal het waarschijnlijk inderdaad aan een setting liggen die anders ingesteld staat. Ik zie ( zoals hierboven ook al opgemerkt ) dat jij de baud-rate op 9600 zet en de tool van de leverancier op 19200. Misschien dat er nog wat anders in is gesteld met betrekking tot de handshake?
Ja het scriptje werkt perfect nadat de tool van leverancier is gestart, baud rate mag op beide 19200 als 9600.. initiële met voorkeur van 9600 gaven ze aan, maar dit mocht niet uitmaken. Maar heb beide getest, en hier ligt het niet aan.

Ik kwam in ieder geval via Google tegen om op deze manier de instellingen van de COM poort in VBS te veranderen, en daarom dacht ik dat dit de meest éénvoudige manier zou zijn.

Ik denk dat ik vanavond maar eens Visual Studio installeer, en wat bij elkaar ga programmeren.


Bedankt iedereen zover voor de reacties.
Pagina: 1