Хочу связать ардуино с delphi и в том и том новичек. Нашел компонент порта, написал простой терминальчик. Отправляет и принимает все чудесно но вот в чем беда: когда в порт поступают данные срабатывае процедура, процедура возвращает переменную strig с данными с порта. Размер ее всегда разный от 2 до 900 символов.Когда я вывожу их через memo.text=memo.text+strig все работает. А вот как мне складывать ее и выделять из этого потока нужные мне данные. Например приходит А31+5В52С475+D12 после слияния и выделения у меня переменные А:=315 В:=52 С:=475 Может там какие маркеры начала конца или как все провернуть не знаю
Я конечно в delphi не разбираюсь, но обязательно сразу все посылать в порт? может по очереди высылать и обрабатывать?
Маркеры начала и конца пакета Вы сами должны поставить при отправке. Например, первым байтом ставите маркер начала, затем длину пакета и сами данные, а в конце контрольную сумму - сумму всех байт пакета (берется только младший байт суммы либо сумма считается по модулю). Другими словами, вам нужно придумать свой протокол. Отсылка по очереди ничего не даст - данные могут придти как угодно в порт, ОС может свои задержки поставить или склеить 2 посылки вместе. Принимайте данные в виде байтов, а не строк.
А Дельфи тут совершенно ни при чем. Порт есть порт - байт отправили, байт приняли. Контролировать целостность пакета надо всегда, рано или поздно проскочит помеха и исказит данные - вот тут-то контрольная сумма и поможет забраковать и отбросить пакет.
Нужен простенький алгоритмик: например состояния датчиков света, тепла и т.д. передать в Delphi. На мой взгляд данный алгоритм будет полезен и в обратном направлении.
Мож совместно что либо придумаем ?! Мне кажется это будет много кому интересно. Небольшой протокол для обмена данными с программами. Если чиркнуть скетч для Ардуино, то по основным критериям его любой сможет перевести в обратную сторону для своей удобной платформы.
Да тут и придумывать нечего... Допустим, нам нужно отправить 3 байта: Код (Text): #define HEAD 0x55 // заголовок пакета #define DATA_LENGTH 3 // количество байт данных в пакете byte packet[DATA_LENGTH + 3]; // буфер для сборки пакета void buildPacket(byte* data) { packet[0] = HEAD; packet[1] = DATA_LENGTH; int controlSumm = 0; for(int i = 0; i < DATA_LENGTH; i++) { packet[2 + i] = data[i]; controlSumm += data[i]; } packet[2 + DATA_LENGTH] = (byte)controlSumm; } Остается только отправить пакет в порт.
Со сборкой пакета понятно, а вот его сборка при приеме? С отправкой в обратную сторону заголовка и контрольной суммы для проверки целостности.
Не надо ничего обратно отправлять. На стороне приема пакет проверяется и либо идет в обработку, либо отбрасывается.
Алгоритм приема: 1. Ждем байт. совпадающий с заголовком. Переходим на шаг 2. 2. Принимаем байт и сохраняем его - это количество байт данных. Переходим на шаг 3. 3. Принимаем нужное количесто байт данных, которое мы узнали на предыдущем шаге. Одновременно считаем контрольную сумму. Переходим на шаг 4. 4. Принимаем байт - контрольную сумму и сравниваем с подсчитанной. Если совпало - обрабатываем пакет. Переходим на шаг 1.