Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2010, 11:01   #1
olegd
 
Регистрация: 01.07.2010
Сообщений: 3
По умолчанию сом порт , БД

начну с того , что я новичок. суть проблемы. есть девайс(индикатор автомобильных весов) с сом портом по которому передаються данные о весе , транспорте , грузе и время . нужно помоч сельчанам с сохранением данных в базу данных . Надеюсь ,что остались еще безкорыстные гении.
olegd вне форума Ответить с цитированием
Старый 02.07.2010, 11:17   #2
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

olegd

а с чем именно проблемы - с передачей данных по сом-порту или с сохранением их в базу данных?

или ты хочешь, чтобы тебе с нуля за здорово живешь написали программу, а ты ее за деньги продал "односельчанам"?
Snejnaya вне форума Ответить с цитированием
Старый 02.07.2010, 11:29   #3
olegd
 
Регистрация: 01.07.2010
Сообщений: 3
По умолчанию

я сам обслуживаю это оборудование и не о какой продаже речь не идет.зачем так писать не зная о человеке ничего.
olegd вне форума Ответить с цитированием
Старый 02.07.2010, 11:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зачем так писать не зная о человеке ничего.
А потому что в твоей теме нет ни намека на проблему.
И нечего сердится ты сам задал вопрос так что на него по другому не ответишь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2010, 12:10   #5
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

автор, какое отношение имеет твоя тема к "помощи студентам"?

на форуме существуют отдельные разделы по БД, и отдельно можно спросить, как осуществляется передача данных по сом-порту (ничего сложного нет - могу выложить пример передачи и приема данных).

если хочешь полностью готовый код - то во фриланс.
Snejnaya вне форума Ответить с цитированием
Старый 03.07.2010, 17:32   #6
olegd
 
Регистрация: 01.07.2010
Сообщений: 3
Хорошо

я просто не знал в каком разделе попросить помощи. спасибо за понимание . пример - это хорошо.давай выложи,если будут какие вопросы ,поможешь?
olegd вне форума Ответить с цитированием
Старый 05.07.2010, 10:05   #7
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

сначала нужно задать кое-какие параметры и вообще "подготовиться" к передаче-приему данных. "Открывают" порт обычно функцией CreateFile

Код:
DCB dcb;
   HANDLE hCom;
   BOOL fSuccess;
   TCHAR *pcCommPort = TEXT("COM1"); 
   DWORD Zero;

hCom = CreateFile( pcCommPort,
                    GENERIC_READ | GENERIC_WRITE,
                    0,    //  must be opened with exclusive-access
                    NULL, //  default security attributes
                    OPEN_EXISTING, //  must use OPEN_EXISTING
                    0,    //  not overlapped I/O
                    NULL //  hTemplate must be NULL for comm devices
                    );
В случае успешного завершения функция CreateFile возвращает идентификатор созданного или открытого файла (или каталога). При ошибке возвращается значение INVALID_HANDLE_VALUE.
fSuccess - переменная булевского типа, в дальнейшем мы будем использовать ее, чтобы удостоверится, что операция завершилась корректно или узнать, что произошла ошибка.

Нужно инициализировать структуру DCB

Код:
dcb.DCBlength = sizeof(DCB);
Код:
fSuccess = GetCommState(hCom, &dcb);
здесь мы считали текущее состояние структуры dcb

далее, собственоно, устанавливаем те параметры, которые нам нужны и настраиваем СОМ-порт
Код:
   dcb.BaudRate = CBR_115200;     // устанавливаем скорость передачи
 данных по СОМ_порту 115200 бит в сек
   dcb.ByteSize = 8;             //  будем передавать информацию по байтам (по 8 бит)
   dcb.Parity   = NOPARITY;      //  задаем паритет(четность)
   dcb.StopBits = 0;//ONESTOPBIT;    // и стоп-биты

  fSuccess = SetCommState(hCom, &dcb);//настраиваем СОМ-порт
Теперь можно переходить к передаче-приему данных по СОМ_порту, например

Код:
fSuccess = WriteFile(hCom, &mas, sizeof(char)*10, &Zero, NULL);
в этой строке мы передаем по СОМ-порту данные, содержащиеся в массиве mas[10], элементы которого - char. Если бы мы хотели передать, допустим, данные из массива mas1[20] с элементами типа int, то строчка была бы такой:

Код:
fSuccess = WriteFile(hCom, &mas1, sizeof(int)*20, &Zero, NULL);
С чтением данных дело обстоит, как правило, несколько сложнее, в следующем посте попробую описать, почему.

Последний раз редактировалось Snejnaya; 05.07.2010 в 10:34.
Snejnaya вне форума Ответить с цитированием
Старый 05.07.2010, 10:34   #8
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

Чтение данных осуществляется функцией ReadFile

Код:
fSuccess = ReadFile(hCom, &c, 1, &Zero, NULL);
&c - адрес переменной, в которую считываем данные (1 байт)
третьим параметром - размер считываемых данных.
третий параметр - размер (в байтах) считываемой информации

Какая сложность тут возникает... От девайса идут данные непрерывным потоком. Тебе нужно определить, где, собственно, начинается полезная информация. В противном случае (т.к. данные считываются побайтно) при чтении из порта данных типа long int, к примеру, может получится полная околесица.

Поэтому ждут "отклика" от девайса - пакета инициализации (назовем его так). Т.е. девайс (его ПО) формирует пакет данных, строго определенной структуры, например:
заголовок-вес-транспорт-груз-время
на каждое поле отводится строго определенный размер. Девайс высылает этот пакет по СОМ-порту, на "той стороне" ты ПОБАЙТНО анализируешь данные и "ловишь" заголовок пакета. Чтобы не пропустить заголовок делают это так: есть какой-то буфер размера 4 байт(к примеру). Идут данные непрерывным потоком
1-2-3-4-5-6-7-8-9-10 и т.д байт.
считываешь 4 байта (1-2-3-4) в буфер, проверяешь, не лежит ли теперь в буфере заголовок пакета. Если не лежит, считываешь следующий байт (пятый), данные в буфере сдвигаешь на один байт и в конец буфера кладешь пятый байт. Получается, что теперь в буфере лежат 2-3-4-5 байты. Не являются ли они заголовком пакета? Нет, считываем шестой байт и т.д. пока не "поймаем" заголовок.

Как только поймали заголовок, можно считывать пакет с собственно полезной информацией - считываем осторожно, учитывая структуру пакета (какие поля сколько места занимают).

Вроде как можно считывать данные типов int, long int и др. размером более 1 байта обычным
Код:
fSuccess = ReadFile(hCom, &long_int_variable, 4, &Zero, NULL)
но по моему опыту часто возникают сложности с таким чтением... Лично мне (когда я делала обмен данными между девайсом и компом) пришлось продолжать чтение по 1 байту, переводить все в двоичную форму а затем из четырех байтов слеплять одно 32-разрядное двоичное число и переводить его в long int - по-другому вылезали косяки
Охотно допускаю, что чтение можно осуществлять и не побайтно... Если кто-то из сведующих зайдет, думаю, меня поправят.
Snejnaya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
освободить СОМ порт varelik Общие вопросы Delphi 11 11.02.2010 21:49
СОМ порт JUDAS Win Api 0 10.01.2009 21:27
вопрос про СОМ-порт фЁдОр Компьютерное железо 8 29.12.2008 16:04
СОМ порт SERG1980 Общие вопросы Delphi 3 17.05.2007 08:06
СОМ порт IR управление мультимедиа Andr12 Свободное общение 2 10.02.2007 12:07