PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » COM порт


COM порт

Сообщений 1 страница 17 из 17

1

Добрый день. Хочу запустить любую программу для работы с COM портом,но при компиляции выскакивает ошибка
Стоит операц. система W8 (x64), PB 4.51(x64).Программа с другими кодами работает. Не могу установить LibInstall_MVCOM.exe  с офф. сайта (пишет, что не находит указанный путь). Может кто сталкивался с проблемой. Подскажите пожалуйста
http://s9.uploads.ru/eSaxl.png

0

2

Зачем MVCOM если есть функции для работы с COM портом? http://purebasic.com/documentation/seri … index.html

ub8xak написал(а):

PB 4.51(x64)

Библиотека MVCOM для x86 системы. Нужно использовать встроенную библиотеку SerialPort (ссылка выше на список ее функций).

0

3

Самому начать сложно. Решил разобраться на примерах. А тут ошибка появилась.

0

4

Ошибка потому что библиотека для x86,  а не для x64. Если нужно работать с портом в x64 системе, то следует использовать встроенную библиотеку SerialPort.
Так же можно установить PureBasic x86, с которым библиотека MVCOM нормально работает.

0

5

Пётр, спасибо. Разобрался. Заработало.

0

6

А подскажите такой момент.
Используем штатную функцию.
Заслали что-то в буфер для отправки.
Следом, в другом месте программы требуется ещё отправить данные.
Видим, что буфер ещё не опустошился.
Как быть?
Можно ли как-то "объединить" эти два буфера данных?

0

7

Функция WriteSerialPortData ожидает завершения отправки.

Код:
If OpenSerialPort(0, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  Debug "Успешно"
  Dim Buff.a(1024)
  t=ElapsedMilliseconds()
  WriteSerialPortData(0, @Buff(), ArraySize(Buff()))
  Debug ElapsedMilliseconds()-t
  CloseSerialPort(0)
Else
  Debug "Не удалось"
EndIf

0

8

Пётр написал(а):

WriteSerialPortData ожидает

Т.е. программа "зависает" на строке WriteSerialPortData, пока буфер не опустошится?

0

9

Да.

0

10

Пётр написал(а):

Функция WriteSerialPortData ожидает завершения отправки.

Как оказалось, только под Виндой.
Под Линухом ничего не ожидает, и программа двигается дальше (что, кстати, на мой взгляд, логичнее).
По своему вопросу: пока решил использовать дополнительный кольцевой буфер, и отдельный поток для передачи из кольцевого буфера в ком-порт.

0

11

Что-то у меня так и не получается нормально организовать передачу.
Использую функцию AvailableSerialPortOutput для определения окончания передачи.
Но, насколько понимаю, она передаёт значение буфера операционки.
Предполагаю, что в момент записи в этот буфер, байты сразу же начинают передаваться в передатчик УАРТа (или в его аппаратные буферы), в независимости от того, закончена реально передача, или нет.
Косвенно это подтверждается выставлением принудительной задержки в несколько миллисекунд после записи байта в передающий буфер (напомню, что мне надо передавать по одному байту).
Поделитесь, плиз, своими наработками/идеями?

0

12

Наблюдается потеря данных? Иначе зачем контролировать количество байт в буфере передачи?

0

13

Наблюдается зависание программы.
Собственно надо контролировать не количество байт в буфере, а окончание передачи (необходимо передавать байт только после окончания передачи предыдущего).

0

14

Gregory написал(а):

Под Линухом ничего не ожидает, и программа двигается дальше

После WriteSerialPortData добавляете код

Код:
While AvailableSerialPortOutput(Port)>0
   Delay(2)
Wend

И будет ожидание как в винде.

0

15

Пётр написал(а):

И будет ожидание как в винде.

Спасибо, Пётр, но зачем это делать?
Во-первых, 2ms мне не подходят, ибо время передачи байта всего 320us.
А потом я уже выше упоминал, что ИМХО как-раз не логично тормозить программу на время отправки, а логичнее использовать AvailableSerialPortOutput перед записью данных в порт.

0

16

Gregory написал(а):

время передачи байта всего 320us.

Функции WriteSerialPortData можно передать больше байта.
Если 2 мс много, просто исключаем Delay из кода.

Gregory написал(а):

логичнее использовать AvailableSerialPortOutput перед записью данных в порт

Когда производится обмен методом запрос - ответ, перед тем как читать ответ нужно дождаться окончания передачи.

0

17

Пётр написал(а):

нужно дождаться окончания передачи.

Так а в чём противоречие?
Та же функция AvailableSerialPortOutput (сами же выше код приводили).

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » COM порт