BG Development


Страници: (5) « първа ... 2 3 [4] 5   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Стари компютри на HP, Продажба
ici
Публикувано на: 21-06-2026, 08:27
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 19077
Регистриран на: 06.06.04



Ако се използва USB, модемните сигнали са просто команди, които се изпращат по endpoint 0 и ако не работи контролера няма кой да ги чуе.
CODE
/**
 * @brief  Manage the CDC class requests
 * @param  cmd: Command code
 * @param  pbuf: Buffer containing command data (request parameters)
 * @param  length: Number of data to be sent (in bytes)
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 */
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
      USBD_CDC_LineCodingTypeDef linecoding = {
                9600, /* baud rate*/
                0x00,   /* stop bits-1*/
                0x00,   /* parity - none*/
                0x08    /* nb. of bits 8*/
      };

      switch (cmd) {
      case CDC_SET_LINE_CODING:
            linecoding.bitrate = (uint32_t) (pbuf[0] | (pbuf[1] << 8)
                        | (pbuf[2] << 16) | (pbuf[3] << 24));
            linecoding.format = pbuf[4];
            linecoding.paritytype = pbuf[5];
            linecoding.datatype = pbuf[6];
            break;

      case CDC_GET_LINE_CODING:
            pbuf[0] = (uint8_t) (linecoding.bitrate);
            pbuf[1] = (uint8_t) (linecoding.bitrate >> 8);
            pbuf[2] = (uint8_t) (linecoding.bitrate >> 16);
            pbuf[3] = (uint8_t) (linecoding.bitrate >> 24);
            pbuf[4] = linecoding.format;
            pbuf[5] = linecoding.paritytype;
            pbuf[6] = linecoding.datatype;
            break;

      case CDC_SEND_ENCAPSULATED_COMMAND:
            // printf("CDC_SEND_ENCAPSULATED_COMMAND ");
            break;
      case CDC_GET_ENCAPSULATED_RESPONSE:
            // printf("CDC_GET_ENCAPSULATED_RESPONSE ");
            break;
      case CDC_SET_COMM_FEATURE:
            // printf("CDC_SET_COMM_FEATURE ");
            break;
      case CDC_GET_COMM_FEATURE:
            // printf("CDC_GET_COMM_FEATURE ");
            break;
      case CDC_CLEAR_COMM_FEATURE:
            // printf("CDC_CLEAR_COMM_FEATURE ");
            break;
      case CDC_SET_CONTROL_LINE_STATE:
            cdchsDTR = ((((USBD_SetupReqTypedef*)pbuf)->wValue & 1) != 0);
            cdchsRTS = ((((USBD_SetupReqTypedef*)pbuf)->wValue & 2) != 0);
            break;
   case CDC_SET_CONTROL_LINE_STATE:
     dtrState = (CDC_DTR_enabled) ? (((USBD_SetupReqTypedef *)pbuf)->wValue & CLS_DTR) : true;
     dtrState = (((USBD_SetupReqTypedef *)pbuf)->wValue & CLS_DTR);

     if (dtrState) { // Reset the transmit timeout when the port is connected
       transmitStart = 0;
     }
     rtsState = (((USBD_SetupReqTypedef *)pbuf)->wValue & CLS_RTS);
#ifdef DTR_TOGGLING_SEQ
     dtr_toggling++; /* Count DTR toggling */
#endif
     break;
      default:
            break;
      }

      return (USBD_OK);
}


--------------------
Facebook is a bit like checking your underwear after a fart.
Most likely there's nothing new and if there is it's probably shit.
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 21-06-2026, 08:34
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Точно това щях да питам, как реализирате хардуерната синхронизация по usb (макар, че в последните години почти не съм виждал устройства които да я използват)...

Това мнение е било редактирано от thrawn на 21-06-2026, 08:36
PMEmail Poster
Top
ici
Публикувано на: 21-06-2026, 10:18
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 19077
Регистриран на: 06.06.04



Само използвам DTR за да детектвам че нещо се е закачило. В някои случаи пускам таск, в други просто паля лед, от червен става зелен, когато има комуникация мига синьо.

LINE_CODING само го пазя ако някой софтуер иска да сложи бод рейт, датабитс и пр, та после да му ги върна за да се радва. icon_smile.gif Ако имах UART трябваше да ги сложа на него, ама аз нямам. icon_smile.gif

Това мнение е било редактирано от ici на 21-06-2026, 10:21


--------------------
Facebook is a bit like checking your underwear after a fart.
Most likely there's nothing new and if there is it's probably shit.
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 21-06-2026, 11:02
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Имах в предвид как ги подавате/приемате на чисто хардуерно ниво. Ама горе нали пусна извадка как ги обработваш. Но третирането им като команда, практически ги обезсмисля.
PMEmail Poster
Top
Дон Реба
Публикувано на: 21-06-2026, 11:21
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 10496
Регистриран на: 11.11.06



QUOTE (thrawn @ 21-06-2026, 11:02)
Имах в предвид как ги подавате/приемате на чисто хардуерно ниво. Ама горе нали пусна извадка как ги обработваш. Но третирането им като команда, практически ги обезсмисля.

аз ползвам или CH340 или FTDI, като напоследък предпочитам CH340 защото е малък и има само rts, точно както аз искам.
PM
Top
H_A_L_F
Публикувано на: 21-06-2026, 13:57
Quote Post



Име: Антон Банчев
Група: Потребител
Ранг: Почетен член

Мнения: 1585
Регистриран на: 01.03.04



За това сканиране преди всяка команда, не е ли по-просто да се прави сканиране един път, след това използваш намерения порт докато той не спре да отговаря (някакъв кратък таймоут), и само тогава сканираш всички портове отново да закачиш на новия и пращаш там командата. Това че няма идентификация си е кофти проблем, няма ли за тези устройства начин да пишеш някакъв твой идентификатор в тяхното мемори, или са им ограничени командите.
PMEmail Poster
Top
thrawn
Публикувано на: 21-06-2026, 14:29
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Представи си, че имаш две еднакви устройства (без серирн номер) когато ги включиш излизат на COM5 и COM6. По някое време се рестартират но второто се включва първо. Операционната сисрема му дава COM5. След това се включва другото и получава COM6. Така и двата порта са там и двете устройства си работят но са си сменили местата.

Обикновено, серийните портове не се държат отворени, постоянно, така че, подобно събитие няма как да бъде отчетено.

В някои случаи е все едно кое от двете ще обработи командата но има устройства при които е критично командата да се подаде на точно определено устройство (в моя случай, това са фискални устройства и пос терминали които отчитат потоци на пари - те ще се запишат като оборот на грешна фирма или по-лошо, парите ще отидат в грешна сметка).

Иначе, производителите могат да сменят идентификациите (при ftdi май се ползваше външен flash за това. А това вдига цената на продуктът (не само с цената на компонента но и разходи за асемблиране) затова ги зарязват с идентификациите по подразбиране). Серийните номера пък изискват отделно флашване на всяко устройство, което също усложнява производството. Технически няма проблем производителите да предвидят опция за програмиране на идентификатори от потребителя, но обикновенно, това се праеи през сервизни интерфейси до които обикновените потребители нямат достъп.

Това мнение е било редактирано от DarkOne на 26-06-2026, 14:57
PMEmail Poster
Top
H_A_L_F
Публикувано на: 21-06-2026, 14:32
Quote Post



Име: Антон Банчев
Група: Потребител
Ранг: Почетен член

Мнения: 1585
Регистриран на: 01.03.04



Имам предвдид няма ли някаква временна памет която да може да се пише без да влияе на останалите функции, и там да го ползваш за да си пишеш твой идентификатор, после ако четеш и идентификатора го няма знаеш че може да не е същото устройство
PMEmail Poster
Top
thrawn
Публикувано на: 21-06-2026, 14:48
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3864
Регистриран на: 17.01.17



Е то е това де. Тези флашове са само за този чип. Когато му подадеш команда, той си пише в паметта (ако има такава) иначе използва фабричните записи от ROM паметта си. Това няма отношение към контролера на устройството.
При контролерите с вграден usb (примерът на ici от предната страница) всичко се прави на ниво приложение (тогава всички подобни идентификатори заемат място в паметта на контролера, освен ако умишлено не се постави външна памет в която да се трупат такива неща).

От тук вече е въпрос на желание да се включат команди за промяна на идентификаторите. В много устройства има скрити jtag или uart портове по платките които се използват за дебъгване и препрограмиране. Също тка има трикове с бут лодерите на контролерите които позволяват да ги стртираш в "сервизен режим" в който евентуално да пипаш на места недостъпни за писане от основното приложение.

---
На това ниво съм любител, така че, ако има неточности, хората които се занимават с това ще ме поправят.

Това мнение е било редактирано от thrawn на 21-06-2026, 14:50
PMEmail Poster
Top
ici
Публикувано на: 21-06-2026, 14:58
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 19077
Регистриран на: 06.06.04



QUOTE (H_A_L_F @ 21-06-2026, 15:32)
Имам предвдид няма ли някаква временна памет която да може да се пише без да влияе на останалите функции, и там да го ползваш за да си пишеш твой идентификатор, после ако четеш и идентификатора го няма знаеш че може да не е същото устройство

Част от РАМ паметта не се бара при ресет, и там пиша стек дъмп, причина за рестарта и пр. , ама това не е стандартно решение.

Прикачена картинка (Кликнете на картинката, за да я увеличите!)
Прикачена картинка


--------------------
Facebook is a bit like checking your underwear after a fart.
Most likely there's nothing new and if there is it's probably shit.
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (5) « първа ... 2 3 [4] 5  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0