Перейти к содержанию
    

Как переключить мост USB-UART XR21V1410 в режим 9N1?

Мост XR21V1410 способен вести приём/передачу данных в редком режиме 9N1. Однако для этого ему нужно включить режим wide mode. То есть данному мосту можно установить длину символа, равную 9 битам, но с выключенным режимом wide mode последний бит символа всегда будет нулём. В режиме же wide mode на каждый символ, уходящий с Tx приходится 2 байта, приходящих в мост от USB (и во втором будет содержаться в том числе 9-й бит). Я нашёл любительский код (по-видимому, на Baisic), предназначенный для включения данного режима. Данный код изобилует "магическими" числами:

Private Const ExarPortIndex = &H805
<...>
Dim ExarWriteCode As Long = CTL_CODE(FILE_DEVICE_UNKNOWN, _
                                     ExarPortIndex + 17, _
                                     METHOD_BUFFERED, _
                                     FILE_ANY_ACCESS)
<...>
Private Sub WriteReg(ByVal Reg As UInt16, ByVal Data As UInt16)
    <...>
    Dim Status As Boolean = DeviceIoControl(PortHandle, ExarWriteCode, inPtr, 4, -1, 0, ReturnedBytes, 0)
    <...>
End Sub
<...>
WriteReg(&HD02, 1)                  ' Set Wide mode for XR21B1411

Я попробовал переписать данный код на C++, но мой код не заработал. Тогда я решил уменьшить его до минимума и (в рамках эксперимента) поменять уже установленный мосту битрейт при помощи функции DeviceIoControl:

#include <windows.h>
#include <winioctl.h>

int main(int argc, char* argv[])
{
    HANDLE hUart;
    CHAR uartName[] = "\\\\.\\COM8";
    hUart = CreateFileA(uartName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    DCB uartDCB;
    uartDCB.BaudRate    = CBR_9600;
    uartDCB.ByteSize    = 9;
    uartDCB.Parity      = NOPARITY;
    uartDCB.StopBits    = ONESTOPBIT;
    SetCommState(hUart, &uartDCB);

    DWORD bytesRet = 0;
    DWORD baudRate = CBR_14400;
    const UINT64 IOCTL_SERIAL_SET_BAUD_RATE = CTL_CODE(FILE_DEVICE_SERIAL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS);
    DeviceIoControl(hUart, IOCTL_SERIAL_SET_BAUD_RATE, &baudRate, sizeof(baudRate), NULL, 0, &bytesRet, (LPOVERLAPPED)NULL);

    const UINT16 arrayLen = 2;
    UINT8 array[arrayLen];
    array[0] = 0x33;
    array[1] = 0xFF;
    WriteFile(hUart, array, arrayLen, &bytesReturned, NULL);
    
    CloseHandle(hUart);
    return 0;
}

Данный код отработал как надо - я зафиксировал это по осциллограмме с линии Tx и по логу Serial Port Monitor (там видно, что IOCTL_SERIAL_SET_BAUD_RATE вызывается дважды, один раз для 9600 бит/с, второй раз для 14400 бит/с). Однако во-первых, в любительском примере макрос CTL_CODE принимает в качестве аргумента DeviceType значение FILE_DEVICE_UNKNOWN, а в моём коде это FILE_DEVICE_SERIAL_PORT, а во-вторых я не понимаю, что ставить в качестве аргумента Function - для смены битрейта я взял "1" из второй таблицы по этой ссылке. У любительского же примера там какое-то магическое число.

В даташите на XR21V1410 на стр.12 есть таблица USB Сontrol Сommands , а на стр.15 есть таблица UART Register Map. Но что означают колонки Request Type, Request, Address - не вполне понятно. Не ясно также, как использовать значения в данных колонках для функции DeviceIoControl, чтобы включить wide mode.

Что я должен поменять в своём коде, чтобы добиться от XR21V1410 полноценного режима 9N1?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, flammmable сказал:

Мост XR21V1410 способен вести приём/передачу данных в редком режиме 9N1. Однако для этого ему нужно включить режим wide mode.

Мост на основе FT232RL поддерживает все стандартные режимы для виртуального COM-порта. В том числе, 9N1. Все задается через стандартый интерфейс виртуального COM-порта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/8/2023 at 2:11 PM, quark said:

Мост на основе FT232RL поддерживает все стандартные режимы для виртуального COM-порта. В том числе, 9N1. Все задается через стандартый интерфейс виртуального COM-порта...

Что же FTDI не пишет об этом на его страничке...

Quote

UART interface support for 7 or 8 data bits, 1 or 2 stop bits and odd / even / mark / space / no parity.

...а также в документации (специально отсмотрел все 115 вхождений символа "9" в даташит)?

Глобально, если передача 7N1 (а также всяких там 5N1 и 6N1) подразумевает банальное маскирование лишних битов в байте, пришедшем от хоста, то передача 9N1 предусматривает наличие пары байт на каждый символ формата 9N1. Такой специфический режим работы достаточно трудно спрятать где-то между строк. А потому возникает ряд дополнительных вопросов:
1) Вы лично, своими руками реализовывали на FT232RL режим 9N1?
2) Если нет, то что именно вселяет в вас уверенность, что данный режим существует в FT232RL?
3) Что по вашему означает "стандартные режимы" в контексте COM-порта? На ваш взгляд, есть какой-то стандарт, где перечислены возможные длины символов (сразу говорю, в TIA/EIA-232x этого нет и быть не может)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, flammmable сказал:

