[an error occurred while processing this directive]
Ответ: Не пытайтесь обрабатывать принемаемую посылку в реальном времени.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Д_М 18 июля 2006 г. 09:39
В ответ на: Ответ: Не могли бы вы по подробней рассказать. Я начинающий и у меня сейчас стоит задача связи ПК и МК на расстоянии 800-900 метров удаленных устройств несколько, как это сделать За раннее благодарен!!! отправлено Dred73 18 июля 2006 г. 08:21

Заполняем массив до тех пор, пока не наступит молчание со стороны передающего устройства, либо до заполнения буфера. Потом, в фоновом режиме, принятое анализируем по адресу устройства, по функциям, по адресам данных, по CRC. Если всё ОК, то распихиваем данные, по назначению. Рекомендую оформить в виде объединения:

union
{
char UART_Bulk [TESTLEN];
struct
{
char Network_Address;
char function;
unsigned int start_address;
unsigned int qty_of_registers;
char byte_count;
unsigned int data;
unsigned int CRC;
} MBUS_W_Request;
struct
{
char Network_Address;
char function;
unsigned int start_address;
unsigned int qty_of_registers;
unsigned int CRC;
} MBUS_W_Response;
struct
{
char Network_Address;
char function;
unsigned int start_address;
unsigned int qty_of_registers;
unsigned int CRC;
} MBUS_R_Request;
struct
{
char Network_Address;
char function;
char byte_count;
char FC_Status;
char Dummy;
int FC_Errors;
unsigned int FC_NW_Errors;
unsigned int FC_Setpoint_frequency;
unsigned int FC_Output_frequency;
unsigned int CRC;
} MBUS_R_Response;
} Buffer;

Принемаемые данные складываются в Buffer.UART_Bulk Потом обращаетесь к любым полям объединения Buffer Передавать наоборот, опять же целым массивом. Ещё Вам понадобится макросик для перестановки байтов #define byte_swap(par) ((par<<8) | (par>>8))

Вот пример обращения к полям
Buffer. MBUS_W_Request. start_address = byte_swap(0x0002);

Это кусок из проекта для х86-совместимой платформы. Из-за того, что древний Borlan Turbo C не допускает безымянные объединения, пришлось делать так громоздко. IAR C AVR допускает безымянные объединения.
union
{
struct
{
char
MBUS_data_arr [size_MBUS_data_array],
MBUS_Byte_Count;
unsigned int MBUS_Quantity;
char
*MBUS_Address,
MBUS_Function,
Net_Address;
};
char buff_UART [size_MBUS_data_array + size_MBUS_Head];
};

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание