На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Где находиться компонент SerialPort? , Помогите разобраться
    Здравствуйте!
    У меня стоит C++ Builder 6.0. Не могу найти компоненту SerialPort. Возможно ее надо где нибудь скачать и установить?
    Хотелось бы описание возможностей компоненты почитать (свойства, методы и функции)!
    Есть ли у нее возможность отслеживать приход данных (строки из СОМ-порта)?
        Не могу установить данный по ссылке компонент: нет файла CPORTLIBCB6.bpi
          Не мучайся, используй WinApi.
            Цитата Mihay @
            нет файла CPORTLIBCB6.bpi

            МОжно и без bpi установить, вот лет 7 назад назад знал как, а щас забыл. Загугли, там что то типа импорта новых контролов. Достаточно даже одного *.pas файла или *.bpk я не помню реально. В универе последний раз лет 7-8 назад так делал :D
              Цитата shm @

              Профиль · PM
              Поощрения: 1 Dgm
              Рейтинг (т): - [ 113 ] +

              Не мучайся, используй WinApi


              WinApi сейчас использую. Принимаю данные по СОМ-порту с левого контроллера. Функция ReadFilе подвисает, если нет данных с контроллера (данные приходят побайтово - и я их собираю в одно целое, исключая символы \r и \n). Приведу на всякий случай код. Может есть другое решение?

              int __fastcall ThreadProc(void *pData)
              {
              int Num_Datch;
              while(Work == 1)
              {
              if (Pr_send == true)
              {
              bytesWritten = 0;
              Sleep(1);
              if (Work == 1)
              gResult = ReadFile(hCom, &c, 1, &bytesWritten, NULL);
              if (gResult != 0)
              {
              if ((prev_c == '\n')&&(c != '\r')&&(c != '\n'))
              {
              unsigned int num = 0;
              while (c != '\r')
              {
              num = num * 10 + (c - '0');
              ReadFile(hCom, &c, 1, &bytesWritten, NULL);
              }
              int Flag = num&0x4000;
              if (Flag == 0x4000)
              {
              Num_Datch = num&0x3fff;
              }
              else
              {
              Sensor[Num_Datch] = num;
              } // else
              } // if ((prev_c == '\n')&&(c != '\r')&&(c != '\n'))
              } // if (gResult != 0)
              prev_c = c;
              }
              }
              if (Work == 0)
              {
              int s = 2;
              gResult = WriteFile(hCom, &s, sizeof(s), &bytesWritten, NULL);
              CloseHandle(hCom);
              }
              return 0;
              }

              Зависание происходит в цикле while (c != '\r'). Я бы не парился с этим (нет данных и виси в отдельном потоке сколько хочешь), если б в любой момент мне не нужно было бы отправить данные на контроллер, используя функцию WriteFile. Вот тут оно и аукается...
              Хотелось бы взять функцию чтения строки из буфера, а не побайтово выгребать данные.
                Mihay юзай тэг CODE а то читать стремно :)
                Сообщение отредактировано: Cfon -
                    Цитата Mihay @
                    есть другое решение?

                    1. setcommtimeouts
                    2. Работа с COM портом в асинхронном режиме
                      Но в общем случае COM-порт та ещё бяка (включая как ряд багов в самой винде, так и приколы на некоторых чипсетах, когда порт уходит в несознанку, которая лечится только передёргиванием питания, reset бессилен).
                      При первой возможности с него надо соскакивать.
                        Цитата Mr.Delphist @
                        так и приколы на некоторых чипсетах, когда порт уходит в несознанку, которая лечится только передёргиванием питания

                        Это порождает очень хитроумный код обхода этих багов. Особенно доставляют некоторые устройства на базе usb cdc: если устройство выдернут и продолжить работать с открытым портом, то можно словить bsod. Да и сам факт этого (что устройство выдернули/переткнули) распознать весьма нетривиально.

                        Добавлено
                        А сам по себе COM-порт штука очень надежная, не надо наговаривать лишнего. Да, очень много кривого сетевого ПО и железок.
                          Цитата shm @
                          А сам по себе COM-порт штука очень надежная, не надо наговаривать лишнего. Да, очень много кривого сетевого ПО и железок.

                          Да та-же "MOXA", например.
                          Эти стервецы сэкономили на грошовом фильтре на кабель USB-портов.
                          user posted image
                          В результате достаточно включить чего-нибудь серьёзное поблизости от кабеля,
                          чтобы порт заглючил.
                          Лечится установкой фильта, хоть самодельного. Но пока до этого допрёшь..
                          Сообщение отредактировано: ЫукпШ -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0718 ]   [ 17 queries used ]   [ Generated: 28.03.24, 12:35 GMT ]