<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: искажение бинарных данных в строковых переменных ?]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=14469&amp;type=atom" />
	<updated>2019-01-05T12:01:01Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=14469</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130859#p130859" />
			<content type="html"><![CDATA[<p><strong>rx3apf</strong></p><div class="quotebox"><blockquote><p>А разве там можно опустить данные для поиска ? Мне-то нужно заменить несколько байтов в известных позициях, но с неизвестным содержимым. А с regexp выйдет примерно столь же коряво, как и с нарезкой-склейкой, и еще проверять надо, как он к бинарным данным отнесется...</p></blockquote></div><p>Теперь понял Вас. Для этого подходят <strong>ADODB.Stream</strong> и <strong>SAPI.SpMemoryStream</strong> и <strong>SAPI.SpFileStream</strong></p><div class="quotebox"><blockquote><p>в unicode не ругается на аргумент, но и в порт идет не бинарник, а юникод, причем вообще какой-то странный, chrw(128) выдается как $4F $4E $02 $00.</p><p>А побайтно .write - тот же самый эффект, для кодов больше $7F ругается...</p></blockquote></div><p>Ну тогда надо изучать вопрос глубже. )</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2019-01-05T12:01:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130859#p130859</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130857#p130857" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>А чем Replace не угодил ? В нём есть позиция начала в строке, количество замен и указание что на что заменять ?</p></blockquote></div><p>А разве там можно опустить данные для поиска ? Мне-то нужно заменить несколько байтов в известных позициях, но с неизвестным содержимым. А с regexp выйдет примерно столь же коряво, как и с нарезкой-склейкой, и еще проверять надо, как он к бинарным данным отнесется...</p><div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p> Попробовать переключить его на TristateTrue (работа в Unicode). Либо чтение делать по Read(1) и Write побайтно.</p></blockquote></div><p>в unicode не ругается на аргумент, но и в порт идет не бинарник, а юникод, причем вообще какой-то странный, chrw(128) выдается как $4F $4E $02 $00.</p><p>А побайтно .write - тот же самый эффект, для кодов больше $7F ругается...</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-05T11:29:48Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130857#p130857</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130856#p130856" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>1. Порт больше COM9 - не понимает</p></blockquote></div><p>Да. Проверил у себя. Интересное наблюдение. Но возможно есть способ обхода.</p><div class="quotebox"><blockquote><p>2. Что делать с таймаутом приема ? Интересно, что если я ожидаю 256, а посылаю меньше, то принятая строка будет содержать именно столько, сколько послано. Т.е. какой-то встроенный таймаут все ж есть (и очень небольшой, поскольку даже цельные блоки 128 байтов &quot;рвутся&quot; и принимаются как несколько фрагментов). А если вообще ничего ?</p></blockquote></div><p>Сразу не скажу. Тут только эксперименты и пробы. ) Честно говоря, я сам тоже первый раз в жизни пробую эту возможность FSO</p><div class="quotebox"><blockquote><p>3. Как быть с дуплексом, когда передаем и принимаем через один порт ? Ну пусть не дуплекс, а полудуплекс, но ведь и открытие/закрытие происходят не мгновенно, так что ответ вполне может быть утерян ?</p></blockquote></div><p>Тоже ещё не проверял. </p><div class="quotebox"><blockquote><p>4. Но самое огорчительное, что с бинарными данными не работает. $00...7F - нормально. А вот если в потоке есть $80 или больше, то &quot;недопустимый вызов или аргумент процедуры&quot;</p></blockquote></div><p>Думаю тут надо поэкспериментировать с параметром Mode - режим открытия файла. Попробовать переключить его на <strong>TristateTrue</strong> (работа в Unicode). Либо чтение делать по Read(1) и Write побайтно.</p><div class="quotebox"><blockquote><p>И попутно еще вопрос (хотя подозреваю, что ответ будет отрицательный) - а нет ли какого-то метода замены одного (ну или нескольких) символов в строке с явным указанием где и сколько и на что заменить, иначе как через склейку mid исходного и новых данных ? Уж больно коряво выходит. Если б mid умела работать и в &quot;обратном&quot; направлении...</p></blockquote></div><p>А чем Replace не угодил ? В нём есть позиция начала в строке, количество замен и указание что на что заменять ? Ну а на крайний случай есть RegExp</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2019-01-05T11:20:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130856#p130856</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130853#p130853" />
			<content type="html"><![CDATA[<p>Любопытно. Оно даже работает. Но:</p><p>1. Порт больше COM9 - не понимает<br />2. Что делать с таймаутом приема ? Интересно, что если я ожидаю 256, а посылаю меньше, то принятая строка будет содержать именно столько, сколько послано. Т.е. какой-то встроенный таймаут все ж есть (и очень небольшой, поскольку даже цельные блоки 128 байтов &quot;рвутся&quot; и принимаются как несколько фрагментов). А если вообще ничего ?<br />3. Как быть с дуплексом, когда передаем и принимаем через один порт ? Ну пусть не дуплекс, а полудуплекс, но ведь и открытие/закрытие происходят не мгновенно, так что ответ вполне может быть утерян ?<br />4. Но самое огорчительное, что с бинарными данными не работает. $00...7F - нормально. А вот если в потоке есть $80 или больше, то &quot;недопустимый вызов или аргумент процедуры&quot;</p><br /><p>И попутно еще вопрос (хотя подозреваю, что ответ будет отрицательный) - а нет ли какого-то метода замены одного (ну или нескольких) символов в строке с явным указанием где и сколько и на что заменить, иначе как через склейку mid исходного и новых данных ? Уж больно коряво выходит. Если б mid умела работать и в &quot;обратном&quot; направлении...</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-05T10:28:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130853#p130853</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130849#p130849" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Я имел в виду, что если readline, то без &lt;cr&gt; ведь строка не отдастся ?</p></blockquote></div><p>Да. Совершенно верно - метод будет ждать появления перевода строки. Поэтому, я уточнил, что можно использовать метод <strong>Read</strong>, чтобы брать нужное количество данных. И ожидать конца данных по <strong>AtEndOfStream</strong></p><div class="quotebox"><blockquote><p>Но подозреваю, что с бинарными данными и там что-нибудь вылезет нехорошее...</p></blockquote></div><p>Да что же Вы так непозитивно настроены ? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Я пока что провёл тест на текстовых данных. Создал виртуальную пару портов используя <strong>Virtual Serial Port Driver</strong>, которые читают и пишут друг в друга крест на крест COM1 и COM2.</p><p>Читаю порт COM2 по 100 символов. Для байт данных можно читать побайтно.<br /></p><div class="codebox"><pre><code>
Option Explicit
Dim oFSO, oCOM
Set oFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set oCOM = oFSO.OpenTextFile(&quot;COM2:9600,N,8,1&quot;,1)
Do
	While Not oCOM.atEndOfStream
		WSH.StdOut.Write oCOM.Read(100)
	Wend
	WSH.Sleep 100
Loop
</code></pre></div><p>Пишу в порт COM1<br /></p><div class="codebox"><pre><code>
Option Explicit
Dim oFSO, oCOM
Set oFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set oCOM = oFSO.OpenTextFile(&quot;COM1:9600,N,8,1&quot;,2)
oCOM.Write &quot;data&quot;
</code></pre></div><p>И данные получаю без искажений. В принципе можно попробовать сделать сэмпл пересылки файла через такую связку.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2019-01-05T09:19:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130849#p130849</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130848#p130848" />
			<content type="html"><![CDATA[<p>Я имел в виду, что если readline, то без &lt;cr&gt; ведь строка не отдастся ? Но подозреваю, что с бинарными данными и там что-нибудь вылезет нехорошее...</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-05T09:06:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130848#p130848</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130845#p130845" />
			<content type="html"><![CDATA[<p><strong>rx3apf</strong>, <br /></p><div class="quotebox"><blockquote><p>Ой, а куда оно (сообщение) исчезло ?</p></blockquote></div><p>Я своё сообщение убрал. ) Решил потестить перед тем как рекомендовать.&nbsp; Но &quot;подопытных&quot; под рукой нет. Потестил на виртуальных портах. Кидает и читает вроде нормально. А что за проблема с &quot;&lt;cr&gt;&quot; ? Думаю можно использовать метод <strong>Read</strong> вместо <strong>ReadLine</strong> и получать нужное количество данных.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2019-01-05T08:35:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130845#p130845</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130842#p130842" />
			<content type="html"><![CDATA[<p>Как я понял, в этом варианте у людей возникли проблемы (да и как предполагается получать строку, если &lt;cr&gt; не будет, например ?). Но уже не помню, попадался ли он мне, когда потребовалось читать из порта. Выбор был или axserial или mscomm32/scomm64. Или winapi через DWX, но моих мозгов на то не хватило...</p><p>Ой, а куда оно (сообщение) исчезло ?</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-04T21:31:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130842#p130842</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130840#p130840" />
			<content type="html"><![CDATA[<p>Ну да, через них и выкрутился...</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-04T18:38:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130840#p130840</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130839#p130839" />
			<content type="html"><![CDATA[<p>На всякий случай — кроме Chr() и Asc() есть функции ChrB()/ChrW() и AscB()/AscW(). Кроме функции Mid(), Left(), Right(), Len() имеют свои байтовые аналоги — функции MidB(), LeftB(), RightB(), LenB().</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2019-01-04T16:48:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130839#p130839</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130832#p130832" />
			<content type="html"><![CDATA[<p>Да, спасибо, я все ж &quot;допер&quot; до этого самостоятельно (получив &quot;целеуказание&quot; на другом форуме). Ларчик просто открывался...</p><p>upd:<br />На самом деле, одна неясность все ж осталась - да, при заполнении, если установлена локаль 1033 или, скажем, 1049, действительно буфер строки заполняется юникодом с ненулевым старшим байтом в &quot;проблемных&quot; позициях (для локалей 1099, 1100 этой проблемы нет, как выяснилось, все строго 0000...00FF). Но и такая, &quot;искаженная&quot; строка, будучи отправлена в порт по .writebytes, как выяснилось, и отправляется нормально, и принимается тоже нормально ! Так что последовательность всех этих преобразований до конца мне все равно непонятна. Ну да ладно, основная проблема вроде как решена...</p><p>upd:<br />Я тут был неправ - если заполняю при локали 1049, то, хоть строка и выглядит &quot;неправильно&quot; в распечатке, отправляется в COM-порт все равно правильно и принимается правильно же. А вот если использую 1033 - и выглядит &quot;неправильно&quot; перед отправкой, и передается с &quot;искажениями&quot; в зоне байтов $80...9F. Как я понимаю, в первом случае (1049) обратное преобразование из юникода идет корректно, а во втором, при 1033, уже нет. Картина прояснилась окончательно.</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-04T08:05:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130832#p130832</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130828#p130828" />
			<content type="html"><![CDATA[<p>Строки в VBS представлены в Unicode, т. е. под каждый символ в памяти отведено 2 байта. Коды диапазона 128..255 представляют различные символы в разных кодовых таблицах, в зависимости от заданной локали. 1033 локали соответствует кодировка <a href="https://ru.wikipedia.org/wiki/ISO_8859-1">Windows-1252</a>, а 1049 - <a href="https://ru.wikipedia.org/wiki/Windows-1251">Windows-1251</a>. Таким образом, вот в этой строке <strong>n = n &amp; chr(i)</strong> происходит преобразование в Unicode символов c кодами 128..255 из кодировки Windows-1252. А после переключения на 1049 локаль, вот в этом выражени <strong>asc(mid(string,i + j,1))</strong> происходит попытка преобразовать символы Unicode, полученные из кодировки Windows-1252, в соответствующие коды в кодировке Windows-1251. Но в таблице символов Windows-1251 нет таких символов, и соответствия найти не удается. В этом случае происходит преобразование в имеющиеся символы без диакритических знаков, либо, если и таких нет, в знаки вопроса. Отсюда и искажение.</p>]]></content>
			<author>
				<name><![CDATA[omegastripes]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29228</uri>
			</author>
			<updated>2019-01-04T03:21:11Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130828#p130828</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: искажение бинарных данных в строковых переменных ?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=130819#p130819" />
			<content type="html"><![CDATA[<p>1. Столкнулся с непонятным (для меня) искажением содержимого переменных, содержащих бинарные данные, при использовании setlocale:<br /></p><div class="codebox"><pre><code>

Option Explicit

dim i,j,n,Reply

SetLocale(1033)

n = &quot;&quot;

for i = 0 to 255
  n = n &amp; chr(i)
next

hexdump n,&quot;&quot;
newline

SetLocale(1049)

hexdump n,&quot;&quot;
newline

&#039;SetLocale(1049)

&#039;hexdump n,&quot;&quot;
&#039;newline

wscript.quit 0


&#039; Распечатка буфера (строковой переменной) в формате ASCII-hex
&#039; В качестве параметров - распечатываемый буфер и строковая переменная,
&#039; подменяющая адрес при распечатке (если задана)

sub HexDump(string,hdr)

dim b, i, j, k
dim DumpStr : DumpStr = &quot;&quot;
dim Header: Header = hdr  &#039; заголовок
k = len(string)           &#039; длина распечатываемого блока

  for i = 1 to k step 16

&#039; Формируем hex-строку

    for j = 0 to 15

      if i + j &lt;= k then
         DumpStr = DumpStr &amp; &quot; &quot; &amp; right(&quot;0&quot; &amp; hex(asc(mid(string,i + j,1))),2)
      else
         DumpStr = DumpStr &amp; &quot;   &quot;
      end if
    next

    DumpStr = DumpStr &amp; &quot;   &quot;

&#039; Формируем ASCII-строку

    for j = 0 to 15

      if i + j &lt;= k then
        b = asc(mid(string,i + j,1))
        if b &gt; 31 and b &lt; 128 then
          DumpStr = DumpStr &amp; chr(b)
        else
          DumpStr = DumpStr &amp; &quot;.&quot;
        end if

      else
         DumpStr = DumpStr &amp; &quot; &quot;
      end if
    next

&#039; Распечатка строки

    if Header &lt;&gt; &quot;&quot; then
      wscript.stdout.write right(&quot;    &quot; &amp; Header,4) &amp; &quot;:&quot; &amp; DumpStr &amp; chr(13) &amp; chr(10)
    else
      wscript.stdout.write right(&quot;000&quot; &amp; hex(i-1),4) &amp; &quot;:&quot; &amp; DumpStr &amp; chr(13) &amp; chr(10)
    end if
      DumpStr = &quot;&quot;
  next

end sub

&#039; Вывод пустой строки

sub NewLine

wscript.stdout.write vbCrLf

end sub

</code></pre></div><p>В результате имеем (исходно):<br />0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F&nbsp; &nbsp;................<br />0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F&nbsp; &nbsp;................<br />0020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F&nbsp; &nbsp; !&quot;#$%&amp;&#039;()*+,-./<br />0030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F&nbsp; &nbsp;0123456789:;&lt;=&gt;?<br />0040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F&nbsp; &nbsp;@ABCDEFGHIJKLMNO<br />0050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F&nbsp; &nbsp;PQRSTUVWXYZ[\]^_<br />0060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F&nbsp; &nbsp;`abcdefghijklmno<br />0070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F&nbsp; &nbsp;pqrstuvwxyz{|}~<br />0080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F&nbsp; &nbsp;................<br />0090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F&nbsp; &nbsp;................<br />00A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF&nbsp; &nbsp;................<br />00B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF&nbsp; &nbsp;................<br />00C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF&nbsp; &nbsp;................<br />00D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF&nbsp; &nbsp;................<br />00E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF&nbsp; &nbsp;................<br />00F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF&nbsp; &nbsp;................</p><p>Та же переменная, но после SetLocale(1049):</p><p>0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F&nbsp; &nbsp;................<br />0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F&nbsp; &nbsp;................<br />0020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F&nbsp; &nbsp; !&quot;#$%&amp;&#039;()*+,-./<br />0030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F&nbsp; &nbsp;0123456789:;&lt;=&gt;?<br />0040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F&nbsp; &nbsp;@ABCDEFGHIJKLMNO<br />0050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F&nbsp; &nbsp;PQRSTUVWXYZ[\]^_<br />0060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F&nbsp; &nbsp;`abcdefghijklmno<br />0070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F&nbsp; &nbsp;pqrstuvwxyz{|}~<br />0080: 88 3F 82 3F 84 85 86 87 3F 89 53 8B 3F 3F 5A 3F&nbsp; &nbsp;.?.?....?.S.??Z?<br />0090: 3F 91 92 93 94 95 96 97 3F 99 73 9B 3F 3F 7A 59&nbsp; &nbsp;?.......?.s.??zY<br />00A0: A0 3F 3F 3F A4 3F A6 A7 3F A9 3F AB AC AD AE 3F&nbsp; &nbsp;.???.?..?.?....?<br />00B0: B0 B1 3F 3F 3F B5 B6 B7 3F 3F 3F BB 3F 3F 3F 3F&nbsp; &nbsp;..???...???.????<br />00C0: 41 41 41 41 41 41 3F 43 45 45 45 45 49 49 49 49&nbsp; &nbsp;AAAAAA?CEEEEIIII<br />00D0: 3F 4E 4F 4F 4F 4F 4F 3F 4F 55 55 55 55 59 3F 3F&nbsp; &nbsp;?NOOOOO?OUUUUY??<br />00E0: 61 61 61 61 61 61 3F 63 65 65 65 65 69 69 69 69&nbsp; &nbsp;aaaaaa?ceeeeiiii<br />00F0: 3F 6E 6F 6F 6F 6F 6F 3F 6F 75 75 75 75 79 3F 79&nbsp; &nbsp;?nooooo?ouuuuy?y</p><p>Вопрос может показаться дурацким, но задаю не от нечего делать - проблема в том, что со схожим (но все же с отличиями, что делает ситуацию еще более загадочной) поведением я столкнулся при использовании компонента для работы с последовательным портом от ActiveXperts:</p><div class="codebox"><pre><code>

Option Explicit

dim i,j,TX,RX
Dim objComport

&#039; Подготовка порта

Set objComport = CreateObject( &quot;AxSerial.ComPort&quot; )

objComport.Clear() &#039; рекомендовано разработчиком, но необходимости нет

&#039; Вывод информации о компоненте

Wscript.Echo &quot;ActiveXperts Serial Port Component &quot; &amp; objComport.Version
Wscript.Echo &quot;Build: &quot; &amp; objComport.Build &amp; vbCrLf &amp; &quot;Module: &quot; &amp; objComport.Module
Wscript.Echo &quot;License Status: &quot; &amp; objComport.LicenseStatus &amp; vbCrLf &amp; &quot;License Key: &quot; &amp; objComport.LicenseKey

&#039; Настройка параметров порта

  objComport.Device = &quot;COM7&quot;
  objComport.BaudRate  = 115200
  objComport.HardwareFlowControl  = objComport.asFLOWCONTROL_DISABLE
  objComport.SoftwareFlowControl  = objComport.asFLOWCONTROL_DISABLE
  objComport.Parity = 1

&#039; Открываю порт

  objComport.Open

&#039; Отладочная пропечатка результат открытия

Wscript.Echo &quot;Open, result:&quot; &amp; objComport.LastError &amp; &quot; (&quot; &amp; objComport.GetErrorDescription( objComport.LastError ) &amp; &quot;)&quot;

&#039; Обработка ошибки открытия. Потом, наверное, сделаю чуть приличнее.

if objComport.LastError &lt;&gt; 0 then
  wscript.Quit
end if


TX = &quot;&quot;

for i = 0 to 255
  TX = TX &amp; chr(i)
next

NewLine

wscript.echo &quot;Transmitted data:&quot;

HexDump TX,&quot;&quot;

NewLine

objComport.WriteBytes TX

RX = objComport.ReadBytes()

NewLine

wscript.echo &quot;Received data:&quot;

HexDump RX,&quot;&quot;

NewLine




wscript.quit 0


&#039; Распечатка буфера (строковой переменной) в формате ASCII-hex
&#039; В качестве параметров - распечатываемый буфер и строковая переменная,
&#039; подменяющая адрес при распечатке (если задана)

sub HexDump(string,hdr)

dim b, i, j, k
dim DumpStr : DumpStr = &quot;&quot;
dim Header: Header = hdr  &#039; заголовок
k = len(string)           &#039; длина распечатываемого блока

  for i = 1 to k step 16

&#039; Формируем hex-строку

    for j = 0 to 15

      if i + j &lt;= k then
         DumpStr = DumpStr &amp; &quot; &quot; &amp; right(&quot;0&quot; &amp; hex(asc(mid(string,i + j,1))),2)
      else
         DumpStr = DumpStr &amp; &quot;   &quot;
      end if
    next

    DumpStr = DumpStr &amp; &quot;   &quot;

&#039; Формируем ASCII-строку

    for j = 0 to 15

      if i + j &lt;= k then
        b = asc(mid(string,i + j,1))
        if b &gt; 31 and b &lt; 128 then
          DumpStr = DumpStr &amp; chr(b)
        else
          DumpStr = DumpStr &amp; &quot;.&quot;
        end if

      else
         DumpStr = DumpStr &amp; &quot; &quot;
      end if
    next

&#039; Распечатка строки

    if Header &lt;&gt; &quot;&quot; then
      wscript.stdout.write right(&quot;    &quot; &amp; Header,4) &amp; &quot;:&quot; &amp; DumpStr &amp; chr(13) &amp; chr(10)
    else
      wscript.stdout.write right(&quot;000&quot; &amp; hex(i-1),4) &amp; &quot;:&quot; &amp; DumpStr &amp; chr(13) &amp; chr(10)
    end if
      DumpStr = &quot;&quot;
  next

end sub

&#039; Вывод пустой строки

sub NewLine

wscript.stdout.write vbCrLf

end sub
</code></pre></div><p>В результате имеем:</p><p>ActiveXperts Serial Port Component 3.2<br />Build: 3.2.1.50902 (64bit)<br />Module: AxSerial64.dll<br />License Status: Expires 02/02/2019<br />License Key: <br />Open, result:0 (Success)</p><p>Transmitted data:<br />0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F&nbsp; &nbsp;................<br />0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F&nbsp; &nbsp;................<br />0020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F&nbsp; &nbsp; !&quot;#$%&amp;&#039;()*+,-./<br />0030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F&nbsp; &nbsp;0123456789:;&lt;=&gt;?<br />0040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F&nbsp; &nbsp;@ABCDEFGHIJKLMNO<br />0050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F&nbsp; &nbsp;PQRSTUVWXYZ[\]^_<br />0060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F&nbsp; &nbsp;`abcdefghijklmno<br />0070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F&nbsp; &nbsp;pqrstuvwxyz{|}~<br />0080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F&nbsp; &nbsp;................<br />0090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F&nbsp; &nbsp;................<br />00A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF&nbsp; &nbsp;................<br />00B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF&nbsp; &nbsp;................<br />00C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF&nbsp; &nbsp;................<br />00D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF&nbsp; &nbsp;................<br />00E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF&nbsp; &nbsp;................<br />00F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF&nbsp; &nbsp;................</p><br /><p>Received data:<br />0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F&nbsp; &nbsp;................<br />0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F&nbsp; &nbsp;................<br />0020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F&nbsp; &nbsp; !&quot;#$%&amp;&#039;()*+,-./<br />0030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F&nbsp; &nbsp;0123456789:;&lt;=&gt;?<br />0040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F&nbsp; &nbsp;@ABCDEFGHIJKLMNO<br />0050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F&nbsp; &nbsp;PQRSTUVWXYZ[\]^_<br />0060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F&nbsp; &nbsp;`abcdefghijklmno<br />0070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F&nbsp; &nbsp;pqrstuvwxyz{|}~<br />0080: 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F&nbsp; &nbsp;????????????????<br />0090: 3F 3F 3F 3F 3F 3F 3F 3F 98 3F 3F 3F 3F 3F 3F 3F&nbsp; &nbsp;????????.???????<br />00A0: A0 3F 3F 3F A4 3F A6 A7 3F A9 3F AB AC AD AE 3F&nbsp; &nbsp;.???.?..?.?....?<br />00B0: B0 B1 3F 3F 3F B5 B6 B7 3F 3F 3F BB 3F 3F 3F 3F&nbsp; &nbsp;..???...???.????<br />00C0: 41 41 41 41 41 41 3F 43 45 45 45 45 49 49 49 49&nbsp; &nbsp;AAAAAA?CEEEEIIII<br />00D0: 3F 4E 4F 4F 4F 4F 4F 3F 4F 55 55 55 55 59 3F 3F&nbsp; &nbsp;?NOOOOO?OUUUUY??<br />00E0: 61 61 61 61 61 61 3F 63 65 65 65 65 69 69 69 69&nbsp; &nbsp;aaaaaa?ceeeeiiii<br />00F0: 3F 6E 6F 6F 6F 6F 6F 3F 6F 75 75 75 75 79 3F 79&nbsp; &nbsp;?nooooo?ouuuuy?y</p><p>Данные заведомо ушли &quot;правильно&quot; (проконтролировано параллельным подключением через еще один USB-UART), однако принимаются с искажениями во второй части 256-байтовой таблицы. И картина похожа на первый пример (с setlocale), но все же отличается.</p><p>У используемого компонента есть еще метод readbyte, и вот он-то работает без искажений (выгребаю данные в цикле, пока не получу таймаут). И вроде бы проблема решена (хоть и коряво), но когда потребовался еще и сетевой компонент от того же производителя, столкнулся с той же самой проблемой &quot;искажения&quot; данных, а там &quot;побайтовый&quot; метод оказался практически неприменим.</p><p>Итак, &quot;кто виноват ?&quot; и &quot;что делать ?&quot;.</p><p>-----<br />p.s. Вопрос, наверное, снимается - причина в моем недопонимании устройства строчных переменных в vbs. Отсюда и неправильное заполнение буфера с исходными данными и распечатка результата...</p>]]></content>
			<author>
				<name><![CDATA[rx3apf]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39869</uri>
			</author>
			<updated>2019-01-03T12:10:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=130819#p130819</id>
		</entry>
</feed>
