Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#31: 2009-03-10 09:19:45 ЛС | профиль | цитата
Приветствую! Помогите пож. с COM портом. Как мне сделать генератор событий каждые 100мкСек для быстрой передачи данных через порт? Попробывал закольцевать элемент задержка как в примере, но оно ничего не генерит. Остальная прога рабочая, проверено. И ещё вопрос, можно ли передать через сом не ASC2 а бинарное 11111111(к примеру) одним байтом? code_12086.txt
карма: 0

0
Ответов: 8930
Рейтинг: 823
#32: 2009-03-10 10:30:21 ЛС | профиль | цитата
г. rolin79, каждые 100 мксек в СОМ порт обращаться бесполезно - не то быстродействие у него, да и кольцевания надо избегать.
Каждому байту соответствует символ, его и надо передавать :code_12089.txt
карма: 19

0
файлы: 1code_12089.txt [348B] [679]
Ответов: 3851
Рейтинг: 159
#33: 2009-03-10 12:46:30 ЛС | профиль | цитата
г. rolin79, можно ещё один компонент посмотреть http://www.hiasm.com/forum.html?q=3&p=54574#p54574 ..
карма: 0
начавший
0
Гость
Ответов: 17029
Рейтинг: 0
#34: 2009-03-10 15:53:34 ЛС | профиль | цитата
Леонид, при скорости порта всего лишь 115000 скорость передачи байта составляет 1/(115000/10)=87мкСек. Получается что каждый байт нужно передавать каждые 100мкСек, иначе какой прок от такой скорости. С компонентом "поток" у меня всё работает, но там ограничение 15мСек между интерациями и скорость передачи данных получается мизерная.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#35: 2009-03-10 15:58:42 ЛС | профиль | цитата
А зачем отправлять "побайтно"? Нельзя что-ли сразу все данные отправить?
карма: 1

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#36: 2009-03-10 16:48:40 ЛС | профиль | цитата
tsdima писал(а):
Нельзя что-ли сразу все данные отправить?

Действительно, там же буфер UART стоит, что на прием, что на передачу
карма: 22

0
Ответов: 8930
Рейтинг: 823
#37: 2009-03-10 18:09:03 ЛС | профиль | цитата
г. г. rolin79, позвольте не согласиться по потоку: code_12101.txt, кроме того широкое применение элемента "Задержка" напрасно кушает ресурсы компьютера.
карма: 19

0
файлы: 1code_12101.txt [619B] [623]
Ответов: 91
Рейтинг: 1
#38: 2009-03-10 19:01:41 ЛС | профиль | цитата
Cемён Семёныч!(с) Ну конечно, можно же данные в массив оформить и передать в СOM без всяких задержек методом"перебор массива". А буфер там кажись 4кБайт. Эт у меня мышление такое, программирую МК а там зацикливание- норма жизни. Леонид, это выдержка из помощи :
"Любое циклическое использование потока без внутренней задержки(т.е. Delay=0) приведет к полной загрузке процессора, если основной процесс не занят работой. Связано это с тем, что внутри потока при ненулевой задержки происходит вызов специального метода, который на заданное количество милисекунд полностью останавливает выполнение текущего потока, усыпляет его, и процессор отдыхает в это время". Или справка врёт, или....
Подытожим: я беру число Int(0-255), преобразовываю его в символ Char(1 знак) ,передаю через СОМ порт на МК и он его принимает как Bin(0-255) потому что каждому значению байта от0 до 255 соответствует какой-нибудь символ в ASCII. Я прав?
карма: 1

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#39: 2009-03-10 19:20:58 ЛС | профиль | цитата
rolin писал(а):
Ну конечно, можно же данные в массив оформить и передать в СOM без всяких задержек методом"перебор массива"

Еще раз, зачем что-то перебирать Надо просто отправить строку на запись, она будет помещена в буфер и уже аппаратно передана с необходимой скоростью контроллеру
карма: 22

