Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.226.169] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
У меня стоит C++ Builder 6.0. Не могу найти компоненту SerialPort. Возможно ее надо где нибудь скачать и установить? Хотелось бы описание возможностей компоненты почитать (свойства, методы и функции)! Есть ли у нее возможность отслеживать приход данных (строки из СОМ-порта)? |
Сообщ.
#3
,
|
|
|
Не могу установить данный по ссылке компонент: нет файла CPORTLIBCB6.bpi
|
Сообщ.
#4
,
|
|
|
Не мучайся, используй WinApi.
|
Сообщ.
#5
,
|
|
|
Цитата Mihay @ нет файла CPORTLIBCB6.bpi МОжно и без bpi установить, вот лет 7 назад назад знал как, а щас забыл. Загугли, там что то типа импорта новых контролов. Достаточно даже одного *.pas файла или *.bpk я не помню реально. В универе последний раз лет 7-8 назад так делал |
Сообщ.
#6
,
|
|
|
Цитата 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. Вот тут оно и аукается... Хотелось бы взять функцию чтения строки из буфера, а не побайтово выгребать данные. |
Сообщ.
#7
,
|
|
|
Mihay юзай тэг CODE а то читать стремно
|
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Но в общем случае COM-порт та ещё бяка (включая как ряд багов в самой винде, так и приколы на некоторых чипсетах, когда порт уходит в несознанку, которая лечится только передёргиванием питания, reset бессилен).
При первой возможности с него надо соскакивать. |
Сообщ.
#11
,
|
|
|
Цитата Mr.Delphist @ так и приколы на некоторых чипсетах, когда порт уходит в несознанку, которая лечится только передёргиванием питания Это порождает очень хитроумный код обхода этих багов. Особенно доставляют некоторые устройства на базе usb cdc: если устройство выдернут и продолжить работать с открытым портом, то можно словить bsod. Да и сам факт этого (что устройство выдернули/переткнули) распознать весьма нетривиально. Добавлено А сам по себе COM-порт штука очень надежная, не надо наговаривать лишнего. Да, очень много кривого сетевого ПО и железок. |
Сообщ.
#12
,
|
|
|
Цитата shm @ А сам по себе COM-порт штука очень надежная, не надо наговаривать лишнего. Да, очень много кривого сетевого ПО и железок. Да та-же "MOXA", например. Эти стервецы сэкономили на грошовом фильтре на кабель USB-портов. В результате достаточно включить чего-нибудь серьёзное поблизости от кабеля, чтобы порт заглючил. Лечится установкой фильта, хоть самодельного. Но пока до этого допрёшь.. |