IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Передача через COM-порт.
Krjuger
сообщение 3.12.2012 17:53
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Суть в общем то такая:
Проверка последовательного порта: передаваемые данные генери¬руются, принимаемые данные накапливаются в памяти; дополнительный конт¬роль - суммированием посылок с циклическим переносом; скорость обмена - от 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;
}

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

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

Сообщение отредактировано: Krjuger - 3.12.2012 17:57
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 1.08.2025 19:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"