ComDetector - утилита поиска COM-оборудования
Потом я столкнулся с терминальным модемом Siemens MC35i, который откликался только на скорости 115200 бод. Потом мне понадобилось посмотреть статус принтера на удаленном от меня терминале Custom VKP80. Таким образом и получилась за несколько приемов утилита, которая перед вами.
Я сделал эту утилиту на MONO по такой же точно технологии, как GoogleTranslate - англо-русский онлайн переводчик - так что работать она может не только в виндузне, но и на загрузочных компактах и флешках LINUX - Загрузочные компакты и флешки (bootable LiveCD and bootable USB).
В утилите уже заложено много возможностей - но я распространяю свой код на условиях GNU Lesser General Public License - поэтому вы имеете право скопировать мой код, исправить его и дополнить любым своим функионалом.
Моя утилита - консольное приложение (впрочем вам ничто не мешает либо докрутить сюда GUI либо вызвать ее из командной строки и обработать ее листинг своим софтом). Она перебирает все последовательные COM-интерфейсы в поисках оборудования, которое ей указано в параметре SearchType. На рисунках вы видите, как выглядят параметры моей утилиты и оборудование, которое я ею обычно тестирую.
Если ваше автономное коммуникационное оборудование требует +12, +5, -12 вольт - просто закорачивайте зеленый контакт и черный на разъеме ATX блока питания, чтобы включить свое автономное оборудование на стандартном кампутерном ATX блоке питания (это вы можете видеть на рисунке сверху).
Учтите, что COM-обрудование горит просто отлично - это не панты какие-нибудь, а реальность. Даже сейчас, когда я работаю один, у меня половина выгоревших портов на кампутерах - стоит потерять бдительность и тыкнуть что-нибудь на горячее - COM-порт сразу же сгорает. А когда я работал админом института с 300-ми кампами - у меня там вообще остался на всю серверную один рабочий порт - потому что там был проходной двор среди моих помошников-младших админов. Это не относится к NULL-modem - его можно включать на горячую свободно.
В режиме нуль-модема SearchType=Echo - задача проги - зафиксировать факт эха на каком-нибудь из COM-интерфейсов. Тогда вы понимаете на каком именно кабеле сейчас находится null-modem. Как видите, на COM2 интерфейсе эха нет, а на COM1 - есть эхо, причем посколько программа работает универсально, без контроля скорости работы оборудования, то два последних байта не дочитались (интерфейс призадумался перед тем как из выдать) - поэтому получается сообщение об ошибке эха нуль-модема.
Чуть правее вы видите режим подбора четности и старт-стопного бита последовательного интерфейса - и чудеса в данных отклика нуль-модема, которые происходят при неверных установках databits, parity и stopbits у последовательного порта.
При работе на неправильных скоростях (speed=search)COM-оборудование ведет себя просто чудестно. В часности принтер VKP80 не только заминает бумагу, но и печатает жуткую абракадабру. Ее вы можете видеть на рисунке - ниже слева. А чуть правее скрин - протокол работы моей проги в режиме SearchType=vkp80- как видите, состояния сенсоров принтера и его статус на низких скоростях там вовсе не читается. А на правом скрине вы видите принтер, который вне зависимости от настроек порта откликается только на скорости 19200. Поэтому, чтобы не мучать принтер, рекомендуется все-таки включить принтер с нажатой кнопкой LF и он напечатает свои настроки (это правый чек на левом рисунке).
Однако с терминальным модемом так не получится - узнать на какую скорость он настроен. Модем нормально откликается только на определенной скорости (чаще всего 115200), но заранее она неизвестна, а чек со своими настройками он выдать не может. Правее вы видите как ведет себя модем на разных скоростях - в режиме работы проги SearchType=modem. Как видите, он вообще начал откликаться начиная со скоростей 19600 бод.
Это ровно тот же самый отклик, которым мы видим в программе putty или HyperTerminal. Вы можете передать в параметре ModemCommand другую команду (вместо AT&V) - и таким образом работать с любым своим коммуникационным оборудованием.
Собственно код моей проги состоит из трех фрагментов - одного модуля и трех статических классов. В стартовом модуле я обработал все параметры командной строки и организовал нужные рабочие циклы:
1: Module Start
2:
3: Sub Main()
4: Try
5: Dim PRM() As String = Environment.GetCommandLineArgs
6: For j As Integer = 1 To PRM.Length - 1
7: Dim OneParm As String = PRM(j)
8: Dim X() As String = OneParm.ToLower.Split("=")
9: If X.Length = 0 Then GoTo usage
10: Select Case X(0)
11: Case "searchtype"
12: Select Case X(1)
13: Case "echo" : UserParm.SearchType = UserParm.ExecType.Echo
14: Case "modem" : UserParm.SearchType = UserParm.ExecType.Modem
15: Case "vkp80" : UserParm.SearchType = UserParm.ExecType.VKP80
16: Case Else
17: Console.WriteLine("SearchType=?")
18: GoTo usage
19: End Select
20: Case "comport"
21: Select Case X(1)
22: Case "search" : UserParm.PortName = UserParm.ExecPortName.Search
23: Case "com1" : UserParm.PortName = UserParm.ExecPortName.COM1
24: Case "com2" : UserParm.PortName = UserParm.ExecPortName.COM2
25: Case "com3" : UserParm.PortName = UserParm.ExecPortName.COM3
26: Case "com4" : UserParm.PortName = UserParm.ExecPortName.COM4
27: Case "com5" : UserParm.PortName = UserParm.ExecPortName.COM5
28: Case "com6" : UserParm.PortName = UserParm.ExecPortName.COM6
29: Case "com7" : UserParm.PortName = UserParm.ExecPortName.COM7
30: Case "com8" : UserParm.PortName = UserParm.ExecPortName.COM8
31: Case Else
32: Console.WriteLine("ComPort=?")
33: GoTo usage
34: End Select
35: Case "speed"
36: Select Case X(1)
37: Case "current" : UserParm.Speed = UserParm.ExecSpeed.Current
38: Case "search" : UserParm.Speed = UserParm.ExecSpeed.Search
39: Case "110" : UserParm.Speed = UserParm.ExecSpeed.s110
40: Case "300" : UserParm.Speed = UserParm.ExecSpeed.s300
41: Case "1200" : UserParm.Speed = UserParm.ExecSpeed.s1200
42: Case "2400" : UserParm.Speed = UserParm.ExecSpeed.s2400
43: Case "4800" : UserParm.Speed = UserParm.ExecSpeed.s4800
44: Case "9600" : UserParm.Speed = UserParm.ExecSpeed.s9600
45: Case "19200" : UserParm.Speed = UserParm.ExecSpeed.s19200
46: Case "38400" : UserParm.Speed = UserParm.ExecSpeed.s38400
47: Case "57600" : UserParm.Speed = UserParm.ExecSpeed.s57600
48: Case "115200" : UserParm.Speed = UserParm.ExecSpeed.s115200
49: Case "230400" : UserParm.Speed = UserParm.ExecSpeed.s230400
50: Case Else
51: Console.WriteLine("Speed=?")
52: GoTo usage
53: End Select
54: Case "parity"
55: Select Case X(1)
56: Case "current" : UserParm.Parity = UserParm.ExecParity.Current
57: Case "search" : UserParm.Parity = UserParm.ExecParity.Search
58: Case "even" : UserParm.Parity = UserParm.ExecParity.Even
59: Case "mark" : UserParm.Parity = UserParm.ExecParity.Mark
60: Case "none" : UserParm.Parity = UserParm.ExecParity.None
61: Case "odd" : UserParm.Parity = UserParm.ExecParity.Odd
62: Case "space" : UserParm.Parity = UserParm.ExecParity.Space
63: Case Else
64: Console.WriteLine("Parity=?")
65: GoTo usage
66: End Select
67: Case "databits"
68: Select Case X(1)
69: Case "current" : UserParm.Databits = UserParm.ExecDatabits.Current
70: Case "search" : UserParm.Databits = UserParm.ExecDatabits.Search
71: Case "5" : UserParm.Databits = UserParm.ExecDatabits.d5
72: Case "6" : UserParm.Databits = UserParm.ExecDatabits.d6
73: Case "7" : UserParm.Databits = UserParm.ExecDatabits.d7
74: Case "8" : UserParm.Databits = UserParm.ExecDatabits.d8
75: Case Else
76: Console.WriteLine("Parity=?")
77: GoTo usage
78: End Select
79: Case "stopbits"
80: Select Case X(1)
81: Case "current" : UserParm.Stopbits = UserParm.ExecStopBits.Current
82: Case "search" : UserParm.Stopbits = UserParm.ExecStopBits.Search
83: Case "none" : UserParm.Stopbits = UserParm.ExecStopBits.None
84: Case "one" : UserParm.Stopbits = UserParm.ExecStopBits.One
85: Case "onepointfive" : UserParm.Stopbits = UserParm.ExecStopBits.OnePointFive
86: Case "two" : UserParm.Stopbits = UserParm.ExecStopBits.Two
87: Case Else
88: Console.WriteLine("Parity=?")
89: GoTo usage
90: End Select
91: Case "modemcommand"
92: UserParm.ModemCommand = X(1)
93: Case "tuningsleep"
94: Select Case X(1)
95: Case "manual" : UserParm.TuningSleep = -1
96: Case Else
97: Try
98: UserParm.TuningSleep = CInt(X(1))
99: Catch ex As Exception
100: Console.WriteLine("TuningSleep=?")
101: GoTo usage
102: End Try
103: End Select
104: Case "list"
105: Select Case X(1)
106: Case "short" : UserParm.Listing = UserParm.ExecListingType.Short
107: Case "full" : UserParm.Listing = UserParm.ExecListingType.Full
108: End Select
109: Case "timeout"
110: Try
111: UserParm.Timeout = CInt(X(1))
112: Catch ex As Exception
113: Console.WriteLine("Timeout=?")
114: GoTo usage
115: End Try
116: Case Else
117: Console.WriteLine("What is " & X(0) & "?")
118: GoTo usage
119: End Select
120: Next
121: 'all input parameters checked and correct
122:
123:
124: If UserParm.PortName = UserParm.ExecPortName.Search Then
125: For Each PortName As String In My.Computer.Ports.SerialPortNames
126: OneSerialPort(PortName)
127: Next
128: Else
129: OneSerialPort(UserParm.PortName.ToString)
130: End If
131: Console.ReadLine()
132: Exit Sub
133: usage:
134: Console.WriteLine("Usage: ComDetector [SearchType=Echo -or- Modem -or- VKP80] [ComPort=PortName -or- search] [Speed=value -or- search -or- current] [Parity=value -or- search -or- current] [Databits=value -or- search -or- current] [StopBits=value -or- search -or- current] [Timeout=1000] [TuningSleep=100 or Manual] [List=Full -or- Short] [ModemCommand=AT&V]")
135: Console.WriteLine()
136: Console.WriteLine("Example1: ComDetector ComPort=search SearchType=Echo Speed=115200 Sleep=100 -- search echo (null-modem) on each COM-interface with sleep 0,1 second on speen 115200 bod and current parity, databits, stopbits")
137: Console.WriteLine()
138: Console.WriteLine("Example2: ComDetector SearchType=VKP80 ComPort=COM1 Databits=search StopBits=search Parity=search StopBits=Node -- search VKP80 printer on COM-interface on any speed, parity, databits, stopbits=One")
139: Console.WriteLine()
140: Console.WriteLine("Example3: ComDetector SearchType=Modem speed=current Timeout=1000 Enum=manual -- search modem (AT&V) on each COM-interface on any parity, databits, stopbits with ReadTimeout one second and current serial port speed with manual change each port tuning.")
141: Console.WriteLine()
142: Console.WriteLine("All parameter name may be in upper or lower case, all parameters (except SearchType) may be omitted, all parameters may be in any order, example ComDetector paRity=None searchType=vkp80 ComPort=com7. If parameter omitted use current value.")
143: Console.WriteLine()
144: Console.WriteLine("Speed=110,300,1200,2400,4800,9600,19200,38400,57600,115200,230400; Parity=None,Odd,Even,Mark,Space; Databits=5,6,7,8; StopBits=None,One,OnePointFive,Two")
145: Console.WriteLine("Default SearchType=Echo, ComPort=search, Speed=Current, Parity=None, Databits=8, StopBits=One, TuningSleep=100, List=Full, ModemCommand=AT&V")
146:
147: Console.WriteLine()
148: Console.WriteLine("In Linux execute IL byte code as: mono ComDetector.exe SearchType=Echo or create binary file on you processor architecture from IL-code as : mkbundle -o comdetector ComDetector.exe --deps")
149: Console.WriteLine()
150: Console.ReadLine()
151: Catch ex As Exception
152: Console.WriteLine("Error occured: " & vbCrLf & ex.Message)
153: End Try
154:
155: End Sub
156:
157: Sub OneSerialPort(ByVal ComPortName As String)
158: Console.WriteLine()
159: Console.WriteLine(ComPortName & vbCrLf)
160: Try
161: Port.ComPort.Close()
162: Catch ex As Exception
163: '
164: End Try
165: Try
166: Select Case UserParm.Speed
167: Case UserParm.ExecSpeed.Search
168: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s110)
169: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s300)
170: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s1200)
171: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s2400)
172: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s4800)
173: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s9600)
174: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s19200)
175: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s38400)
176: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s57600)
177: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s115200)
178: ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s230400)
179:
180: Case UserParm.ExecSpeed.Current
181: Dim Speed As Port.Speed
182: Try
183: Dim X As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(ComPortName)
184: Speed = X.BaudRate
185: X.Close()
186: Catch ex As Exception
187: Console.WriteLine("Error reading current Speed on " & ComPortName)
188: Exit Sub
189: End Try
190: Select Case Speed
191: Case 110 : Speed = UserParm.ExecSpeed.s110
192: Case 300 : Speed = UserParm.ExecSpeed.s300
193: Case 1200 : Speed = UserParm.ExecSpeed.s1200
194: Case 2400 : Speed = UserParm.ExecSpeed.s2400
195: Case 4800 : Speed = UserParm.ExecSpeed.s4800
196: Case 9600 : Speed = UserParm.ExecSpeed.s9600
197: Case 19200 : Speed = UserParm.ExecSpeed.s19200
198: Case 38400 : Speed = UserParm.ExecSpeed.s38400
199: Case 57600 : Speed = UserParm.ExecSpeed.s57600
200: Case 115200 : Speed = UserParm.ExecSpeed.s115200
201: Case 230400 : Speed = UserParm.ExecSpeed.s230400
202: End Select
203: ProcessOneSpeed(ComPortName, Speed)
204:
205: Case UserParm.ExecSpeed.s110 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s110)
206: Case UserParm.ExecSpeed.s300 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s300)
207: Case UserParm.ExecSpeed.s1200 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s1200)
208: Case UserParm.ExecSpeed.s2400 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s2400)
209: Case UserParm.ExecSpeed.s4800 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s4800)
210: Case UserParm.ExecSpeed.s9600 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s9600)
211: Case UserParm.ExecSpeed.s19200 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s19200)
212: Case UserParm.ExecSpeed.s38400 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s38400)
213: Case UserParm.ExecSpeed.s57600 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s115200)
214: Case UserParm.ExecSpeed.s115200 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s115200)
215: Case UserParm.ExecSpeed.s230400 : ProcessOneSpeed(ComPortName, UserParm.ExecSpeed.s230400)
216: End Select
217:
218: Catch ex As Exception
219: Console.WriteLine(ComPortName & " error occured: " & vbCrLf & ex.Message)
220: Try
221: Port.Close()
222: Catch x As Exception
223: '
224: End Try
225: End Try
226: End Sub
227:
228: Sub ProcessOneSpeed(ByVal ComPortName As String, ByVal Speed As Port.Speed)
229: Try
230: Select Case UserParm.Databits
231: Case UserParm.ExecDatabits.Current
232: Dim Databits As Port.Databits
233: Try
234: Dim X As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(ComPortName)
235: Databits = X.DataBits
236: X.Close()
237: Catch ex As Exception
238: Console.WriteLine("Error reading current DataBits on " & ComPortName)
239: Exit Sub
240: End Try
241: Select Case Databits
242: Case 8 : Databits = Port.Databits.d8
243: Case 7 : Databits = Port.Databits.d7
244: Case 6 : Databits = Port.Databits.d6
245: Case 5 : Databits = Port.Databits.d5
246: End Select
247: ProcessOneDatabits(ComPortName, Speed, Databits)
248:
249: Case UserParm.ExecDatabits.Search
250: ProcessOneDatabits(ComPortName, Speed, Port.Databits.d8)
251: ProcessOneDatabits(ComPortName, Speed, Port.Databits.d7)
252: ProcessOneDatabits(ComPortName, Speed, Port.Databits.d6)
253: ProcessOneDatabits(ComPortName, Speed, Port.Databits.d5)
254:
255: Case UserParm.ExecDatabits.d8 : ProcessOneDatabits(ComPortName, Speed, Port.Databits.d8)
256: Case UserParm.ExecDatabits.d7 : ProcessOneDatabits(ComPortName, Speed, Port.Databits.d7)
257: Case UserParm.ExecDatabits.d6 : ProcessOneDatabits(ComPortName, Speed, Port.Databits.d6)
258: Case UserParm.ExecDatabits.d5 : ProcessOneDatabits(ComPortName, Speed, Port.Databits.d5)
259: End Select
260: Catch ex As Exception
261: Console.WriteLine(ComPortName & " error occured: " & " Speed = " & Speed.ToString & vbCrLf & ex.Message)
262: Try
263: Port.Close()
264: Catch x As Exception
265: '
266: End Try
267: End Try
268:
269: End Sub
270:
271: Sub ProcessOneDatabits(ByVal ComPortName As String, ByVal Speed As Port.Speed, ByVal Databits As Port.Databits)
272: Try
273: Select Case UserParm.Parity
274: Case UserParm.ExecDatabits.Current
275: Dim Parity As IO.Ports.Parity
276: Try
277: Dim X As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(ComPortName)
278: Parity = X.Parity
279: X.Close()
280: Catch ex As Exception
281: Console.WriteLine("Error reading current Parity on " & ComPortName)
282: Exit Sub
283: End Try
284: Select Case Parity
285: Case IO.Ports.Parity.None : Parity = IO.Ports.Parity.None
286: Case IO.Ports.Parity.Mark : Parity = IO.Ports.Parity.Mark
287: Case IO.Ports.Parity.Even : Parity = IO.Ports.Parity.Even
288: Case IO.Ports.Parity.Odd : Parity = IO.Ports.Parity.Odd
289: Case IO.Ports.Parity.Space : Parity = IO.Ports.Parity.Space
290: End Select
291: ProcessOneParity(ComPortName, Speed, Databits, Parity)
292:
293: Case UserParm.ExecParity.Search
294: ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.None)
295: ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Mark)
296: ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Even)
297: ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Odd)
298: ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Space)
299: Case UserParm.ExecParity.None : ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.None)
300: Case UserParm.ExecParity.Odd : ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Odd)
301: Case UserParm.ExecParity.Even : ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Even)
302: Case UserParm.ExecParity.Mark : ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Mark)
303: Case UserParm.ExecParity.Space : ProcessOneParity(ComPortName, Speed, Databits, IO.Ports.Parity.Space)
304: End Select
305: Catch ex As Exception
306: Console.WriteLine(ComPortName & " error occured: " & " Speed = " & Speed.ToString & ", Databits=" & Databits.ToString & vbCrLf & ex.Message)
307: Try
308: Port.Close()
309: Catch x As Exception
310: '
311: End Try
312: End Try
313:
314: End Sub
315:
316: Sub ProcessOneParity(ByVal ComPortName As String, ByVal Speed As Port.Speed, ByVal Databits As Port.Databits, ByVal Parity As IO.Ports.Parity)
317: Try
318: Select Case UserParm.Stopbits
319: Case UserParm.ExecStopBits.Current
320: Dim Stopbits As IO.Ports.StopBits
321: Try
322: Dim X As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(ComPortName)
323: Stopbits = X.StopBits
324: X.Close()
325: Catch ex As Exception
326: Console.WriteLine("Error reading current Stopbits on " & ComPortName)
327: Exit Sub
328: End Try
329: Select Case Stopbits
330: Case IO.Ports.StopBits.None : Stopbits = IO.Ports.StopBits.None
331: Case IO.Ports.StopBits.One : Stopbits = IO.Ports.StopBits.One
332: Case IO.Ports.StopBits.OnePointFive : Stopbits = IO.Ports.StopBits.OnePointFive
333: Case IO.Ports.StopBits.Two : Stopbits = IO.Ports.StopBits.Two
334: End Select
335: ProcessOneStopbits(ComPortName, Speed, Databits, Parity, Stopbits)
336: Case UserParm.ExecStopBits.Search
337: ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.None)
338: ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.One)
339: ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.OnePointFive)
340: ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.Two)
341: Case UserParm.ExecStopBits.None : ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.None)
342: Case UserParm.ExecStopBits.One : ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.One)
343: Case UserParm.ExecStopBits.OnePointFive : ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.OnePointFive)
344: Case UserParm.ExecStopBits.Two : ProcessOneStopbits(ComPortName, Speed, Databits, Parity, IO.Ports.StopBits.Two)
345: End Select
346: Catch ex As Exception
347: Console.WriteLine(ComPortName & " error occured: " & " Speed = " & Speed.ToString & ", Databits=" & Databits.ToString & ", Parity=" & Parity.ToString & vbCrLf & ex.Message)
348: Try
349: Port.Close()
350: Catch x As Exception
351: '
352: End Try
353: End Try
354: End Sub
355:
356: Sub ProcessOneStopbits(ByVal ComPortName As String, ByVal Speed As Port.Speed, ByVal Databits As Port.Databits, ByVal Parity As IO.Ports.Parity, ByVal Stopbits As IO.Ports.StopBits)
357: Console.WriteLine(ComPortName & " : " & " Speed = " & Speed.ToString & ", Databits=" & Databits.ToString & ", Parity=" & Parity.ToString & ", Stopbits=" & Stopbits.ToString)
358:
359: Try
360: If UserParm.TuningSleep = -1 Then
361: Console.WriteLine("Press enter to write data ...")
362: Console.ReadLine()
363: Else
364: System.Threading.Thread.Sleep(UserParm.TuningSleep)
365: End If
366: Port.Open(ComPortName, Speed, Parity, Databits, Stopbits, UserParm.Timeout)
367: Select Case UserParm.SearchType
368: Case UserParm.ExecType.Echo : ProcessEcho()
369: Case UserParm.ExecType.Modem : ProcessModem()
370: Case UserParm.ExecType.VKP80 : ProcessVKP80()
371: End Select
372: If UserParm.Listing = UserParm.ExecListingType.Full Then
373: Console.WriteLine(Port.GetPortStatus())
374: End If
375: Port.Close()
376: Catch ex As Exception
377: Console.WriteLine(ComPortName & " error occured: " & " Speed = " & Speed.ToString & ", Databits=" & Databits.ToString & ", Parity=" & Parity.ToString & ", Stopbits=" & Stopbits.ToString & vbCrLf & ex.Message)
378: Try
379: Port.Close()
380: Catch x As Exception
381: '
382: End Try
383: End Try
384: End Sub
385:
386: Sub ProcessEcho()
387: If UserParm.Listing = UserParm.ExecListingType.Full Then
388: Console.WriteLine("Writing...")
389: Console.WriteLine(Port.ByteToString(Port.CharSet))
390: End If
391: '
392: Try
393: Port.WriteCharSetAll()
394: Catch ex As Exception
395: Console.WriteLine("Write Error: " & ex.Message)
396: Exit Sub
397: End Try
398: '
399: System.Threading.Thread.Sleep(100)
400: Dim Replay(Port.CharsetLength) As Byte
401: Try
402: If UserParm.Listing = UserParm.ExecListingType.Full Then
403: Console.WriteLine("Reading...")
404: End If
405: Port.ComPort.Read(Replay, 0, Port.CharsetLength - 1)
406: Console.WriteLine(Port.ByteToString(Replay))
407: Catch ex As Exception
408: Console.WriteLine("Read Error: " & ex.Message)
409: Exit Sub
410: End Try
411: '
412: For i As Integer = 0 To Port.CharsetLength - 1
413: If Replay(i) <> Port.CharSet(i) Then
414: Console.WriteLine("Data compare error.")
415: Exit Sub
416: End If
417: Next
418: Console.WriteLine("Data tranfer OK.")
419: End Sub
420:
421: Sub ProcessModem()
422: Console.WriteLine("Writing AT&V...")
423: '
424: Dim Buf() As Byte
425: Dim ASCII As New Text.ASCIIEncoding
426: Buf = ASCII.GetBytes("AT&V" & vbCrLf)
427: Try
428: Port.Write(Buf)
429: Catch ex As Exception
430: Console.WriteLine("Write Error: " & ex.Message)
431: Exit Sub
432: End Try
433: '
434: Dim Replay(200) As Byte
435: System.Threading.Thread.Sleep(100)
436: Try
437: If UserParm.Listing = UserParm.ExecListingType.Full Then
438: Console.WriteLine("Reading...")
439: End If
440: Port.ComPort.Read(Replay, 0, Math.Min(Port.ComPort.BytesToRead, Replay.Length))
441: Console.WriteLine(ASCII.GetString(Replay))
442: Catch ex As Exception
443: Console.WriteLine("Read Error: " & ex.Message)
444: Exit Sub
445: End Try
446: '
447: End Sub
448:
449: Sub ProcessVKP80()
450: VKP80_CMD.CMD_Initialize_printer()
451: Console.WriteLine(VKP80_CMD.GetPrinterStatus)
452: Port.WriteCharSetRow()
453: VKP80_CMD.CMDSIMPLE_Form_feed()
454: End Sub
455:
456: End Module
В этом статическом классе я собрал все параметры, которые должны управлять рабочими циклами:
1: Public Class UserParm
2: Public Enum ExecType
3: Echo = 0
4: Modem = 1
5: VKP80 = 2
6: End Enum
7: Public Enum ExecPortName
8: Search = 0
9: COM1 = 1
10: COM2 = 2
11: COM3 = 3
12: COM4 = 4
13: COM5 = 5
14: COM6 = 6
15: COM7 = 7
16: COM8 = 8
17: End Enum
18: Public Enum ExecSpeed
19: Current = 0
20: Search = -1
21: s110 = 110
22: s300 = 300
23: s1200 = 1200
24: s2400 = 2400
25: s4800 = 4800
26: s9600 = 9600
27: s19200 = 19200
28: s38400 = 38400
29: s57600 = 57600
30: s115200 = 115200
31: s230400 = 230400
32: End Enum
33: Public Enum ExecParity
34: Current = -2
35: Search = -1
36: None = IO.Ports.Parity.None
37: Odd = IO.Ports.Parity.Odd
38: Mark = IO.Ports.Parity.Mark
39: Even = IO.Ports.Parity.Even
40: Space = IO.Ports.Parity.Space
41: End Enum
42: Public Enum ExecDatabits
43: Current = -2
44: Search = -1
45: d5 = 5
46: d6 = 6
47: d7 = 7
48: d8 = 8
49: End Enum
50: Public Enum ExecStopBits
51: Current = -2
52: Search = -1
53: None = IO.Ports.StopBits.None
54: One = IO.Ports.StopBits.One
55: OnePointFive = IO.Ports.StopBits.OnePointFive
56: Two = IO.Ports.StopBits.Two
57: End Enum
58: Public Enum ExecTuningSleepType
59: Auto = 0
60: Manual = 1
61: End Enum
62: Public Enum ExecListingType
63: [Short] = 0
64: Full = 1
65: End Enum
66: Shared _Timeout As Integer
67: Public Shared Property Timeout() As Integer
68: Get
69: Return _Timeout
70: End Get
71: Set(ByVal value As Integer)
72: _Timeout = value
73: End Set
74: End Property
75: Shared _ModemCommand As String = "AT&V"
76: Public Shared Property ModemCommand() As String
77: Get
78: Return _ModemCommand
79: End Get
80: Set(ByVal value As String)
81: _ModemCommand = value
82: End Set
83: End Property
84: Shared _SearchType As ExecType
85: Public Shared Property SearchType() As ExecType
86: Get
87: Return _SearchType
88: End Get
89: Set(ByVal value As ExecType)
90: _SearchType = value
91: End Set
92: End Property
93: Shared _PortName As ExecPortName
94: Public Shared Property PortName() As ExecPortName
95: Get
96: Return _PortName
97: End Get
98: Set(ByVal value As ExecPortName)
99: _PortName = value
100: End Set
101: End Property
102: Shared _Speed As ExecSpeed
103: Public Shared Property Speed() As ExecSpeed
104: Get
105: Return _Speed
106: End Get
107: Set(ByVal value As ExecSpeed)
108: _Speed = value
109: End Set
110: End Property
111: Shared _Parity As ExecParity
112: Public Shared Property Parity() As ExecParity
113: Get
114: Return _Parity
115: End Get
116: Set(ByVal value As ExecParity)
117: _Parity = value
118: End Set
119: End Property
120: Shared _Databits As ExecDatabits = 8
121: Public Shared Property Databits() As ExecDatabits
122: Get
123: Return _Databits
124: End Get
125: Set(ByVal value As ExecDatabits)
126: _Databits = value
127: End Set
128: End Property
129: Shared _Stopbits As ExecStopBits = ExecStopBits.One
130: Public Shared Property Stopbits() As ExecStopBits
131: Get
132: Return _Stopbits
133: End Get
134: Set(ByVal value As ExecStopBits)
135: _Stopbits = value
136: End Set
137: End Property
138: Shared _Listing As ExecListingType = ExecListingType.Full
139: Public Shared Property Listing() As ExecListingType
140: Get
141: Return _Listing
142: End Get
143: Set(ByVal value As ExecListingType)
144: _Listing = value
145: End Set
146: End Property
147: Shared _TuningSleep As Integer = 100
148: Public Shared Property TuningSleep() As Integer
149: Get
150: Return _TuningSleep
151: End Get
152: Set(ByVal value As Integer)
153: _TuningSleep = value
154: End Set
155: End Property
156:
157: End Class
Этот класс - моя старинная обертка работы с COM-портом, основа работы моих многих-многих прог:
1: Public Class Port
2:
3: Shared _ComPort As IO.Ports.SerialPort
4: Public Shared ReadOnly Property ComPort() As IO.Ports.SerialPort
5: Get
6: Return _ComPort
7: End Get
8: End Property
9:
10: Public Enum Speed
11: s110 = 110
12: s300 = 300
13: s1200 = 1200
14: s2400 = 2400
15: s4800 = 4800
16: s9600 = 9600
17: s19200 = 19200
18: s38400 = 38400
19: s57600 = 57600
20: s115200 = 115200
21: s230400 = 230400
22: End Enum
23: Shared _ComPort_Speed As Speed = Speed.s115200
24: Public Shared Property ComPort_Speed() As Speed
25: Get
26: Return _ComPort_Speed
27: End Get
28: Set(ByVal value As Speed)
29: _ComPort_Speed = value
30: End Set
31: End Property
32:
33: Shared _ComPort_Parity As IO.Ports.Parity = IO.Ports.Parity.None
34: Public Shared Property ComPort_Parity() As IO.Ports.Parity
35: Get
36: Return _ComPort_Parity
37: End Get
38: Set(ByVal value As IO.Ports.Parity)
39: _ComPort_Parity = value
40: End Set
41: End Property
42:
43: Public Enum Databits
44: d5 = 5
45: d6 = 6
46: d7 = 7
47: d8 = 8
48: End Enum
49: Shared _ComPort_Databits As Databits = Databits.d8
50: Public Shared Property ComPort_Databits() As Databits
51: Get
52: Return _ComPort_Databits
53: End Get
54: Set(ByVal value As Databits)
55: _ComPort_Databits = value
56: End Set
57: End Property
58:
59: Shared _ComPort_StopBits As IO.Ports.StopBits = IO.Ports.StopBits.One
60: Public Shared Property ComPort_StopBits() As IO.Ports.StopBits
61: Get
62: Return _ComPort_StopBits
63: End Get
64: Set(ByVal value As IO.Ports.StopBits)
65: _ComPort_StopBits = value
66: End Set
67: End Property
68:
69: Shared _ReadTimeout As Integer = 1000
70: Public Shared Property ReadTimeout() As Integer
71: Get
72: Return _ReadTimeout
73: End Get
74: Set(ByVal value As Integer)
75: _ReadTimeout = value
76: End Set
77: End Property
78:
79: Shared _ComPortName As String
80: Public Shared Sub Open(ByVal ComPortName As String)
81: _ComPortName = ComPortName
82: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
83: _ComPort.ReadTimeout = ReadTimeout
84: End Sub
85:
86: Public Shared Sub Open(ByVal ComPortName As String, ByVal ComPortSpeed As Speed)
87: _ComPortName = ComPortName
88: _ComPort_Speed = ComPortSpeed
89: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
90: _ComPort.ReadTimeout = ReadTimeout
91: End Sub
92:
93: Public Shared Sub Open(ByVal ComPortName As String, ByVal ComPortSpeed As Speed, ByVal ComPortParity As IO.Ports.Parity)
94: _ComPortName = ComPortName
95: _ComPort_Speed = ComPortSpeed
96: _ComPort_Parity = ComPortParity
97: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
98: _ComPort.ReadTimeout = ReadTimeout
99: End Sub
100:
101: Public Shared Sub Open(ByVal ComPortName As String, ByVal ComPortSpeed As Speed, ByVal ComPortParity As IO.Ports.Parity, ByVal ComPortDatabits As Databits)
102: _ComPortName = ComPortName
103: _ComPort_Speed = ComPortSpeed
104: _ComPort_Parity = ComPortParity
105: _ComPort_Databits = ComPortDatabits
106: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
107: _ComPort.ReadTimeout = ReadTimeout
108: End Sub
109:
110: Public Shared Sub Open(ByVal ComPortName As String, ByVal ComPortSpeed As Speed, ByVal ComPortParity As IO.Ports.Parity, ByVal ComPortDatabits As Databits, ByVal ComPortStopBits As IO.Ports.StopBits)
111: _ComPortName = ComPortName : _ComPort.PortName = ComPortName
112: _ComPort_Speed = ComPortSpeed : _ComPort.BaudRate = ComPortSpeed
113: _ComPort_Parity = ComPortParity : _ComPort.Parity = ComPortParity
114: _ComPort_Databits = ComPortDatabits : _ComPort.DataBits = ComPortDatabits
115: _ComPort_StopBits = ComPortStopBits : _ComPort.StopBits = ComPortStopBits
116: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
117: _ComPort.ReadTimeout = ReadTimeout
118: End Sub
119:
120: Public Shared Sub Open(ByVal ComPortName As String, ByVal ComPortSpeed As Speed, ByVal ComPortParity As IO.Ports.Parity, ByVal ComPortDatabits As Databits, ByVal ComPortStopBits As IO.Ports.StopBits, ByVal ReadTimeout As Integer)
121: _ComPortName = ComPortName
122: _ComPort_Speed = ComPortSpeed
123: _ComPort_Parity = ComPortParity
124: _ComPort_Databits = ComPortDatabits
125: _ComPort_StopBits = ComPortStopBits
126: _ReadTimeout = ReadTimeout
127: _ComPort = My.Computer.Ports.OpenSerialPort(_ComPortName, _ComPort_Speed, _ComPort_Parity, _ComPort_Databits, _ComPort_StopBits)
128: _ComPort.ReadTimeout = ReadTimeout
129: End Sub
130:
131: Public Shared Sub Close()
132: _ComPort.Close()
133: End Sub
134:
135: Public Shared Function GetPortStatus() As String
136: Dim Str1 As New Text.StringBuilder
137: Str1.AppendLine(ComPort.PortName & " State :")
138: Str1.AppendLine("----------------------------------------")
139: Str1.AppendLine("IsOpen : " & ComPort.IsOpen)
140: Str1.AppendLine("BaudRate : " & ComPort.BaudRate)
141: Str1.AppendLine("Parity : " & ComPort.Parity)
142: Str1.AppendLine("DataBits : " & ComPort.DataBits)
143: Str1.AppendLine("StopBits : " & ComPort.StopBits)
144: Str1.AppendLine("BreakState : " & ComPort.BreakState)
145: Str1.AppendLine("CDHolding : " & ComPort.CDHolding)
146: Str1.AppendLine("CtsHolding : " & ComPort.CtsHolding)
147: Str1.AppendLine("DsrHolding : " & ComPort.DsrHolding)
148: Str1.AppendLine("RtsEnable : " & ComPort.RtsEnable)
149: Str1.AppendLine("Handshake : " & ComPort.Handshake)
150: Str1.AppendLine("BytesToRead : " & ComPort.BytesToRead)
151: Str1.AppendLine("BytesToWrite : " & ComPort.BytesToWrite)
152: Str1.AppendLine("ReadBufferSize : " & ComPort.ReadBufferSize)
153: Str1.AppendLine("WriteBufferSize : " & ComPort.WriteBufferSize)
154: Str1.AppendLine("Encoding : " & ComPort.Encoding.EncodingName)
155: Str1.AppendLine("ReadTimeout : " & ComPort.ReadTimeout)
156: Str1.AppendLine("WriteTimeout : " & ComPort.WriteTimeout)
157: Str1.AppendLine("InfiniteTimeout : " & IO.Ports.SerialPort.InfiniteTimeout)
158: Str1.AppendLine("DiscardNull : " & ComPort.DiscardNull)
159: Str1.AppendLine("ParityReplace : " & ComPort.ParityReplace)
160: Str1.AppendLine("ReceivedBytesThreshold: " & ComPort.ReceivedBytesThreshold)
161: Str1.AppendLine("----------------------------------------")
162: Return Str1.ToString
163: End Function
164:
165:
166: Public Shared Sub Write(ByVal Buf() As Byte)
167: _ComPort.Write(Buf, 0, Buf.Length)
168: End Sub
169:
170: Shared _CharSet() As Byte = {&H20, &H21, &H22, &H23, &H24, &H25, &H26, &H27, &H28, &H29, &H2A, &H2B, &H2C, &H2D, &H2E, &H2F, _
171: &H30, &H31, &H32, &H33, &H34, &H35, &H36, &H37, &H38, &H39, &H3A, &H3B, &H3C, &H3D, &H3E, &H3F, _
172: &H40, &H41, &H42, &H43, &H44, &H45, &H46, &H47, &H48, &H49, &H4A, &H4B, &H4C, &H4D, &H4E, &H4F, _
173: &H50, &H51, &H52, &H53, &H54, &H55, &H56, &H57, &H58, &H59, &H5A, &H5B, &H5C, &H5D, &H5E, &H5F, _
174: &H60, &H61, &H62, &H63, &H64, &H65, &H66, &H67, &H68, &H69, &H6A, &H6B, &H6C, &H6D, &H6E, &H6F, _
175: &H70, &H71, &H72, &H73, &H74, &H75, &H76, &H77, &H78, &H79, &H7A, &H7B, &H7C, &H7D, &H7E, &H7F, _
176: &H80, &H81, &H82, &H83, &H84, &H85, &H86, &H87, &H88, &H89, &H8A, &H8B, &H8C, &H8D, &H8E, &H8F, _
177: &H90, &H91, &H92, &H93, &H94, &H95, &H96, &H97, &H98, &H99, &H9A, &H9B, &H9C, &H9D, &H9E, &H9F, _
178: &HA0, &HA1, &HA2, &HA3, &HA4, &HA5, &HA6, &HA7, &HA8, &HA9, &HAA, &HAB, &HAC, &HAD, &HAE, &HAF, _
179: &HB0, &HB1, &HB2, &HB3, &HB4, &HB5, &HB6, &HB7, &HB8, &HB9, &HBA, &HBB, &HBC, &HBD, &HBE, &HBF, _
180: &HC0, &HC1, &HC2, &HC3, &HC4, &HC5, &HC6, &HC7, &HC8, &HC9, &HCA, &HCB, &HCC, &HCD, &HCE, &HCF, _
181: &HD0, &HD1, &HD2, &HD3, &HD4, &HD5, &HD6, &HD7, &HD8, &HD9, &HDA, &HDB, &HDC, &HDD, &HDE, &HDF, _
182: &HE0, &HE1, &HE2, &HE3, &HE4, &HE5, &HE6, &HE7, &HE8, &HE9, &HEA, &HEB, &HEC, &HED, &HEE, &HEF, _
183: &HF0, &HF1, &HF2, &HF3, &HF4, &HF5, &HF6, &HF7, &HF8, &HF9, &HFA, &HFB, &HFC, &HFD, &HFE, &HFF}
184:
185: Public Shared ReadOnly Property CharSet()
186: Get
187: Return _CharSet
188: End Get
189: End Property
190:
191: Public Shared ReadOnly Property CharsetLength() As Integer
192: Get
193: Return 224
194: End Get
195: End Property
196:
197: Public Shared Sub WriteCharSetAll()
198: _ComPort.Write(_CharSet, 0, _CharSet.Length)
199: End Sub
200:
201: Public Shared Sub WriteCharSetRow()
202: _ComPort.Write(vbCrLf)
203: For i = 0 To 13
204: _ComPort.Write(_CharSet, i * 16, 16)
205: _ComPort.Write(vbCrLf)
206: Next
207: End Sub
208:
209: Public Shared Function ByteToString(ByVal ByteArray() As Byte) As String
210: Dim Str1 As New Text.StringBuilder
211: For i As Integer = 0 To ByteArray.Length - 1
212: Str1.Append(String.Format("{0:X2} ", ByteArray(i)))
213: Next
214: Return Str1.ToString
215: End Function
216:
217:
218: End Class
И последний класс - это небольшой фрагмент моего OpenSource драйвера для принтеров VKP-80, который тут используется для инициализации принтера, печати состояния принтера и прошивки его набора символов:
1: ''' <summary>
2: ''' This is a small fragment of my freeware opensource driver on CUSTOM VKP80II driver http://freeware.vb-net.com/Default.aspx?Product_ID=0d8f5276-badf-4cfb-8155-f57e8002130a
3: ''' </summary>
4: Public Class VKP80_CMD
5: Inherits Port
6:
7: Private Shared Function ReadStatus() As Byte()
8: Dim I As Integer
9: Dim Y() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
10: For I = 0 To Y.Length - 1
11: Y(I) = 0
12: Next
13: For I = 0 To Y.Length - 1
14: 'ключевое местечко - время задержки подобрано опытным путем
15: System.Threading.Thread.Sleep(100)
16: If ComPort.BytesToRead > 0 Then
17: Y(I) = CByte(ComPort.ReadByte)
18: Else
19: Exit For
20: End If
21: Next
22: ReDim Preserve Y(I - 1)
23: Return Y
24: End Function
25:
26: Public Shared Function GetPrinterStatus() As String
27: Dim Str1 As New Text.StringBuilder
28: Str1.AppendLine("VKP80II State :")
29: Str1.AppendLine("----------------------------------------")
30: Str1.AppendLine("FullStatus : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.FullStatus)))
31: Str1.AppendLine("ErrorStatus : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.ErrorStatus)))
32: Str1.AppendLine("PrinterStatus : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.PrinterStatus)))
33: Str1.AppendLine("PrintStatus : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.PrintStatus)))
34: Str1.AppendLine("OfflineStatus : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.OfflineStatus)))
35: Str1.AppendLine("RollSensor : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Realtime_status_transmission(VKP80_CMD.RequestType.PaperRollSensorStatus)))
36: Str1.AppendLine("EjectorSensor : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Ejector_commands(6)))
37: Str1.AppendLine("PaperEndSensor : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Transmit_status(1)))
38: Str1.AppendLine("PrinterID1 : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Transmit_printer_ID(1)))
39: Str1.AppendLine("PrinterID2 : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Transmit_printer_ID(2)))
40: Str1.AppendLine("PrinterID3 : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Transmit_printer_ID(3)))
41: Str1.AppendLine("Cuts : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Reading_number_of_cuts_performed_from_the_printer))
42: Str1.AppendLine("PowerUp : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Reading_number_of_power_up))
43: Str1.AppendLine("Retracting : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Reading_number_of_retracting))
44: Str1.AppendLine("PaperLength1 : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Reading_of_length_cm_of_printed_paper))
45: Str1.AppendLine("PaperLength2 : " & VKP80_CMD.ByteToString(VKP80_CMD.CMDSTATUS_Reading_of_length_paper_cm_available_before_virtual_paper_end))
46: Str1.AppendLine("----------------------------------------")
47: Return Str1.ToString
48: End Function
49:
50: #Region "Статусы принтера и статистика"
51:
52: 'Printer Sensor:
53: '1. Head temperature
54: '2. Black mark
55: '3. Paper end
56: '4. Ticket presence on output
57: '5. Opening of printing unit
58: '6. Near paper end on roll support is optional
59: 'Public Overloads Shared Function _CMD_Ejector_commands()
60:
61: ''' <summary>
62: ''' Near paper-end sensor and Paper-end sensor
63: ''' </summary>
64: Shared Function CMDSTATUS_Transmit_parer_sensor_status() As Byte()
65: Dim X() As Byte = {&H1B, &H76}
66: Port.Write(X)
67: Return ReadStatus()
68: End Function
69:
70: ''' <summary>
71: ''' Near paper-end sensor and Paper-end sensor
72: ''' </summary>
73: ''' <param name="n">n = 1, 49</param>
74: Shared Function CMDSTATUS_Transmit_status(ByVal n As Integer) As Byte()
75: Dim X() As Byte = {&H1D, &H72, CByte(n)}
76: Port.Write(X)
77: Return ReadStatus()
78: End Function
79:
80: ''' <summary>
81: ''' Transmits the printer ID speci?ed by n follows
82: ''' </summary>
83: ''' <param name="n">1 ? n ? 3, 49 ? n ? 51</param>
84: Shared Function CMDSTATUS_Transmit_printer_ID(ByVal n As Integer) As Byte()
85: Dim X() As Byte = {&H1D, &H49, CByte(n)}
86: Port.Write(X)
87: Return ReadStatus()
88: End Function
89:
90: ''' <summary>
91: ''' Transmits the selected printer status speci?ed by n in real time according to the following parameters:
92: ''' n = 1 transmit printer status
93: ''' n = 2 transmit off-line status
94: ''' n = 3 transmit error status
95: ''' n = 4 transmit paper roll sensor status
96: ''' n = 17 transmit print status
97: ''' n = 20 transmit FULL STATUS
98: ''' This command is executed when the data buffer is full.
99: ''' This status is transmitted whenever data sequence $10 $04 n is received.
100: ''' </summary>
101: ''' <param name="n">1 ? n ? 4; n=17, n=20</param>
102: Public Shared Function CMDSTATUS_Realtime_status_transmission(ByVal n As Integer) As Byte()
103: Dim X() As Byte = {&H10, &H4, CByte(n)}
104: Port.Write(X)
105: Return ReadStatus()
106: End Function
107:
108: Public Enum RequestType
109: PrinterStatus = 1
110: OfflineStatus = 2
111: ErrorStatus = 3
112: PaperRollSensorStatus = 4
113: PrintStatus = 17
114: FullStatus = 20
115: End Enum
116:
117: Public Shared Function CMDSTATUS_Realtime_status_transmission(ByVal Request As RequestType) As Byte()
118: Return VKP80_CMD.CMDSTATUS_Realtime_status_transmission(CInt(Request))
119: End Function
120:
121: ''' <summary>
122: ''' This command handles tickets ejector:
123: ''' n = 1
124: ''' n = 2 Execute a ticket retract (only if Paper retracting is enabled)
125: ''' n = 3 Produce a ticket with m steps (1 step = 7.3 mm)
126: ''' n = 5 Eject ticket
127: ''' n = 6 Transmit the status byte of the ejector
128: ''' </summary>
129: Shared Function CMDSTATUS_Ejector_commands(ByVal n As Integer, ByVal m As Integer) As Byte()
130: Dim X() As Byte = {&H1D, &H65, CByte(n), CByte(m)}
131: Port.Write(X)
132: Return ReadStatus()
133: End Function
134:
135: Shared Function CMDSTATUS_Ejector_commands(ByVal n As Integer) As Byte()
136: Dim X() As Byte = {&H1D, &H65, CByte(n)}
137: Port.Write(X)
138: Return ReadStatus()
139: End Function
140:
141: ''' <summary>
142: ''' Reading of length (cm) paper available before virtual paper-end.
143: ''' The command return a string pointing out how much paper is available, for example if there are 5.1 m before the paper end, it will be: ‘510cm’
144: ''' • The lenght of residual paper reported is just as an indication because tolerances and other factors are not taken into consideration (paper thickness, roll core diameter, roll core thickness). The virtual paper-end limit is set by the command $1D $E6.
145: ''' • To set virtual paper-end limit, measure the length of the paper from near paper end to the end of the roll, using several of them.
146: ''' </summary>
147: Shared Function CMDSTATUS_Reading_of_length_paper_cm_available_before_virtual_paper_end() As Byte()
148: Dim X() As Byte = {&H1D, &HE1}
149: Port.Write(X)
150: Return ReadStatus()
151: End Function
152: ''' <summary>
153: ''' The command return a string that points out how many cuts are performed by the printer, for example if there are performed 2376 cuts, it will be: ‘2376 cuts’
154: ''' </summary>
155: Shared Function CMDSTATUS_Reading_number_of_cuts_performed_from_the_printer() As Byte()
156: Dim X() As Byte = {&H1D, &HE2}
157: Port.Write(X)
158: Return ReadStatus()
159: End Function
160: ''' <summary>
161: ''' The command return a string pointing out how much paper is printed, for example if the printer has print about 2515,5 m, it will be: ‘251550cm’
162: ''' </summary>
163: Shared Function CMDSTATUS_Reading_of_length_cm_of_printed_paper() As Byte()
164: Dim X() As Byte = {&H1D, &HE3}
165: Port.Write(X)
166: Return ReadStatus()
167: End Function
168: ''' <summary>
169: ''' • The command return a string pointing out the number of retracting of the printer, for example if the printer has retracted the paper 512 times, it will be: ‘512ret’
170: ''' </summary>
171: Shared Function CMDSTATUS_Reading_number_of_retracting() As Byte()
172: Dim X() As Byte = {&H1D, &HE4}
173: Port.Write(X)
174: Return ReadStatus()
175: End Function
176: ''' <summary>
177: ''' Reading number of power up of the printer.
178: ''' • The command return a string pointing out the number of turning on of the printer, for example if the printer is turned on 512 times, it will be: ‘512on’
179: ''' </summary>
180: Shared Function CMDSTATUS_Reading_number_of_power_up() As Byte()
181: Dim X() As Byte = {&H1D, &HE5}
182: Port.Write(X)
183: Return ReadStatus()
184: End Function
185:
186: #End Region
187:
188: ''' <summary>
189: ''' Clears the data in the print buffer and resets the printer mode to that in effect when power was turned on.
190: ''' • The data in the receiver buffer is not cleared.
191: ''' • The macro de?nitions are not cleared.
192: ''' </summary>
193: Shared Sub CMD_Initialize_printer()
194: Dim X() As Byte = {&H1B, &H40}
195: Port.Write(X)
196: End Sub
197:
198: #Region "Простейшие команды"
199:
200: ''' <summary>
201: ''' Moves print position to previous character
202: ''' </summary>
203: Shared Sub CMDSIMPLE_Back_space()
204: Dim X() As Byte = {&H8}
205: Port.Write(X)
206: End Sub
207: ''' <summary>
208: ''' Ignored unless the next horizontal tab position has been set
209: ''' If the command is received when the printing position is at the right margin,
210: ''' the printer executes print buffer full printing and horizontal tab processing from the beginning of the next line.
211: '''</summary>
212: Shared Sub CMDSIMPLE_Horizontal_tab()
213: Dim X() As Byte = {&H9}
214: Port.Write(X)
215: End Sub
216: ''' <summary>
217: ''' Sets the print position to the beginning of the line
218: ''' </summary>
219: Shared Sub CMDSIMPLE_Print_and_line_feed()
220: Dim X() As Byte = {&HA}
221: Port.Write(X)
222: End Sub
223: ''' <summary>
224: ''' Prints the data in the buffer, cuts the paper and presents the ticket.
225: ''' </summary>
226: Shared Sub CMDSIMPLE_Form_feed()
227: Dim X() As Byte = {&HC}
228: Port.Write(X)
229: End Sub
230: ''' <summary>
231: ''' Sets the print position to the beginning of the line. See “Autofeed in setup” parameter.
232: ''' When autofeed is “CR enabled”, this command functions in the same way as $0A, otherwise it is disregarded.
233: ''' </summary>
234: Shared Sub CMDSIMPLE_Print_and_carriage_return()
235: Dim X() As Byte = {&HD}
236: Port.Write(X)
237: End Sub
238:
239:
240: #End Region
241:
242:
243: End Class
|