передача 9N1 предусматривает наличие пары байт на каждый символ формата 9N1.

Давайте разбираться, что понимается под форматом 9N1.

Если это 9 бит данных + 1 стоп бит, то Вы правы - в стандартном контроллере COM-порта такого режима нет.
Есть режимы: 8 бит данных + 1 бит четности + 1-1,5-2 стоп-бита. Причем, бит четности - битом данных не является.
У него есть четыре стандартых режима работы: четность, нечетность, постоянно 0, постоянно 1.

Режим, в котором передается именно 9 бит данных в стандартном контроллере COM-порта нет.
Однако, во многих МК есть возможность использовать 9-й бит, как бит данных. В ПК я такой возможности не встречал.
Если она есть у указанного вами железа, то наверное, сначала стоит выяснить, поддерживает ли его драйвер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запись 8E1 означает 8 бит данных, один бит чётности (E - even, чётный) и один стоп-бит.
Запись 8O2 означает 8 бит данных, один бит нечётности (O - odd, нечётный) и два стоп-бита.
Запись 7N1 означает 7 бит данных, отсутствие бита чётности (N - none, нет/отсутствие) и один стоп-бит.

Так что выражение...

On 6/8/2023 at 8:26 PM, quark said:

Давайте разбираться, что понимается под форматом 9N1.

Если это...

...просто лишено смысла. Запись 9N1 не предусматривает каких-либо множественных трактовок и всяких "если".

Если только это не "Ответы Майл-ру". Тогда да. Но от автора-завсегдатая "Ответов Майл-ру" и совет будет соответствующей ценности. Вроде такого:

Quote

Не, чёто не так делаш. Проверь всё на всякий случай. 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, flammmable сказал:

Запись 9N1 не предусматривает каких-либо множественных трактовок и всяких "если".

На первый взгляд, Вы, конечно, правы. Но только, на первый...
Стандартного режима 9N1 не существует. Он физически не поддерживается контроллерами. Но он может быть эмулирован при помощи бита четности.

В МК часто есть возможность задавать бит четности программно. Поэтому, появляется возможность, кроме четырех стандартных режимов использования бита четности, которые перечислены выше, добавить еще один - использовать бит четности, как дополнительный бит данных. То есть, эмулировать режим 9N1.

В ПК такой возможности, по умолчанию, нет. Если ваше железо предоставляет возможность управлять нестандартно битом четности и, тем самым, эмулировать режим 9N1, то и драйвер такого устройства должен быть нестандартным. Поэтому, начинайте разбираться с драйвера.

P.S. Можно предложить, вместо записи 9N1, использовать например, обозначение 8D1. чтобы подчеркнуть, что бит четности используется как бит данных. Это ближе к реальности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, flammmable said:

Запись 8E1 означает 8 бит данных, один бит чётности (E - even, чётный) и один стоп-бит.

