Как я непрерывно отправляю и получаю с беспроводным последовательным портом в 8 051?

"Когда каждый говорит, что "все - объект" (как в Python), он действительно подразумевает, что "все первоклассно"?"

Да.

Все в Python - надлежащий объект. Даже вещи, которые являются "типами примитивов" на других языках.

Вы находите, что объект как 2 на самом деле имеет довольно богатый и сложный интерфейс.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

, поскольку все - первоклассный объект в Python, существует относительно немного неясных особых случаев.

В Java, например, существуют типы примитивов (интервал, bool, дважды, символ), которые не являются надлежащими объектами. Вот почему Java должен представить Целое число, булевскую переменную и Символ как первоклассные типы. Это может быть трудно преподавать новичкам - что не очевидно, почему и тип примитива и класс должны существовать бок о бок.

Это также означает, что класс объекта - сам - объект. Это отличается от C++, где классы не всегда имеют отличное существование во времени выполнения.

тип 2 эти type 'int' объект, который имеет методы, атрибуты и тип.

>>> type(2)
<type 'int'>

тип встроенного типа как int эти type 'type' объект. Это имеет методы и атрибуты, также.

>>> type(type(2))
<type 'type'>
5
задан Benjamin 7 February 2014 в 07:48
поделиться

2 ответа

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

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

  1. Можете ли вы отладить, где вы застряли? действительно ли он в цикле приема?
  2. можно ли регулировать передачу от ПК к микроконтроллеру, чтобы можно было вручную отправлять по одному байту за раз?
  3. Есть ли какое-либо подтверждение связи между микроконтроллером и интерфейсом xbee? это можно регулировать с помощью микро?
1
ответ дан 14 December 2019 в 19:17
поделиться

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

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

Также можно воспрепятствовать этому с помощью связи по опросу, но тогда вам нужно написать функцию, которая проверяет, если символ доступен для приема (или, если tx-empty), для чтения / записи следующего символа из / в буфер.

Преимущества связи на основе прерываний:

  • полный дуплекс
  • меньше используется время процессора (нет необходимости в циклах ожидания);
  • меньше энергопотребление (это позволяет процессору переходить в режим пониженного энергопотребления / ожидания, с пробуждением при прерывании; опрос всегда требует полной мощности)

В качестве первого шага я советую вам реализовать (или получить) прием на основе прерывания; даже когда функция передачи все еще заблокирована, он позволяет работать в дуплексном режиме с минимальными усилиями. Если у вас нет ОС (rtos / scheduler), вам придется подумать о механизме синхронизации. Самая простая форма для вашего приема - обрабатывать сообщение, если оно доступно, и немедленно возвращать, если нет (полного) сообщения.

удачи.

Редактировать после комментариев

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

В качестве первого шага я советую вам реализовать (или получить) прием на основе прерывания; даже когда функция передачи все еще заблокирована, он позволяет работать в дуплексном режиме с минимальными усилиями. Если у вас нет ОС (rtos / scheduler), вам придется подумать о механизме синхронизации. Самая простая форма для вашего приема - обрабатывать сообщение, если оно доступно, и немедленно возвращать, если нет (полного) сообщения.

удачи.

Редактировать после комментариев

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

В качестве первого шага я советую вам реализовать (или получить) прием на основе прерываний; даже если функция передачи все еще заблокирована, он позволяет работать в дуплексном режиме с минимальными усилиями. Если у вас нет ОС (rtos / scheduler), вам придется подумать о механизме синхронизации. Самая простая форма для вашего приема - обрабатывать сообщение, если оно доступно, и немедленно возвращать, если нет (полного) сообщения.

удачи.

Редактировать после комментариев опрос всегда требует полной мощности)

В качестве первого шага я советую вам реализовать (или получить) прием на основе прерываний; даже когда функция передачи все еще заблокирована, он позволяет работать в дуплексном режиме с минимальными усилиями. Если у вас нет ОС (rtos / scheduler), вам придется подумать о механизме синхронизации. Самая простая форма для вашего приема - обрабатывать сообщение, если оно доступно, и немедленно возвращать, если нет (полного) сообщения.

удачи.

Редактировать после комментариев опрос всегда требует полной мощности)

В качестве первого шага я советую вам реализовать (или получить) прием на основе прерываний; даже если функция передачи все еще заблокирована, он позволяет работать в дуплексном режиме с минимальными усилиями. Если у вас нет ОС (rtos / scheduler), вам придется подумать о механизме синхронизации. Самая простая форма для вашего приема - обрабатывать сообщение, если оно доступно, и немедленно возвращать, если нет (полного) сообщения.

удачи.

Редактировать после комментариев Для каждого сообщения может показаться, что все работает, если рабочий стол реагирует на сообщения, отправленные контроллером. Если ваш контроллер имеет большой буфер FIFO (т.е. 64 байта) на приеме, это может сработать. У большинства известных мне контроллеров этого нет. Многие имеют только односимвольный буфер. Вы можете обнаружить это, используя бит OVERFLOW в регистрах; если это установлено, то символы были потеряны при получении.

Некоторые варианты использования: * вы хотите отправить 2 сообщения за один раз (скажем: init + do_something). Компьютер отвечает на первое сообщение, но контроллер все еще отправляет и сбрасывает большую часть данных. * ПК начинает отправку до того, как контроллер выполнит функцию receive (). Данные в начале пакета могут быть потеряны * любое прерывание связи может вызвать взаимоблокировку (т.е. контроллер и рабочий стол ждут, пока другой конец что-то отправит.

Итак, чтобы диагностировать: проверьте бит переполнения. Если он установлен, вы потеряли данные и вам необходимо работайте над функциями прерывания. Если возможно, следите за обеими сторонами (по крайней мере, за состоянием; например, один мигает светодиод для отправки и один для приема).

Монитор rs232 может вам помочь (вам понадобятся дополнительные порты для этого. Существует множество (включая бесплатные) приложений, которые могут отслеживать несколько портов RS232 и предоставлять временные метки. Таким образом, вы можете наблюдать за порядком обмена данными. Google нашел меня: ссылка ; Я использовал несколько похожих утилит в прошлые годы.

4
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: