Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Передача через COM-порт.

Автор: Krjuger 3.12.2012 21:53

Суть в общем то такая:
Проверка последовательного порта: передаваемые данные генери¬руются, принимаемые данные накапливаются в памяти; дополнительный конт¬роль - суммированием посылок с циклическим переносом; скорость обмена - от 1200 до 19200 Бод; длина байта - 5 бит.

Поскольку всего 5 бит информационные, то достаточно 3 битов для проверки, что вписывается в байт. Мне показалось, что отправлять целый байт с 3 битами проверочных символов, это кощутство, да и на производительности хреново скажется. Поэтому решил допихивать их в байт с информацией.Хотя тоже спорный вопрос.
Возник вопрос, как подобное действие совершить?
Вот до чего я пока что дошел.


//Процедура отправки байта
unsafe private void Send(byte b, bool error) {
edtSendByte.Text = "";
//Если посылаем в канал с помехами
if (error)
{
//С вероятностью в 40% генерируется ошибка
if ((new Random()).Next(0,5) > 2)
//В b - новый посылаемый байт
b = (byte)(new Random()).Next(0, 32);
}
//Тут надо сделать сдвиг и вычислить CRC




int n = 0;
edtSendByte.Text += b.ToString("X2")+" " ;
edtSendByte.SelectionStart = edtSendByte.Text.Length;
edtSendByte.ScrollToCaret();
//В стек кладем таймер, который потом в конце нам скажет, сколько времени шёл этот символ.
st.Push(new TResult());
do {

System.Threading.NativeOverlapped ol = new System.Threading.NativeOverlapped();
//Отправляем в HandleOut байт b длиной 1.
if (!NativeMethods.WriteFile(HandleOut, &b, 1, &n, ref ol)) {
Log("Пачка не отправлена");
return;
}
//И повторяем отправку, пока не отправится этот символ
} while (n < 1);
}


Здесь нету сдвига и собственно реализации CRC-3, большей мне и не надо.
В свое время писал уже, но для AnsiString да и на С++.

AnsiString Check(AnsiString s)
{
// a / b = c + r * b
int a = 0, b = 0;
AnsiString st = s, st1 = "", st2 = "";
for (int i = 1; i <= 5; i++)
a += StrToInt(st[i]) * pow(2, 5 - i);
b = 11;
int r = a % b;
int k = 0;
while (k < 3)
{
k++;
st1 += IntToStr(r % 2)[1];
r /= 2;
}
for (int i = 1; i <= k; i++)
st2 += st1[k - i + 1];
st += st2;
return st;
}

Но чесно говоря, вообще не вижу это полезным в данном случае.

В общем нужна помощ и теоритическая и практическая.

Автор: nishaknapp 30.07.2022 16:30

Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. https://www.pokernachhilfe.com/4-baccarat-mistakes-that-beginners-may-be-guilty-of-committing/