<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Работа с COM портом для микроконтроллеров]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=12659&amp;type=atom" />
	<updated>2017-05-14T11:20:59Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=12659</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115836#p115836" />
			<content type="html"><![CDATA[<p>Нет. Некогда.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-14T11:20:59Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115836#p115836</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115828#p115828" />
			<content type="html"><![CDATA[<p>Не проверяли?</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-05-14T06:57:47Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115828#p115828</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115742#p115742" />
			<content type="html"><![CDATA[<p>Сейчас на руках нет этого (UPort 1150I) устройства, на работе проверю.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-08T05:09:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115742#p115742</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115726#p115726" />
			<content type="html"><![CDATA[<p>У меня в скобках везде прописан номер порта, и caption = name.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-05-07T18:37:10Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115726#p115726</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115725#p115725" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>В классе такого свойства не нашел.</p></blockquote></div><p>А в Caption не пишется?</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2017-05-07T18:32:03Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115725#p115725</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115713#p115713" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>т.к. у некоторых устройств, в имени, в скобках не пишут номер порта</p></blockquote></div><p>Не встречал, значит только реестр.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-05-07T15:59:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115713#p115713</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115697#p115697" />
			<content type="html"><![CDATA[<p><strong>serzh82saratov</strong>, думаю такой вариант не подойдёт, т.к. у некоторых устройств, в имени, в скобках не пишут номер порта. Или в объекте есть отдельное свойство где прописан номер порта?</p><p>В <a href="https://msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx">классе</a> такого свойства не нашел.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-07T05:43:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115697#p115697</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115694#p115694" />
			<content type="html"><![CDATA[<p>Тесты производительности не делал, попробуйте сравнить сами:<br /></p><div class="codebox"><pre><code>	For device in ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_PnPEntity Where ClassGuid = &#039;{4d36e978-e325-11ce-bfc1-08002be10318}&#039;&quot;) 
	{
		MsgBox % device.name
	}</code></pre></div><p>В коллекции надо добавлять ссылку на обсуждение.</p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2017-05-06T18:09:16Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115694#p115694</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115692#p115692" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>длина</p></blockquote></div><p>Всё сложно <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-06T16:56:36Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115692#p115692</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115688#p115688" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>длинна</p></blockquote></div><p>Вообще-то, длина.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2017-05-06T11:45:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115688#p115688</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115685#p115685" />
			<content type="html"><![CDATA[<p>Проверить нечем, но добавить в Коллекцию безусловно нужно.</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2017-05-06T10:02:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115685#p115685</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Работа с COM портом для микроконтроллеров]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=115683#p115683" />
			<content type="html"><![CDATA[<p>Скрипт отправляет данные в последовательный COM Port и затем читает ответные данные из буфера КОМ Порта.</p><p>Скрипт делался для микроконтроллера Ардуино (Arduino) для снятия данных и управления микроконтроллером (скетчи для ардуины могу дать если кому надо).</p><p>Но подойдет для любых других целей связи с ком портом.</p><p><a href="https://autohotkey.com/board/topic/26231-serial-com-port-console-script/">Источник.</a></p><p><a href="http://forum.script-coding.com/viewtopic.php?id=12662">Ссылка на коллекцию.</a></p><p>Читайте комментарии.<br /></p><div class="codebox"><pre><code>#SingleInstance,Force
CoordMode,ToolTip
SetBatchLines,-1
SetWorkingDir,%A_ScriptDir%
OnExit,EXIT

DebugMode=1 ; показывать отладочную информацию

global COMFail ; 1 - ошибка ком порта
tie_interval=100 ; начальный интервал связи, если длина запрошенных
                ; и полученных байт будет отличаться - интервал увеличится

PortName:=&quot;USB-SERIAL CH340&quot; ; имя порта для автоматического поиска

Receive_Data_Size=32 ; длина запрошенных из порта байт
Send_Data_Size=32    ; длина отправляемых в порт байт

loop ; основной цикл
{
  sleep,10
  Loop_Time:=oldLoop_Time!=&quot;&quot; ? a_tickcount-oldLoop_Time : 0 ; вычисляем время одного цикла
  oldLoop_Time:=a_tickcount

  if (!RS232_FileHandle or COMFail) ; если хэндл порта не взят или ошибка ком порта
  {
    COMFail=0
    ; повторно искать порт и брать хэндл
    RS232_FileHandle:=Get_RS232_FileHandle(COMPort:=Seach_COM(PortName))
  ;RS232_FileHandle:=Get_RS232_FileHandle(COMPort:=&quot;COM2&quot;) ; вместо поиска можно жёстко задать порт
    ; Get_RS232_FileHandle(номер порта, скорость связи в бодах, четность, битность, стоповые биты)

  }
  if RS232_FileHandle ; если хендл есть, читаем и пишем в порт
  {
    if (!tie:=tie&gt;tie_interval ? 0 : tie=&quot;&quot; ? 1 : tie+Loop_Time) ; с интервалом в tie_interval милисекунд
    {
      ; данные для отправки
      b_0=0          ; 1 байт
      b_1++          ; 1 байт
      b_2=255        ; 1 байт
      w_0=1234567890 ; 4 байта
      b_3=128        ; 1 байт

      varsetcapacity(Out_Data,Send_Data_Size) ; задаём размер переменной для отправки
      NumPut(b_0,Out_Data,0,&quot;Uchar&quot;)          ; 1 байт
      NumPut(b_1,Out_Data,1,&quot;Uchar&quot;)          ; 1 байт
      NumPut(b_2,Out_Data,2,&quot;Uchar&quot;)          ; 1 байт
      NumPut(w_0,Out_Data,3,&quot;Uint&quot;)           ; 4 байта
      NumPut(b_3,Out_Data,7,&quot;Uchar&quot;)          ; 1 байт
                                              ; остальные байты резервные

      ; пишем данные в порт
      RS232_Write(RS232_FileHandle,&amp;Out_Data,Send_Data_Size)

      ; читаем ответ от порта в переменную In_Data
      varsetcapacity(In_Data,Receive_Data_Size)
      RS232_Read(RS232_FileHandle,Receive_Data_Size,RS232_Bytes_Received,In_Data)

      ; если длина запрошенных и полученных байт одинакова выполняем присвоение переменным
      if (RS232_Bytes_Received==Receive_Data_Size)
      {
        ; пишем полученные данные в свои переменные
        b0:=numget(In_Data,0,&quot;uchar&quot;)		; 1 байт
        b1:=numget(In_Data,1,&quot;uchar&quot;)		; 1 байт
        b2:=numget(In_Data,2,&quot;uchar&quot;)		; 1 байт
        b3:=numget(In_Data,3,&quot;uchar&quot;)		; 1 байт
        b4:=numget(In_Data,4,&quot;uchar&quot;)		; 1 байт
        b5:=numget(In_Data,5,&quot;uchar&quot;)		; 1 байт
        b6:=numget(In_Data,6,&quot;uchar&quot;)		; 1 байт
        b7:=numget(In_Data,7,&quot;uchar&quot;)		; 1 байт
        w0:=numget(In_Data,8,&quot;ulong&quot;)		; 4 байта
      }
      else ; если не одинакова - увеличиваем интервал между запросами
      {
        tie_interval+=1
        if tie_interval&gt;500 ; максимально возможный интервал
          tie_interval=100
      }

      if DebugMode ; показывать отладочную информацию
      {            ; перечислять все полученные байты, независимо от типов данных
        v=
        loop,% RS232_Bytes_Received
        {
          tmp:=numget(In_Data,a_index-1,&quot;uchar&quot;)
          v.=a_index-1 &quot;`t&quot; format(&quot;0x{:02x}&quot;,tmp) &quot;  &quot; tmp &quot;`n&quot;
        }
        tooltip,
(
COMPort=%COMPort%
COM handle=%RS232_FileHandle%
Bytes Received=%RS232_Bytes_Received%/%Receive_Data_Size%

Recieved data:
%v%
),400,0,2
      }

      ; выводим на экран
      tooltip,% &quot;b0=&quot; b0+0 &quot;`nb1=&quot; b1+0 &quot;`nb2=&quot; b2+0 &quot;`nb3=&quot; b3+0 &quot;`nb4=&quot; b4+0 &quot;`nb5=&quot; b5+0 &quot;`nb6=&quot; b6+0 &quot;`nb7=&quot; b7+0 &quot;`nw0=&quot; w0+0
    }
  }
}
return


esc::
EXIT:
if RS232_FileHandle
  RS232_Close(RS232_FileHandle)
exitapp

Seach_COM(name)
{
  Loop,HKLM,HARDWARE\DEVICEMAP\SERIALCOMM\
  {
    RegRead,COMPort
    com.=COMPort &quot;|&quot;
    num++
  }
  loop,parse,com,|
  {
    if !A_loopfield
      continue
    COMPort:=A_loopfield
    Loop,HKLM,SYSTEM\CurrentControlSet\Enum,1,1
    {
      if (A_LoopRegName=&quot;PortName&quot;)
      {
        RegRead,Outputvar
        if (Outputvar=COMPort)
        {
          RegRead,FriendlyName,% A_LoopRegKey,% RegExReplace(A_LoopRegSubKey, &quot;(.*)\\Device Parameters&quot;, &quot;$1&quot;),FriendlyName
          if InStr(FriendlyName,name)
            return COMPort
        }
      }
    }
  }
}

Get_RS232_FileHandle(RS232_Port,RS232_Baud=9600,RS232_Parity=&quot;N&quot;,RS232_Data=8,RS232_Stop=1)
{
  sleep,1000
  RS232_Settings = %RS232_Port%:baud=%RS232_Baud% parity=%RS232_Parity% data=%RS232_Data% stop=%RS232_Stop% dtr=Off xon=off to=off odsr=off octs=off rts=off idsr=off
  return RS232_Initialize(RS232_Settings)
}

RS232_Initialize(RS232_Settings)
{
  ;###### Extract/Format the RS232 COM Port Number ######
  ;7/23/08 Thanks krisky68 for finding/solving the bug in which RS232 COM Ports greater than 9 didn&#039;t work.
  StringSplit, RS232_Temp, RS232_Settings, `:
  RS232_Temp1_Len := StrLen(RS232_Temp1)  ;For COM Ports &gt; 9 \\.\ needs to prepended to the COM Port name.
  If (RS232_Temp1_Len &gt; 4)                   ;So the valid names are
    RS232_COM = \\.\%RS232_Temp1%             ; ... COM8  COM9   \\.\COM10  \\.\COM11  \\.\COM12 and so on...
  Else                                          ;
    RS232_COM = %RS232_Temp1%

  ;8/10/09 A BIG Thanks to trenton_xavier for figuring out how to make COM Ports greater than 9 work for USB-Serial Dongles.
  StringTrimLeft, RS232_Settings, RS232_Settings, RS232_Temp1_Len+1 ;Remove the COM number (+1 for the semicolon) for BuildCommDCB.
  ;MsgBox, RS232_COM=%RS232_COM% `nRS232_Settings=%RS232_Settings%

  ;###### Build RS232 COM DCB ######
  ;Creates the structure that contains the RS232 COM Port number, baud rate,...
  VarSetCapacity(DCB, 28)
  BCD_Result := DllCall(&quot;BuildCommDCB&quot;
      ,&quot;str&quot; , RS232_Settings ;lpDef
      ,&quot;ptr&quot;, &amp;DCB)        ;lpDCB
;  If (BCD_Result != 1)
;  {
;    MsgBox, There is a problem with Serial Port communication. `nFailed Dll BuildCommDCB, BCD_Result=%BCD_Result% `nThe Script Will Now COMFail.`n %DCB%
;    COMFail=1
;    return
;  }

  ;###### Create RS232 COM File ######
  ;Creates the RS232 COM Port File Handle
  RS232_FileHandle := DllCall(&quot;CreateFile&quot;
      ,&quot;Str&quot; , RS232_COM    ;File Name
      ,&quot;UInt&quot;, 0xC0000000   ;Desired Access
      ,&quot;UInt&quot;, 3            ;Safe Mode
      ,&quot;UInt&quot;, 0            ;Security Attributes
      ,&quot;UInt&quot;, 3            ;Creation Disposition
      ,&quot;UInt&quot;, 0            ;Flags And Attributes
      ,&quot;ptr&quot; , 0            ;Template File
      ,&quot;Cdecl Int&quot;)

  If (!RS232_FileHandle)
  {
;;    MsgBox, There is a problem with Serial Port communication. `nFailed Dll CreateFile, RS232_FileHandle=%RS232_FileHandle% `nThe Script Will Now COMFail.
    COMFail=1
    return
  }

  ;###### Set COM State ######
  ;Sets the RS232 COM Port number, baud rate,...
  SCS_Result := DllCall(&quot;SetCommState&quot;
      ,&quot;ptr&quot;, RS232_FileHandle ;File Handle
      ,&quot;ptr&quot;, &amp;DCB)            ;Pointer to DCB structure
  If (SCS_Result!=1)
  {
;;    MsgBox, There is a problem with Serial Port communication. `nFailed Dll SetCommState, SCS_Result=%SCS_Result% `nThe Script Will Now COMFail.
    RS232_Close(RS232_FileHandle)
    COMFail=1
    return
  }

  ;###### Create the SetCommTimeouts Structure ######
  ReadIntervalTimeout        = 0x01000000
  ReadTotalTimeoutMultiplier = 0x00000000
  ReadTotalTimeoutConstant   = 0x00000010
  WriteTotalTimeoutMultiplier= 0x00000000
  WriteTotalTimeoutConstant  = 0x00000010

  VarSetCapacity(Data,20) ; 5 * sizeof(DWORD)
  NumPut(ReadIntervalTimeout,         Data,  0, &quot;UInt&quot;)
  NumPut(ReadTotalTimeoutMultiplier,  Data,  4, &quot;UInt&quot;)
  NumPut(ReadTotalTimeoutConstant,    Data,  8, &quot;UInt&quot;)
  NumPut(WriteTotalTimeoutMultiplier, Data, 12, &quot;UInt&quot;)
  NumPut(WriteTotalTimeoutConstant,   Data, 16, &quot;UInt&quot;)

  ;###### Set the RS232 COM Timeouts ######
  SCT_result := DllCall(&quot;SetCommTimeouts&quot;
    ,&quot;ptr&quot;, RS232_FileHandle ;File Handle
    ,&quot;ptr&quot;, &amp;Data)         ;Pointer to the data structure
  If (SCT_result != 1)
  {
;;    MsgBox, There is a problem with Serial Port communication. `nFailed Dll SetCommState, SCT_result=%SCT_result% `nThe Script Will Now COMFail.
    RS232_Close(RS232_FileHandle)
    COMFail=1
    return
  }
  Return %RS232_FileHandle%
}

RS232_Close(RS232_FileHandle)
{
  return DllCall(&quot;CloseHandle&quot;,&quot;ptr&quot;,RS232_FileHandle)
}

RS232_Write(RS232_FileHandle,Data,Data_Length)
{
  if RS232_FileHandle
  WF_Result := DllCall(&quot;WriteFile&quot;
      ,&quot;ptr&quot; , RS232_FileHandle ;File Handle
      ,&quot;ptr&quot; , Data          ;Pointer to string to send
      ,&quot;UInt&quot;, Data_Length    ;Data Length
      ,&quot;ptr*&quot;, Bytes_Sent     ;Returns pointer to num bytes sent
      ,&quot;Int&quot; , &quot;NULL&quot;)
}

RS232_Read(RS232_FileHandle,Data_Length,ByRef RS232_Bytes_Received,Byref D)
{
  Num_Bytes:=Data_Length*2
;  SetFormat,Integer,HEX
  VarSetCapacity(Data,Num_Bytes,0xff)
  if RS232_FileHandle
  Read_Result := DllCall(&quot;ReadFile&quot;
       ,&quot;ptr&quot; , RS232_FileHandle   ; hFile
       ,&quot;ptr&quot;  , &amp;Data             ; lpBuffer
       ,&quot;Int&quot;  , Num_Bytes        ; nNumberOfBytesToRead
       ,&quot;ptr*&quot;, RS232_Bytes_Received   ; lpNumberOfBytesReceived
       ,&quot;Int&quot;  , 0)               ; lpOverlapped
  If (Read_Result &lt;&gt; 1)
  {
    RS232_Close(RS232_FileHandle)
    COMFail=1
    return
  }
  D:=Data
}
</code></pre></div><p>Скажите, если стоит добавить в коллекцию и что для этого нужно изменить.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2017-05-06T07:12:50Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=115683#p115683</id>
		</entry>
</feed>