0
Ответов: 8930
Рейтинг: 823
#40: 2009-03-10 19:42:36 ЛС | профиль | цитата
rolin, "Теория суха, мой друг, а древо жизни зеленеет!" - процессор не отдыхает, а с максимальной скоростью в цикле получает тики, переводит их в микросекунды и сравнивает с заданием: не пора-ли подать сигнал (см картинку)
В символах прав, конечно
карма: 19

0
Ответов: 91
Рейтинг: 1
#41: 2009-03-10 20:48:32 ЛС | профиль | цитата
Леонид, Только что проверил, Вы правы, но скорость передачи всё равно низкая, 4000 bit/sec , слегка плавает. nesco, а как насчёт частоты обращений к СОМу? У меня проблема, я не могу записывать в порт данные побайтово быстро! На схеме внизу блок, который записывает в порт 10 байт кряду, последовательно, ждёт 870мкСек когда порт их отдаст на скорости 115000, опять записывает 10 и так далее. Программа с этим блоком висла, помогло создание параллельного потока для этого блока, но скорость передачи ок. 5kbit а ни как не 115. Кроме того, если взять запуск блока с потока синхронизированного с главным, то прога виснет. Чувствую что натыкаюсь на какое-то ограничение, но что это -не понимаю code_12106.txt
карма: 1

0
файлы: 1code_12106.txt [6.9KB] [575]
Ответов: 3851
Рейтинг: 159
#42: 2009-03-10 21:09:24 ЛС | профиль | цитата
массив, да и вообще любая передача порту один байт за одно событие - есть плохая идея (ибо снижает скорость), и может быть оправдана только интерактивностью.. Проще заслать строку целиком (как уже было предложено) и пускай UART делает свою работу..
карма: 0
начавший
0
Ответов: 91
Рейтинг: 1
#43: 2009-03-10 21:27:17 ЛС | профиль | цитата
я в ужасе! мне надо что б порт постоянно передавал 0 на выход. я беру строку из 100 нулей, передаю в порт, когда он говорит ОК жду 10мсек для опустошения буфера и закольцовываю. прога виснет! без кольца всё работает. Что это? Обращение к порту каждые 10 мсек не такая уж нагрузка, при зависании - процессор на 46%.
карма: 1

0
Ответов: 3851
Рейтинг: 159
#44: 2009-03-10 23:26:37 ЛС | профиль | цитата
rolin писал(а):
мне надо что б порт постоянно передавал 0

Windows не относится к системам реального времени, как изветсно, поэтому работа с портом в таком режиме, э, непродуктивна
Быть может стоит пересмотреть протокол обмена ПК с контроллером на, например диалоговый или клиент-серверный, ибо постоянная передача (даже не периодическая какая-нить) смахивает на древний "контроль несущей"..
Я понимаю, что есть случаи, когда оно выгоднее, но винда для этого не приспособлена..
Ещё вариант - использовать звуковуху или простой "железный" геренатор

P.S. Мы опять увязаем в непонимание (скорее даже незнание) задач - как стратегической, так и тактической
карма: 0
начавший
0
Ответов: 91
Рейтинг: 1
#45: 2009-03-11 08:44:23 ЛС | профиль | цитата
Да, Андрей, Вы совершенно правы. Кроме того, что винда - не RTOS, мне показалось что она на некоторое время отдаёт управление драйверу порта. В итоге таймер который должен отрабатывать каждые 10мСек ,отрабатывал 30 и никак не хотел меньше.Отсюда и непонятки со скоростью записи в порт. Но я таки вышел на номинал в 115к А задача этой "программки на 5минут"( 3день пошёл) очень проста: мигать TX-ом каждые пол-секунды чтобы пробником этот сигнал на плате найти можно было. Зачем? Есть такая тема, покупаем USB DATA кабель от телефона самсунгЕ700 за 5$, втыкаем в комп, уст.дрова и имеем виртуальный СОМ-порт со скоростью 128000. Есть правда ограничения: управлять только стандартными API Read(file) Write(file) и вспомогательные входы-выходы вроде RTS,DTR, управляются по усмотрению драйвера устройства, то есть строго в соответствии со стандартом. Я считаю такой вариант самым простым и дешёвым способом перейти на USB в своих разработках. Всем спасибо за поддержку!
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)