реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> работа с COM портом, чтение из приёмного буфера
TigerSHARC
сообщение Feb 21 2011, 10:17
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Здравствуйте!
Никак не могу правильно прочитать данные из COM-порта.

Мой процессор отправляет в компорт в бесконечном цикле (каждые 156 мкс) int-число и две эскейп последовательности в таком виде

int d = 123;
printf("%d"\r\n, d); //отправляю в порт

Теперь моя задача считать на компьютере эти данные в такую же переменную. Посредствам стандартных средств в СBuilder я заливаю всё что передаёться в COM-пот в массив чаров buf зармером 255.

Вопрос: как считывать последовательно эти данные из массива buf в переменную типа int?
Как я понимаю нужно как то логически в цикле разделять набор чисел в массиве buf, а затем преобразовывать в int. Но конструкцию никак не придумаю(((((
буду признателен за любую помощь.
Go to the top of the page
 
+Quote Post
skripach
сообщение Feb 21 2011, 10:50
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
printf("%d"\r\n, d);

printf("%d\r\n", d);

Используйте функцию стандартную atoi.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Feb 21 2011, 11:01
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Что за аtoi ?

Функция printf посылает в порт микроконтроллера числа. Со стороны микроконтроллера всё впорядке. Мне же нужно со стороны хоста(бытовой компьютер) разобрать по сути непрерывный поток чаров в буфере buf и получить числа int, которые в этом потоке передаются, разделяемые esc-последовательностями (\n\r)



Блин, опять с чужого компа зажёл... сорри)

Сообщение отредактировал Zelepuk - Feb 21 2011, 13:16
Go to the top of the page
 
+Quote Post
zombi
сообщение Feb 21 2011, 16:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Как организован доступ к вашему буферу?
Какому числовому значению равны ваши \n,\r?
Какая длина вашего int в байтах?
Почитайте вот это Кольцевой буфер
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 21 2011, 18:19
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



У вас какая скорость передачи в COM? Скорее всего не выше 115200 baud, т.е. 8,7 мкс на бит. Стандартная посылка 8+1 стоп. Итого 9 бит на байт. Вы посылаете int (вроде как 4 байта для TigerShark) + CRLF. Итого 6*9*8,7 = 469 мкс.

Вы шлете данные каждые каждые 156 мкс. И что вы хотите читать?
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 21 2011, 18:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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, а у меня он меняется, так как данные идут непрерывно, но думаю теперь это не проблема, главное концепция ясна.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 21 2011, 18:21
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Zelepuk @ Feb 21 2011, 14:01) *
Функция printf посылает в порт микроконтроллера числа... разделяемые esc-последовательностями (\n\r)

Функция printf имеет "зеркальную" функцию scanf (или родственные ей - fscanf, sscanf) - на персоналке используйте одну из них. Символы \n\r имеют шестнадцатиричные коды 0A и 0D - "перевод строки" и "возврат каретки".
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Feb 21 2011, 18:27
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(sergeeff @ Feb 21 2011, 21:19) *
У вас какая скорость передачи в COM? Скорее всего не выше 115200 baud, т.е. 8,7 мкс на бит. Стандартная посылка 8+1 стоп. Итого 9 бит на байт.
А если прибавить стартовый бит, ситуация ещё более усугубляется sm.gif
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 21 2011, 18:31
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 21 2011, 18:44
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (skripach @ Feb 21 2011, 13:50) *
Используйте функцию стандартную atoi.

Запомните, atoi() НЕ является стандартной ANSI функцией. По этой причине ее нет в доброй половине библиотек.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 21 2011, 18:47
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(TigerSHARC @ Feb 21 2011, 21:31) *
Пардон!)) данные идут каждые 1 мс)


Вы обладаете могучим талантом запудривания мозгов!

Для завершения советую прочитать где-нибудь на просторах inet'a, что называется (и почему) esc-последовательностью.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 21 2011, 18:58
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 как раз является... только она здесь не нужна.
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 21 2011, 19:21
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 21 2011, 19:24
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(ViKo @ Feb 21 2011, 21:58) *
А если приглядеться внимательнее к передаваемому формату, то для 32-битового числа со знаком получается ±2147483648, итого 12 байтов. x10 = 120 битов. x8.7 = 1042us


Ну автор же дошел до светлой мысли (глядя в осцилограф), что COM оказывается сильно тормозит его ADC. Потом додумается и до того, что его "протокол" мягко говоря ...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 21 2011, 19:24
Сообщение #15


Универсальный солдатик
******

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



Цитата(TigerSHARC @ Feb 21 2011, 21:21) *
как не нужна? код выше работает!

Я думал, речь про передачу идет.
Т.е., сначала вы строку преобразовываете в целое, а потом выводите целое в виде строки?!
А просто строку вывести что-то мешает?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016