Флаги ошибок выставляет аппаратура. Как и где обрабатывать зависит от того, что ты передаёшь-принимаешь. Например, в Модбас пакет содержит контрольную сумму, поэтому мне без разницы, по какой причине исказился пакет, шум в линии или DMA не смог переслать байт. Я просто сбрасываю все ошибки, отбрасываю пакет с ошибкой и жду следующий. А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача.
Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?
Добавлено after 1 minute 41 second: А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
Вы имеете виду.Что программно не выставляются эти флаги?Как при приёме так и при передаче пакетов?
Ты даташит читал?
Цитата:
А вот статистику ошибочных пакетов веду, ибо она позволяет понять, что как идёт приём-передача. А как это вы делаете?
Считаю в мастере, сколько запросов к узлу отправил и сколько получил на них ответов с ошибками. Причём, ошибку при неответе узла фиксирую только тогда, когда из 3 запросов хотя бы на один был ответ. Тогда сразу добавляю к счётчику ошибок количество неответов. А то выключат оборудование, оно перестанет отвечать и чё, каждый неответ отмечать как ошибку обмена? В слэйвах считаю количество принятых пакетов в свой адрес и количество битых пакетов.
На своем компе нажмите Пуск->Все программы->Стандартные->Командная строка или по поиску найдите "Командная строка". Откройте ее. Нажмите клавишу Enter. В ответ вам приходит какой-то вразумительный ответ.
Пойдет пример?
Анализ ответа. Я не знаю как в DMA это сделать, а в прерывании делается примерно так: Каждый ответ, назовем его пакет, пакет данных, либо с какого-то символа начинается, либо каким-то символом заканчивается. Вот, к примеру, образец:Спойлер$GNGGA,,,,,,0,00,99.99,,,,,,*56 $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E $GPGSV,1,1,02,08,,,36,27,,,40*77 $GLGSV,1,1,00*65 $GNGLL,,,,,,V,N*7A $GNRMC,070422.53,V,,,,,,,,,,N*66 $GNVTG,,,,,,,,,N*2E $GNGGA,070422.53,,,,,0,00,99.99,,,,,,*7D $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2Eв данном примере каждый пакет начинается с символа $. В прерывании анализируем каждый символ, ждем начала строки, к примеру так Спойлер
Код:
if(data=='$'){ByteCount=0;ComaPoint=0xff;MsgTxt=(char*)&MsgType; return;} //ждем начала строки
Продолжаем принимать байты пакета и анализировать. Далее идет анализ заголовка. Первый символ отбрасываем G, он не нужен, для анализа нужны следующие 4 символа, примерСпойлер
Код:
ByteCount++; if(ByteCount<=1) return; // if(ByteCount<6&&ByteCount>1) //берем 4 символа заголовка { *MsgTxt=data; //и делаем из него число MsgTxt++; return; }
Когда заголовок будет собран, отправляем его на ... что там надо с ним сделатьСпойлер
Код:
switch(MsgType) { case 0x434D524E: //GNRMC // тут что-то делаем return;
Допусти анализируем дальнейший пакет этого заголовкаСпойлер
Где в этом примере показана работа ПДП? Речь в посте про ошибке при обмене с использованием ПДП.
У меня ПДП обслуживает Модбас. Если нужен текстовый ввод-вывод, то это другая пьянка. И да, полноценно использовать DMA получится только в МК с полноценным UART, а не огрызком как в F103. Если у тебя обработка информации от UART является основной деятельностью программы и занимает много времени, то смотри в сторону МК с полноценным UART. Для понимания того, о чём я сказал, сравни возможности UART в F103 и, например, в F091 и F745.
tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины. То что он UART настроил на 19200, а узел отправляет на 57600 - разве это ошибка?
В конце каждого пакета узел может отправлять вам какую нибудь контрольную сумму, и если на стороне приема контрольная сумма не совпала, вы можете считать это за ошибку. В большинстве случаев используются выводы rx tx. А то что провод на половину припаян, да еще и болтается в воздухе, то есть контакт то нету контакта, какие тут ошибки будут?
Без озвучивания ТЗ вы даже не знаете что ТС нужно.
Ему был нужен пример, я дал пример. У ТС во всем ошибки и да же тут.
tonyk, про какие ошибки вы торочите? Это не I2C, что бы можно было анализировать ошибки конфликта шины.
Про те ошибки, что указаны для UART. Их там с десяток. Плюс ошибки DMA. Перечень есть в RM. Анализировать ошибки полезно, потому что они характеризуют качество связи, что очень нелишне в процессе наладки и поиска неисправностей в процессе эксплуатации.
В сниппетах от ST под F0 есть примеры работы USART с DMA, оттуда легко портировать на любую серию при помощи минимума чтения RM. Но, видимо, ТС — не читатель.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
В общем случае по DMA только передачу удобно делать, т.к. прием - неизвестно какой длины. А чтобы и прием организовать по DMA, как уже сказали, нужно прерывание IDLE использовать, т.е. уже какой-то уродский модбас получается с обязательными паузами в конце пакета данных.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Под F103 с DMA только на прием и я могу пример показать. А под F0 интересней: там есть прерывание по символу, так что, можно и на прием DMA использовать без необходимости вводить паузы между пакетами: просто по '\n' будет вызываться прерывание, которое и выставит флаг готовности принятой строки, заодно поменяв приемный буфер на второй (при двойной буферизации, а при желании и куче оперативки можно хоть 100 буферов выделить).
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения