В C ++ следующая процедура будет производить все комбинации расстояния длины (сначала k) между диапазоном [первым, последним]:
#include <algorithm>
template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Mark Nelson http://marknelson.us */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator i1 = first;
Iterator i2 = last;
++i1;
if (last == i1)
return false;
i1 = last;
--i1;
i1 = k;
--i2;
while (first != i1)
{
if (*--i1 < *i2)
{
Iterator j = k;
while (!(*i1 < *j)) ++j;
std::iter_swap(i1,j);
++i1;
++j;
i2 = k;
std::rotate(i1,j,last);
while (last != j)
{
++j;
++i2;
}
std::rotate(k,i2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
Его можно использовать следующим образом:
#include <string>
#include <iostream>
int main()
{
std::string s = "12345";
std::size_t comb_size = 3;
do
{
std::cout << std::string(s.begin(), s.begin() + comb_size) << std::endl;
} while (next_combination(s.begin(), s.begin() + comb_size, s.end()));
return 0;
}
Это напечатает следующее:
123
124
125
134
135
145
234
235
245
345
Как заметил Андри, RXTX , по сути, ваш лучший выбор. Здесь есть статья , посвященная началу работы с RXTX в Windows (относящаяся к RXTX 2.1).
Наиболее распространенный каркас, используемый для этого, - rxtx .
Если бесплатно не нужно - помните, ваше время не свободно - тогда Serial IO SerialPort может быть полезен. Это единственное, что я обнаружил, что работает как есть на всех следующих:
Вы получаете исходный код с продуктом, хотя и с некоторыми странными и раздражающими методами сборки.
FWIW, я просто довольный пользователь, не связанный с компания.
rxtx, как говорили другие авторы. Я использовал это, и это работает хорошо. Существует проблема, если использовать нестандартные высокоскоростные скорости передачи (кратны 115200, например, 230400, 921600 в порядке, но 1 МБ - нет, даже если аппаратное обеспечение и соответствующая ОС поддерживают его), мне сказали, что это будет исправлено в rxtx 2.2.