Дополню, одна посылка 8E1 состоит из 11 бит : Start(0)-D0-D1-D2-D3-D4-D5-D6-D7-Even-End(1)

 

1 hour ago, flammmable said:

Запись 7N1 означает 7 бит данных, отсутствие бита чётности (N - none, нет/отсутствие) и один стоп-бит

 

Дополню, одна посылка 7N1 состоит из 9 бит : Start(0)-D0-D1-D2-D3-D4-D5-D6-End(1)

 

1 hour ago, flammmable said:

Запись 9N1 не предусматривает каких-либо множественных трактовок и всяких "если".

Дополню, одна посылка 9N1 состоит из 11 бит : Start(0)-D0-D1-D2-D3-D4-D5-D6-D7-D8-End(1)

 

Т.е. классический 8N1 на 115 200 позволяет передать  11520 символов в секунду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, quark сказал:

Стандартного режима 9N1 не существует. Он физически не поддерживается контроллерами.

Он физически поддерживается контроллерами. То, что он не поддерживался микросхемой 16550 в IBM PC XT - на стандарт не тянет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

On 6/9/2023 at 11:03 AM, quark said:

Мост на основе FT232RL поддерживает все стандартные режимы для виртуального COM-порта. В том числе, 9N1.

[чуть позже]


Стандартного режима 9N1 не существует.

Ура! Однако, тут уместно повторить вопросу к вам

Quote

3) Что по вашему означает "стандартные режимы" в контексте COM-порта? На ваш взгляд, есть какой-то стандарт, где перечислены возможные длины символов (сразу говорю, в TIA/EIA-232x этого нет и быть не может)?

Потому что как раз 9N1 вполне описан в стандарте Multi-Drop Bus.



Теперь вернёмся к первому посту и перечитаем:

Quote

Мост XR21V1410 способен вести приём/передачу данных в редком режиме 9N1. Однако для этого ему нужно включить режим wide mode. То есть данному мосту можно установить длину символа, равную 9 битам, но с выключенным режимом wide mode последний бит символа всегда будет нулём. В режиме же wide mode на каждый символ, уходящий с Tx приходится 2 байта, приходящих в мост от USB (и во втором будет содержаться в том числе 9-й бит).

А затем перечитаем вас:

On 6/9/2023 at 11:03 AM, quark said:

Если ваше железо предоставляет возможность управлять нестандартно битом четности и, тем самым, эмулировать режим 9N1, то и драйвер такого устройства должен быть нестандартным. Поэтому, начинайте разбираться с драйвера.

Вот совет, так совет. Именно таких, неочевидных, но предельно точных, ёмких, лаконичных и практических советов и ожидаешь, когда пишешь вопрос в глубоко профильное и авторитетное сообщество ))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, flammmable сказал:

Вот совет, так совет. Именно таких, неочевидных, но предельно точных, ёмких, лаконичных и практических советов и ожидаешь, когда пишешь вопрос в глубоко профильное и авторитетное сообщество ))))

Значит, получили то, что ожидали. Что может быть лучше... )))

9 минут назад, Сергей Борщ сказал:

То, что он не поддерживался микросхемой 16550 в IBM PC XT - на стандарт не тянет.

А какая "тянет"? Назовите. Или может сам "стандарт" выложите? Хотя бы ссылку на него...

12 минут назад, flammmable сказал:

Потому что как раз 9N1 вполне описан в стандарте Multi-Drop Bus.

Это не стандарт для порта, а протокол обмена. Один из многих...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/9/2023 at 11:41 AM, quark said:

А какая "тянет"? Назовите. Или может сам "стандарт" выложите? Хотя бы ссылку на него...

А давайте, учитывая количество сказанных вами слов "стандартный", вы выложите (или хотя бы назовёте) стандарт, регламентирующий, на ваш взгляд, количество бит в символе у порта (что бы это ни значило)?  

 

On 6/9/2023 at 11:41 AM, quark said:

Значит, получили то, что ожидали. Что может быть лучше... )))

Про совет - это, очевидно, был сарказм. Ваши советы на уровне Ответов Майл-ру. Бесполезные и бессмысленные. Ощущение, словно вы копипастите их из ChatGPT.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, flammmable сказал:

