RS232 связь, общее время - PullRequest
       10

RS232 связь, общее время

1 голос
/ 29 апреля 2010

У меня есть аппаратная часть, которая отправляет байт данных, представляющих сигнал напряжения с частотой 100 Гц через последовательный порт.

Я хочу написать программу, которая будет считывать данные, чтобы я мог построить их. Я знаю, что мне нужно открыть последовательный порт и открыть поток ввода. Но следующая часть сбивает меня с толку, и у меня возникают проблемы с концептуальным пониманием процесса:

Я создаю цикл while, который считывает данные из входного потока по 1 байту за раз. Как получить синхронизацию цикла while, чтобы всегда был доступен байт для чтения, когда он достигает строки readbyte? Я предполагаю, что я не могу просто поместить функцию сна в цикл while, чтобы попытаться сопоставить ее с частотой дискретизации оборудования. Это просто вопрос продолжения чтения входного потока в цикле while, и если он слишком быстрый, он ничего не будет делать (поскольку новых данных нет), а если он будет слишком медленным, он будет накапливаться в буфере входного потока?

Как я уже сказал, я только пытаюсь понять это концептуально, поэтому любое руководство будет высоко ценится! Я предполагаю, что идея не зависит от того, какой язык программирования я использую, но если нет, предположим, что он используется в Java.

Ответы [ 4 ]

1 голос
/ 29 апреля 2010

Если вы используете API связи Java , то вы вообще не будете опрашивать. Вместо этого вы реализуете SerialPortEventListener и получите обратный вызов, когда данные будут доступны из порта.

public class SerialConnection implements SerialPortEventListener
{
      private SerialPort         sPort;

...
    // Add this object as an event listener for the serial port.
       try
      {
          sPort.addEventListener(this);
       }
      catch (TooManyListenersException e)
      {
          sPort.close();
          throw new SerialConnectionException("too many listeners added");
       }

...
0 голосов
/ 29 апреля 2010

учебник: http://devdot.wikispaces.com/Iphone+Serial+Port+Tutorial

назад к понятию.

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

  • буфер (возможно, до 16 байт или более) в последовательном чипе. когда поступают какие-либо данные, система прерывает вашу программу и сообщает, что в буфере есть новые байты. поэтому программа может получить их в пакете. Кроме того, программа, управляемая прерываниями, не загружает процессор из-за зацикливания байтов.

  • при протокол уровень. последовательный порт это только канал. ваша программа и программа на другой стороне последовательного порта могут иметь протокол более высокого уровня для оптимизации трафика и минимизации потери данных. типичный механизм - xon-xoff.

надеюсь, это поможет

0 голосов
/ 29 апреля 2010

100 Гц довольно медленный - не будет проблем со сном, скажем, 9 мсек ...

Но, как говорит Хэмиш, скорее всего, есть событие, которое уведомляет о наличии данных в буфере - используйте это и помните, что если ваши показания находятся в ASCII или более чем в нескольких байтах, вам нужно будет буферизовать полученные байты, пока иметь полное чтение (или строку ASCII ??) перед фактической обработкой.

Надеюсь, это поможет ...

0 голосов
/ 29 апреля 2010

Вы ждете, пока у порта будет байт (если у него окна, то есть API, чтобы узнать, есть ли у rs232 ожидание байта, или выполнить блокирующее чтение) ... в идеале вы помещаете свой код чтения в отдельный поток. ... жди байтов и добавь их в какую-то значимую структуру данных.

...