2013-07-22 4 views
0

Я получаю сообщения от интерфейса CAN в моем устройстве mBed. Затем устройство mBed анализирует информацию для отправки по последовательному каналу на другое устройство. Информация отправляется в следующем формате.MBed/Arduino RS-232 Проблема с последовательной связью

«< msg> xxxxxxxxxxxxxxxxxxx </msg>" где x = шестнадцатеричное число.

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

[1]xxxx< /msg>< msg>xxxxx 
[2]xxxxxxxx< msg>xxxxxxx 
[3]< /msg>< msg>xxxxxxxxx 
[4]xxx< /msg>< msg>xxxxxx 
**Please ignore the space in the msg tag, it was necessary to show on StackOverflow'** 

установленную скорость передачи данных 38400bps на mBed. Я не использую никакой четности, стоп-бит, начальный бит и т. Д., Поскольку я не слишком хорошо знаком с тем, как они работают. Может ли кто-нибудь помочь мне, как я могу исправить эту потерю в формате, или мне придется включить код в принимающее устройство, чтобы справиться с этим?

Большое спасибо заранее!

+1

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

+0

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

+0

* «Я не использую никакой четности, стоп-бит, начальный бит и т. Д., Так как я не слишком хорошо знаком с тем, как они работают». * - Затем вы должны узнать, как они работают, а затем соответствующим образом настроить последовательный порт. Эти атрибуты не являются необязательными параметрами; они необходимы для правильной конфигурации. Если вы не хотите надежной последовательной связи. Проблема, которую вы вызываете, называется потерей кадра сообщения. – sawdust

ответ

2

Это нормально, последовательные порты не достаточно умны, чтобы распознавать XML. Вам нужно будет написать код самостоятельно. Основным алгоритмом является конечный автомат. Объявите буфер, достаточно большой для хранения полного сообщения. Тогда:

  1. выбросить все вы получите, пока вы не получите «<»
  2. магазин байтов, которые вы получаете в буфере, пока вы не получите «>»
  3. чек, который вы получили <msg>, обратно в состояние 1, если вам не
  4. магазин байт появляется в буфере, пока вы не получите «>»
  5. чек, который вы получили <msg/>, обратно в состояние 1, если вы не
  6. процесс сообщение, в состояние 1

Это гарантирует, что вы правильно синхронизируете с шиной при открытии порта и что вам все равно, сколько байтов вы получаете в одном вызове read().

+0

Да, я знаю, что он не распознает XML, тэг предназначен только для разграничения между началом сообщения и концом сообщения. Когда вы ссылаетесь на «Объявить буфер ...» Я предполагаю, что вы имеете в виду создание буфера на принимающем устройстве. Из того, что я могу сказать, метод приема на принимающем устройстве вызывается дважды, чтобы получить полные 30 байтов данных. около 14 байтов по первому методу, а остальные 16 - во втором вызове. Спасибо за ваш ответ! –

+1

Число байтов, которое вы получите, совершенно непредсказуемо, это критически зависит от времени. Тенденции падают в шаблоны, но загружают машину тяжелее или вносят изменения в ваш код, и он изменяется. Нет, этот буфер должен существовать в вашем коде. Просто массив байтов. –

+0

* «Синхронизация с шиной» * - Последовательная связь не является «шиной». Проблема заключается в синхронизации фрейма ** **. – sawdust