|
работа с COM портом, чтение из приёмного буфера |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 21 2011, 10:50
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата printf("%d"\r\n, d); printf("%d\r\n", d); Используйте функцию стандартную atoi.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Feb 21 2011, 18:21
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
За ссылку про кольцевой буфер спасибо. А задача уже решена. Вот решение кому интересно:
#include <stdlib.h> #include <stdio.h> #include <string.h> int main (int argc, char ** argv) { char buf[] = "32321\n\r32322\n\r32323\n\r", *pb = NULL; // здесь полагаем, что buf мы прочитали из COM порта pb = buf; for(;;) { // проверяем есть ли начало escape последовательности char *ptr = strstr(pb, "\n\r"); if (!ptr) break; // если да, то завершаем найденный указатель на \0 // чтобы функция atoi() смогла отработать *ptr = '\0'; int a = atoi(pb); // теперь в a бинарное представление строки // выводим в консоль прочитанное число if (a) printf("I've just read %d!\n", a); // смещаемся на начало новой строки pb = ptr + 1; } return 0; }
только это вариант для статического буфера buf, а у меня он меняется, так как данные идут непрерывно, но думаю теперь это не проблема, главное концепция ясна.
|
|
|
|
|
Feb 21 2011, 18:31
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(sergeeff @ Feb 21 2011, 21:19)  У вас какая скорость передачи в COM? Скорее всего не выше 115200 baud, т.е. 8,7 мкс на бит. Стандартная посылка 8+1 стоп. Итого 9 бит на байт. Вы посылаете int (вроде как 4 байта для TigerShark) + CRLF. Итого 6*9*8,7 = 469 мкс.
Вы шлете данные каждые каждые 156 мкс. И что вы хотите читать? я посылаю строку в COM-порт. эта строка соответствует набору чмсел в int. Короче данные идут(это видно в терминале). Пардон!)) данные идут каждые 1 мс) Поясню для чего я это делаю. Просто мой процессорный модуль, который шлёт данные, выступает в качестве некоего АЦП, который оцифровал синусоиу и шлёт данные (числа - это отсчёты синуса). Так вот, получается что скорость передачи данных накладывает ограничения на частоту дискретизации этого виртуального "синуса"
Сообщение отредактировал TigerSHARC - Feb 21 2011, 18:40
|
|
|
|
|
Feb 21 2011, 18:58
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(RabidRabbit @ Feb 21 2011, 20:27)  А если прибавить стартовый бит, ситуация ещё более усугубляется А если приглядеться внимательнее к передаваемому формату, то для 32-битового числа со знаком получается ±2147483648, итого 12 байтов. x10 = 120 битов. x8.7 = 1042us Цитата(zltigo @ Feb 21 2011, 20:44)  Запомните, atoi() НЕ является стандартной ANSI функцией. По этой причине ее нет в доброй половине библиотек. atoi как раз является... только она здесь не нужна.
|
|
|
|
|
Feb 21 2011, 19:21
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(sergeeff @ Feb 21 2011, 21:47)  Вы обладаете могучим талантом запудривания мозгов!
Для завершения советую прочитать где-нибудь на просторах inet'a, что называется (и почему) esc-последовательностью. здесь я их использовал для того чтобы данные отображались в терминале красиво, столбиком. Толкьо и всего. Но никак для разделения чисел как таковых. ничего я не запудриваю просто вы щите подвоха в постановке задачи. А тем временем она уже решена)) код выше я уже прикладывал. ВОТ! Цитата(ViKo @ Feb 21 2011, 21:58)  А если приглядеться внимательнее к передаваемому формату, то для 32-битового числа со знаком получается ±2147483648, итого 12 байтов. x10 = 120 битов. x8.7 = 1042us
atoi как раз является... только она здесь не нужна. как не нужна? код выше работает!
Сообщение отредактировал TigerSHARC - Feb 21 2011, 19:21
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|