Приветствую! Помогите пож. с COM портом. Как мне сделать генератор событий каждые 100мкСек для быстрой передачи данных через порт? Попробывал закольцевать элемент задержка как в примере, но оно ничего не генерит. Остальная прога рабочая, проверено. И ещё вопрос, можно ли передать через сом не ASC2 а бинарное 11111111(к примеру) одним байтом? code_12086.txt
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
|
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
г. rolin79, каждые 100 мксек в СОМ порт обращаться бесполезно - не то быстродействие у него, да и кольцевания надо избегать.
Каждому байту соответствует символ, его и надо передавать :code_12089.txt |
|||
карма: 19 |
| ||
файлы: 1 | code_12089.txt [348B] [679] |
Ответов: 3851
Рейтинг: 159
|
|||
г. rolin79, можно ещё один компонент посмотреть http://www.hiasm.com/forum.html?q=3&p=54574#p54574 ..
|
|||
карма: 0 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Леонид, при скорости порта всего лишь 115000 скорость передачи байта составляет 1/(115000/10)=87мкСек. Получается что каждый байт нужно передавать каждые 100мкСек, иначе какой прок от такой скорости. С компонентом "поток" у меня всё работает, но там ограничение 15мСек между интерациями и скорость передачи данных получается мизерная.
|
|||
карма: 0 |
|
Ответов: 2125
Рейтинг: 159
|
|||
А зачем отправлять "побайтно"? Нельзя что-ли сразу все данные отправить?
|
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima писал(а): Нельзя что-ли сразу все данные отправить?Действительно, там же буфер UART стоит, что на прием, что на передачу |
|||
карма: 22 |
|
Ответов: 8930
Рейтинг: 823
|
|||
г. г. rolin79, позвольте не согласиться по потоку: code_12101.txt, кроме того широкое применение элемента "Задержка" напрасно кушает ресурсы компьютера.
|
|||
карма: 19 |
| ||
файлы: 1 | code_12101.txt [619B] [623] |
Ответов: 91
Рейтинг: 1
|
|||
Cемён Семёныч!(с) Ну конечно, можно же данные в массив оформить и передать в СOM без всяких задержек методом"перебор массива". А буфер там кажись 4кБайт. Эт у меня мышление такое, программирую МК а там зацикливание- норма жизни. Леонид, это выдержка из помощи :
"Любое циклическое использование потока без внутренней задержки(т.е. Delay=0) приведет к полной загрузке процессора, если основной процесс не занят работой. Связано это с тем, что внутри потока при ненулевой задержки происходит вызов специального метода, который на заданное количество милисекунд полностью останавливает выполнение текущего потока, усыпляет его, и процессор отдыхает в это время". Или справка врёт, или.... Подытожим: я беру число Int(0-255), преобразовываю его в символ Char(1 знак) ,передаю через СОМ порт на МК и он его принимает как Bin(0-255) потому что каждому значению байта от0 до 255 соответствует какой-нибудь символ в ASCII. Я прав? |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
rolin писал(а): Ну конечно, можно же данные в массив оформить и передать в СOM без всяких задержек методом"перебор массива"Еще раз, зачем что-то перебирать Надо просто отправить строку на запись, она будет помещена в буфер и уже аппаратно передана с необходимой скоростью контроллеру |
|||
карма: 22 |
|
Ответов: 8930
Рейтинг: 823
|
|||
rolin, "Теория суха, мой друг, а древо жизни зеленеет!" - процессор не отдыхает, а с максимальной скоростью в цикле получает тики, переводит их в микросекунды и сравнивает с заданием: не пора-ли подать сигнал (см картинку)
В символах прав, конечно |
|||
карма: 19 |
|
Ответов: 91
Рейтинг: 1
|
|||
Леонид, Только что проверил, Вы правы, но скорость передачи всё равно низкая, 4000 bit/sec , слегка плавает. nesco, а как насчёт частоты обращений к СОМу? У меня проблема, я не могу записывать в порт данные побайтово быстро! На схеме внизу блок, который записывает в порт 10 байт кряду, последовательно, ждёт 870мкСек когда порт их отдаст на скорости 115000, опять записывает 10 и так далее. Программа с этим блоком висла, помогло создание параллельного потока для этого блока, но скорость передачи ок. 5kbit а ни как не 115. Кроме того, если взять запуск блока с потока синхронизированного с главным, то прога виснет. Чувствую что натыкаюсь на какое-то ограничение, но что это -не понимаю code_12106.txt
|
|||
карма: 1 |
| ||
файлы: 1 | code_12106.txt [6.9KB] [575] |
Ответов: 3851
Рейтинг: 159
|
|||
массив, да и вообще любая передача порту один байт за одно событие - есть плохая идея (ибо снижает скорость), и может быть оправдана только интерактивностью.. Проще заслать строку целиком (как уже было предложено) и пускай UART делает свою работу..
|
|||
карма: 0 |
|
Ответов: 91
Рейтинг: 1
|
|||
я в ужасе! мне надо что б порт постоянно передавал 0 на выход. я беру строку из 100 нулей, передаю в порт, когда он говорит ОК жду 10мсек для опустошения буфера и закольцовываю. прога виснет! без кольца всё работает. Что это? Обращение к порту каждые 10 мсек не такая уж нагрузка, при зависании - процессор на 46%.
|
|||
карма: 1 |
|
Ответов: 3851
Рейтинг: 159
|
|||
rolin писал(а): мне надо что б порт постоянно передавал 0Windows не относится к системам реального времени, как изветсно, поэтому работа с портом в таком режиме, э, непродуктивна Быть может стоит пересмотреть протокол обмена ПК с контроллером на, например диалоговый или клиент-серверный, ибо постоянная передача (даже не периодическая какая-нить) смахивает на древний "контроль несущей".. Я понимаю, что есть случаи, когда оно выгоднее, но винда для этого не приспособлена.. Ещё вариант - использовать звуковуху или простой "железный" геренатор P.S. Мы опять увязаем в непонимание (скорее даже незнание) задач - как стратегической, так и тактической |
|||
карма: 0 |
|
Ответов: 91
Рейтинг: 1
|
|||
Да, Андрей, Вы совершенно правы. Кроме того, что винда - не RTOS, мне показалось что она на некоторое время отдаёт управление драйверу порта. В итоге таймер который должен отрабатывать каждые 10мСек ,отрабатывал 30 и никак не хотел меньше.Отсюда и непонятки со скоростью записи в порт. Но я таки вышел на номинал в 115к А задача этой "программки на 5минут"( 3день пошёл) очень проста: мигать TX-ом каждые пол-секунды чтобы пробником этот сигнал на плате найти можно было. Зачем? Есть такая тема, покупаем USB DATA кабель от телефона самсунгЕ700 за 5$, втыкаем в комп, уст.дрова и имеем виртуальный СОМ-порт со скоростью 128000. Есть правда ограничения: управлять только стандартными API Read(file) Write(file) и вспомогательные входы-выходы вроде RTS,DTR, управляются по усмотрению драйвера устройства, то есть строго в соответствии со стандартом. Я считаю такой вариант самым простым и дешёвым способом перейти на USB в своих разработках. Всем спасибо за поддержку!
|
|||
карма: 1 |
|