Вот 3 процедуры чтения, записи в порт. Можно через прерывания, это еще несколько строк. int usart_class::USART_PrintChar(char c, FILE *stream) { USART_SendChar(c); return 0; } //--------------------------------------------------------------------------------- int usart_class::USART_GetChar(FILE *stream) { while ( !(USART0.STATUS & USART_RXCIF_bm)) {;} return USART0.RXDATAL ; } //--------------------------------------------------------------------------------- void usart_class::USART_SendChar(char c) { while ( !(USART0.STATUS & USART_DREIF_bm) ) {;} USART0.TXDATAL = c ; } Что тут сложно для отправки и принятия байта? Просто у меня это в виде классов, но это можно на функции переделать. c - это символ для передачи. Это для tiny 3216
Комментарии: 77
Anonim
У него там какая-то сложность с размером ардуиновского байта
Saw
Просто новые TINY - это мелкие АРМ
Anonim
Он мне код присылал, но я уже забыл о чем там проблема, факт что что-то не работало действительно.
Saw
1 байт в буфере. для передачи. Все же просто. Мы загоняем 1 байт в регистр на передачу, и он сам передает его, мы не паримся битами. Мы только проверяем, буфер пустой или нет. Если пуст, загоняем следующий. Можно в цикле, можно через прерывание проверять. А пока он передает, мы следующий порт обрабатываем
Dim
вот нашел пример из меги
Saw
Я тупо не вижу проблемы.
Dim
я вот как думаю: объявляем три уарта заходим в бесконечный цикл проверка на наличие пакета от 1го тюнера проверка на наличие пакета от 2го тюнера проверка на наличие пакета от модема обрабочик прерываний от тюнеров и модема читаем побайтно в буфер1 от тюнера 1 читаем побайтно в буфер2 от тюнера 2 читаем побайтно в буфер3 от модема
Andrey
немного неправильно
Dim
это не вдаваясь в детали именно на этом этапе нужно получить 100% верность приема всех пакетов от всех устройств!
Saw
Зачем проверять в цикле наличия принятого символа в буфере? Вроде есть прерывание на это?
Dim
не символа, а пакета!
Saw
Вы передаете по 8 бит? Значит байт.
Boy
это что за ntsc
Dim
я работаю с пакетами байт!
Saw
Да я файлы по 10Мб пересылаю... но побайтно!!! У вас свой протокол написан, отличный от 8N1 ?
Dim
мне нужна абстракция на уровне пакетов, а не байт
Saw
Я думаю, вы не понимаете как это работает, вот и проблема.
Dim
это вы не понимаете потому что понятия о протоколах обработки ифнормации не имеете потому что вы привыкли с одним байтом работать
Saw
если я дам вам реальное описание протоколов... вы просто офигеете, что так можно сделать.
Dim
так у меня протоколы простые срс32 мд 5 и аес128 екб
Saw
Ясно, смысла нет дальше продолжать. У вас просто путаница.
Dim
это у вас путаница между байтом и пакетом байт
Saw
ну ваш aes , скажем aes-128 это блоки кода по 64 байта.
Andrey
это еще не все. у них в узбекистане 2008 год. компов под Win10 нету, интернет по капельке, современные средства разработки и платформы недоступны.
Andrey
абстракция простая. пока весь твой пакет не лежит в буфере - никакого пакета нет.
Dim
а как это узнать?
Andrey
по факту приема последнего БАЙТА из пакета
Dim
мне нужно получить массив байт (пакет) -только он меня инетерсует если бы я хотел работать с байтом - писал бы асме и как этот факт определить?
Saw
Ну получили, дальше? a[] = {0x01; 0x02; 0x03; 0x04}; Дальше что делаем? 4 байта у вас. Как будете передавать в порт, который берет 8 бит? У RS-232 пакет (стандартный) 8N1 Можно и 12N1, если надо.
Dim
ты погоди - надо еще правильно получить!
Saw
Я уже уже вам дал 4 байта в массиве дальше что? Не гадайте, будете в цикле передавать по-байт-но! да хоть у вас пакет будет 500 байт...
Dim
зчем в цикле? есть же либа готовая serial write (buf, size of buf)
Saw
Вы разберитесь как это работает, потом будете на либах делать. Вы не пишите код сами, вот и проблема, вы не понимаете как это работает.
Dim
так я затем и взял ардуина что б не залазить пальцем в задницу
Saw
У меня это одна строка - USART0.TXDATAL = c ; Дунька это для простоты работы, ускорения разработки.... Но если надо на уровне железа, пишите руками.
Dim
давай щас не будем х_ми мериться ладно?
Saw
Дунька пустой код минимальный - делает в 3Кб!!! А написаный руками - 120 байт.
Dim
на асме еще напишу - на сях - нет
Saw
Просто я к тому, что 2 дня мозг выносить передачей байтов... это капец.
Andrey
ее внутренние часы тащить не обязательно повсюду.
Dim
я исправил асм я знаю лучше
Andrey
ок
Dim
для пиков писал сам!
Andrey
ну вот. бери мегу 2560 и асм для комстроки... и поехали
Dim
и опять возник вопрос с признаком оканчания пакета он у меня возник еще раньше и до сих пор тянется пила в ардуине не шарит - с этим понятно как и я
Andrey
ну это тебе вопрос. у тебя же протоколы все на руках, ты знаешь что принимается - значит знаешь, когда оно все принялось
Dim
так вот на асме я следил за концом каждого байта
Andrey
да это и понятно,на софтуарте иначе никак.
Dim
и если после конца долго не следовало начало - считал что пакет закончен
Andrey
это и есть таймаут
Dim
хард уарт получается этого поределить не может?
Saw
а зачем?
Andrey
чего этого? таймаут приема отработать?
Dim
да
Saw
А зачем?
Andrey
он это и не должен делать, это уже уровнем выше операция
Dim
вот скажи мне ты дурак? значит для него пофигу - идет пакет или 10 байт с инетрвалот м в 1 час?
Saw
Ну ты просто объясни мне , тупому, если у тебя протокол, зачем тебе знать конец передачи?
Dim
в одном пртоколе видно длину посылки в другом нет
Saw
Ну дык если у тебя протокол соответствует определенной структуре и пришел короткий или длинный или нет признака конца... то это считается битый, мы его откидываем и ждем новый пакет.
Dim
нету признака конца
Saw
Ну тогда есть его длина, он же стандартный, раз это протокол.
Dim
хотя вру, для команд модема это 0A 0D
Saw
Это вообще не обязательно. Я так понял, нет структуры программы, до портов еще далеко....
Andrey
в каком-то смысле да. Если твоя программа ничего вообще не делает, кроме выборки байта из уарта в рам, то написанное тобой точно и верно.
Dim
хреновый уарт ! хоть и хард
Andrey
ну видимо под твою задачу еще не придумали МК.
Alexander
Вот. В точку
Andrey
а то уже вопрос тебе как знатоку протоколов обмена. либо длина известна заранее, либо есть признак окончания, либо таймаут.
Dim
сразу спрошу тут можно можно какое то прерывание реализовать?
Andrey
кстати даже для твоих дремучих компов есть решение. AVRASM это мелкий EXE меньше мегабайта. где именно тут?
Andrey
у тебя никак в голове масштаб времени не сойдется.
Dim
там от 30 - до 400 байт пакет
Boy
ска не то
Anonim
Ну и что, там какая-то функция void serialEvent, мне не известная Можно только догадываться, что внутри. А внутри ISR http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-3.html читать до просветления
Anonim
Он хочет обрабатывать строку из байт
Saw
Ну массив байт... передаем.... a[] = "Передаем байты"; for{int i = 0; i< sizeof(a);i++} { a[i] ....} Ну 2 дня писать 5 строк кода... капец. Мозг проел.