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

 



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