2013-04-23 4 views
3

У меня возникла проблема с связью с датчиком акселерометра. Датчик непрерывно выводит около 8000 показаний в секунду. Датчик подключается к порту USB с помощью адаптера и отображается как com4. Моя проблема заключается в том, что я не могу отобразить пакеты считывания сенсоров из потока байтов. Пакеты имеют размер пять байтов и имеют следующий формат:Идентификация пакетов в байтовом потоке

  High nibble      Low nibble 

Byte 1  checksum, id for packet start X high 
Byte 2  X mid       X low 
Byte 3  Y high       Y mid 
Byte 4  Y low       Z high 
Byte 5  Y mid       Y low 

X, Y, Z является ускорение.

В документации к датчику указано, что высокий первый бит в первом байте является контрольной суммой (расчетная величина Xhigh + Xlow + Yhigh + Ylow + Zhigh + Zlow), а также идентификация начала пакета. Я довольно новичок в программировании против внешних устройств и не могу понять, как контрольная сумма может использоваться как идентификатор для начала пакета (не будет ли контрольная сумма постоянно меняться?). Является ли это распространенным способом идентификации начала пакета? Кто-нибудь знает, как решить эту проблему?

Любая помощь была бы принята с благодарностью.

+0

Какие это пакеты? UDP? TCP? или какой? –

+0

@ J.Davidson это должен быть один из них. Могут ли это быть байтовые блоки с внешнего устройства? – I4V

+0

5 байт/пакет, 8000 в секунду = 40 Кбит/с, для этого вам потребуется скорость в 400000, а не стандартная проблема. COM-настройка –

ответ

2

... не может понять, как контрольная сумма может быть использована в качестве идентификатора для начала пакета (не будет контрольная сумма меняется все время?).

Да, контрольная сумма изменится, поскольку она получена из данных.
Но даже начальный пакет с фиксированной стоимостью (сам по себе) не будет достаточным для (первоначально) идентификации (или проверки) пакетов данных. Поскольку это двоичные данные (а не текст), данные могут принимать то же значение, что и любой фиксированный начальный пакет. Если у вас было тривиальное сканирование этого начального куска, этот алгоритм мог бы легко ошибочно идентифицировать данные в качестве начального куска.

Это общий способ идентификации начала пакета?

Нет, но с учетом высокой скорости передачи данных, похоже, схема минимизации размера пакета.

Есть ли у кого-нибудь идеи, как решить эту проблему?

Возможно, вам придется сначала сканировать каждую последовательность байтов пять за раз (т. Е. Длину кадра пакета).
Рассчитайте контрольную сумму этого фрейма и сравните его с первым полубайтом.
Соотношение указывает, что вы (возможно) имеете выравнивание кадра.
Несоответствие означает, что вы должны бросить первый байт и протестировать следующий возможный пакетный кадр, который начнется с того, что было вторым байтом (т. Е. Сдвинуть 4 оставшихся байта и добавить новый 5-й байт).

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

1

Что вам нужно сделать, так это получить бесплатный SerialPortTerminal в C# import в вашем проекте и сначала проверить все данные и пакеты, которые вы получаете, если только вы этого не сделали. Чем только для чтения вам нужно будет сделать что-то вроде ...

using System; 
    using System.IO.Ports; 
    using System.Windows.Forms; 

    namespace SPE 
    { 
    class SerialPortProgram 
    { 
     // Create the serial port with basic settings 
     private SerialPort port = new SerialPort("COM4",  9600, Parity.None, 8, StopBits.One); 

     [STAThread] 
     static void Main(string[] args) 
     { 
     // Instatiate this class 
     new SerialPortProgram(); 
     } 

     private SerialPortProgram() 
     { 
     Console.WriteLine("Incoming Data:"); 

     // Attach a method to be called when there  // is data waiting in the port's buffer 
     port.DataReceived += new   SerialDataReceivedEventHandler(port_DataReceived); 

     // Begin communications 
     port.Open(); 

     // Enter an application loop to keep this thread alive 
     Application.Run(); 
     } 

     private void port_DataReceived(object sender,  SerialDataReceivedEventArgs e) 
     { 
     // Show all the incoming data in the port's buffer 
     Console.WriteLine(port.ReadExisting()); 
     } 
    } 
    } 
+0

Считаете ли вы, что у ОП есть проблемы с * чтением данных * или ** интерпретацией этого **. Я вижу в комментариях «Я наблюдал за кусками (все они), но я не могу найти никого, кто остается постоянным» – I4V

+0

Да, я, кажется, умею читать данные, но я не могу его правильно интерпретировать. Я попробую ваш код завтра и сравните его с результатами моих. – karra