Про совет - это, очевидно, был сарказм. Ваши советы на уровне Ответов Майл-ру. Бесполезные и бессмысленные.

Я вижу, что в моих советах Вы не нуждаетесь. Тогда всего Вам хорошего. Дальше - без меня. Не буду "засорять" вашу тему. )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, flammmable сказал:

Запись 8E1 означает 8 бит данных, один бит чётности (E - even, чётный) и один стоп-бит.
Запись 8O2 означает 8 бит данных, один бит нечётности (O - odd, нечётный) и два стоп-бита.

Очевидно: передавать 9 бит данных можно с помощью режимов 8M1 и 8S1. На тех портах, где они поддерживаются.

Конечно - передавать потоки байт, с постоянно меняющимся старшим битом, таким способом будет затруднительно.

В 08.06.2023 в 18:45, flammmable сказал:

Что же FTDI не пишет об этом на его страничке...

Цитата

UART interface support for 7 or 8 data bits, 1 or 2 stop bits and odd / even / mark / space / no parity.

...а также в документации (специально отсмотрел все 115 вхождений символа "9" в даташит)?

"смотрю в книгу, вижу фигу"...  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 07.06.2023 в 18:43, flammmable сказал:

В даташите на XR21V1410 на стр.12 есть таблица USB Сontrol Сommands , а на стр.15 есть таблица UART Register Map. Но что означают колонки Request Type, Request, Address - не вполне понятно. Не ясно также, как использовать значения в данных колонках для функции DeviceIoControl, чтобы включить wide mode.

custom.thumb.png.47ee6df5709ba424e13e303dbbb340fd.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/10/2023 at 6:46 AM, jcxz said:

Очевидно: передавать 9 бит данных можно с помощью режимов 8M1 и 8S1.

Ещё один сногсшибательный совет. Да, можно. Можно ещё ходить на руках. Или спиной вперёд. Можно еще попробовать как-нибудь извернувшись, через гланды, сэмулировать передачу 9N1 путём постоянного переключения битрейта. Но вопрос: а принимать символ 9N1 вы чем предлагаете? )))))) "Не, ну я так... Я типа вам 50% задачи решил, типа, подколупнул, а дальше - это уж мелкие детали" ))))

On 6/10/2023 at 6:46 AM, jcxz said:

"смотрю в книгу, вижу фигу"... 

К слову про неумение читать, перечитайте заголовок темы, а затем ваш нерелевантный поток сознания про FT232 и 8M1/8S1.

 

On 6/9/2023 at 11:54 AM, quark said:

Я вижу, что в моих советах Вы не нуждаетесь. Тогда всего Вам хорошего. Дальше - без меня. Не буду "засорять" вашу тему. )))

Я уж было порадовался, но...

On 6/10/2023 at 8:08 AM, quark said:

custom.thumb.png.47ee6df5709ba424e13e303dbbb340fd.png

Я бы мог спросить "И? Вы прошли по ссылке, которую я привёл в первом посте. Обнаружили там таблицу, о наличие которой я сообщил в первом посте. И подчеркнули название режима wide mode, о котором я сказал в первом посте. Как скопипащенный и раскрашенный вами рисунок отвечает на вопрос из первого поста "Что я должен поменять в своём коде, чтобы добиться от XR21V1410 полноценного режима 9N1?" ?" Я понимаю, что ответ и тут приблизительно тот же: "Не, ну я так... Я типа вам код регистра обвёл красным, 99% работы сделал, типа подколупнул, а дальше, как его передать в устройство - это уж мелкие детали" ))))

Но учитывая, что...

  1. В функWinAPI по работе с устройствами USB вы (200% гарантии) не разбираетесь
  2. у вас режим 9N1 то стандартный, то нет
  3. у вас он, якобы, существует на FT232, но лично вы (666% гарантии) его никогда не запускали (и не запустили бы, потому что у FT232 его нет)
  4. на XR21V141x вы (100500% гарантии) его никогда не запускали
  5. сами вы то уходите, то остаётесь

...я мог бы сказать, что дискуссия именно с вами бессмысленна и бесполезна. Поэтому именно ваши последующие посты (если они ещё будут) я проигнорирую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...