Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/43: Рейтинг темы: голосов - 43, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13

Передача через COM - порт: разобраться с количеством битов

04.12.2012, 17:00. Показов 8292. Ответов 21
Метки нет (Все метки)

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

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

Саму передачу я вижу как то так.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Процедура отправки байта
        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, большей мне и не надо.

Возможно я не понимаю самого смысла и правильнее будет собрать сначала 4 байта информации( 8 сгенерированных чисел) затем воспользоваться CRC 4 и получить еще 4 байта хеша и отправить в догонку?
В общем вопросов много, нужно, чтобы кто то помог поставить мозги на место.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2012, 17:00
Ответы с готовыми решениями:

Передача данных через ИК порт
Нужно организовать систему передачи данных через инфракрасный на ассемблере. ИК должен подключаться к ком порту. Подскажите пожалуйста,...

Передача сообщений через com порт на си
Добрый день. Столкнулся с такой ситуацией. Нужно передать с 1 компьютера сообщение на другой компьютер ( любое английское слово) по ком...

Передача через COM-порт. Отображение
Всем доброго времени суток. Проблема возникла такая, что при приёме данных (текста в кириллице) отображение в текстбокс происходит не...

21
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.12.2012, 17:09
Цитата Сообщение от Deymus Посмотреть сообщение
4 байта хеша и отправить в догонку?
ага, а на том конце думать, что ты принял, информацию, или код к предыдущему пакету. не вариант.

что могу сказать, есть хороший класс SerialPort в неймспейсе System.IO.Ports
позволяет легко получать/отправлять данные на СОМ порт. CRC советую вычеслять для посылке в целом, а не для одного байта в посылке. могу скинуть метод генерации CRC16 (2 байта), если надо.

слишком большой CRC, на мой взгляд, не нужен, т.к. он в первую очередь отлавливает нечётные ошибки, и его увеличение мало что даст (хотя в этом могу ошибаться).
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:12
...вам проверять работу связи в условиях помех нужно или абы чтобы было? Или модуль протокола какой реализуете? Hу реализуйте контроль CRC как сумму всех предыдущих байт.

CRCL = LOW (CRC);
CRCH = HIGH (CRC) + LOW (CRC);

и двумя байтами в конце.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
04.12.2012, 17:36  [ТС]
О классе знаю, но использовать его запрещено.
Поэтому я выкручивался через ReadFile WriteFile. Для этого пришлось их импортировать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
internal static class NativeMethods
    {
        
        public const uint GENERIC_READ = 0x80000000;
 
        public const uint MAXDWORD = 4294967295;
        //0x80000000;
        public const int GENERIC_WRITE = 0x40000000;
        public const Int32 OPEN_EXISTING = 3;
 
        //Для вычисления времени
        //Вернуть Количство тактов
        [DllImport("kernel32.dll")]
        public extern static bool QueryPerformanceCounter(ref long x);
        //Узнать частоту процссора
        [DllImport("kernel32.dll")]
        public extern static bool QueryPerformanceFrequency(ref long x);
 
        //Отекрыть файл(В нашем случае порт, потому что порт в терминологии винды- это файл
        //Возвращет ХЭНДЛ файла
        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
        public static extern unsafe System.IntPtr CreateFile
        (
            string FileName,          // file name - Имя файла
            Int32 DesiredAccess,       // access mode - атрибут доступа
            Int32 ShareMode,           // share mode - остально не нужно
            IntPtr SecurityAttributes,  // Security Attributes
            Int32 CreationDisposition, // how to create
            Int32 FlagsAndAttributes,  // file attributes
            IntPtr hTemplateFile         // handle to template file
        );
 
        //Чтение из файла(порта)
        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
        public static extern unsafe bool ReadFile
        (
            System.IntPtr hFile,      // handle to file - ХЭНДЛ файла
            void* pBuffer,            // data buffer  - Указатель на буфер
            int NumberOfBytesToRead,  // number of bytes to read  - Длина буфра - размер
            int* pNumberOfBytesRead,  // number of bytes read   - Сюда положится сколько байт считалось
            [In] ref System.Threading.NativeOverlapped Overlapped            // overlapped buffer
        );
 
 
        //Установить настройки порта 
        [DllImport("kernel32.dll")]
        public static extern bool SetCommState(IntPtr hFile, [In] ref DCB lpDCB);
 
        //Запись в файл - аналогично FIleRead
        [DllImport("kernel32", SetLastError = true)]
        public static extern unsafe bool WriteFile(
            IntPtr _hFile,
            void* _lpBuffer,
            Int32 _nNumberOfBytesToWrite,
            Int32* _lpNumberOfBytesWritten,
            [In] ref System.Threading.NativeOverlapped _lpOverlapped);
 
 
        //Получить настройки порта
        [DllImport("kernel32.dll")]
        public static extern bool GetCommState(IntPtr hFile, ref DCB lpDCB);
 
        //Установить настройки таймаутов
        [DllImport("kernel32.dll")]
        public static extern Boolean SetCommTimeouts(IntPtr hFile, [In] ref COMMTIMEOUTS lpCommTimeouts);
 
        //Закрыть нах файл
        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
        public static extern unsafe bool CloseHandle
        (
            System.IntPtr hObject // handle to object
        );
 
 
 
 
        //Процедура получает список КОМ-портов из реестра винды
        public static List<string> GetPort()
        {
            RegistryKey readKey = Registry.LocalMachine.OpenSubKey(@"hardware\devicemap\serialcomm"); //Открываем нужную ветку
            string[] lst = readKey.GetValueNames();  // Получаем список портов
            return lst.Select(p => readKey.GetValue(p).ToString()).ToList(); // Возвращаем его
        }
 
        //Установить настройки порта.
        public static void DCBSet(ref DCB lpDCB, Int32 speed)
        {
            lpDCB.BaudRate = speed;  //   <-  СКОРОСТЬ ПОРТА
            lpDCB.StopBits = 0;
            lpDCB.ByteSize = 5;    //  <-  КОЛИЧЕТВО БИТ В БАЙТЕ
            lpDCB.Parity = 0;
            lpDCB.OutX = false;
            lpDCB.InX = false;
            lpDCB.XonChar = 0x11;
            lpDCB.XoffChar = 0x13;
            lpDCB.XoffLim = 100;
            lpDCB.XonLim = 100;
        }
 
 
        //Настройки тайм аутов. Я не знаю, что они значат, но с ними работает
        public static void SetTimeOut(ref COMMTIMEOUTS cto)
        {
 
            cto.ReadIntervalTimeout = MAXDWORD;
            cto.ReadTotalTimeoutMultiplier = 0;
            cto.ReadTotalTimeoutConstant = 0;
            cto.WriteTotalTimeoutMultiplier = 0;
            cto.WriteTotalTimeoutConstant = 1000;
        }
 
 
    }
Так я инициализируюю порт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
unsafe private IntPtr CreatWritePort(string port, int speed)
        {
 
            IntPtr result = NativeMethods.CreateFile(
                                @"\\.\" + port, //Имя порта
                                unchecked((Int32)NativeMethods.GENERIC_WRITE), //Пишем для чтения
                                0,
                                (IntPtr)0,
                                NativeMethods.OPEN_EXISTING,
                                0,
                                (IntPtr)0
                            );
            //Если ошибка
            if (result == IntPtr.Zero)
            {
                Log("Error: " + port + " не может быть открыт для записи");
                return result;
            }
            //Настройки порта
            DCB lpDCB = new DCB();
            if (!NativeMethods.GetCommState(result, ref lpDCB))
            {
                Log("Error:" + port + " ошибка чтения структуры DCB ");
                NativeMethods.CloseHandle(result);
                return IntPtr.Zero;
            };
            NativeMethods.DCBSet(ref lpDCB, speed);
 
            if (!NativeMethods.SetCommState(result, ref lpDCB))
            {
                Log("Error:" + port + " ошибка записи структуры DCB ");
                NativeMethods.CloseHandle(result);
                return IntPtr.Zero;
            }
            //Тайм-ауты
            COMMTIMEOUTS CommTimeOuts = new COMMTIMEOUTS();
            NativeMethods.SetTimeOut(ref CommTimeOuts);
            if (!NativeMethods.SetCommTimeouts(result, ref CommTimeOuts))
            {
                Log("Error:" + port + " ошибка записи структуры COMMTIMEOUTS ");
                NativeMethods.CloseHandle(result);
                return IntPtr.Zero;
 
            }
 
            Log(port + " открыт для записи ");
            return result;
        }
А так я генерирую и передаю в порт.
C#
1
2
3
4
5
6
7
8
9
10
11
12
 //Самое интересное - таймер, который шлёт символы на порт
        private void timer1_Tick(object sender, EventArgs e)
        {
            //Всякая муть с окнами с текстом
            edtNewByte.Text = "";
            Random r = new Random(); //Берем случайный байт(какое задание - такое и решение  8=======Э)
            byte b = (byte)r.Next(0, 32);
            edtNewByte.Text += b.ToString("X2") + " ";
             //отправляем по байту
                Send(b, chbError.Checked); // отправляем байт
                Send(getCRCHash(b), chbError.Checked);
         }
Еще такой вопрос, за что именно отвечает параметр ByteSize в настройках Com - порта?

Добавлено через 12 минут
...вам проверять работу связи в условиях помех нужно или абы чтобы было?
Мне нужно продемонстрировать, что CRC работает, поэтому, я создал checkbox который отвечает за то, что передаем мы без помех, или с помехой.Помеху я сам вношу.
Никаким модулем протокола это и не пахнет, просто мне нужно получить данные, как изменяется реальная скорость передачи данных с CRC проверкой в зависимости от настроек порта. Мне важен сам факт нахождения ошибки, даже не важно какой.

Это такая лабораторная работа. Поэтому задание такое кривое.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 17:51
как изменяется реальная скорость передачи данных с CRC проверкой в зависимости от настроек порта
от CRC никак не изменяется: у вас есть таймауты между посылками, а обработка CRC при формировании, разборе практически мгновенна. Также в общем пакете CRC занимает ничтожную часть, два байта максимум.

p.s.: вот ежели вы по реализуете запрос на повтор передачи ошибочно принятого пакета, вот тогда - да.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
04.12.2012, 18:00
не совсем, можно интервал между посылками не делать, а отправлять следующий запрос по приходу ответа.
таким образом время потери при отправки сообщения с CRC =
(время формирования CRC)+(количество байт в CRC * 8)/скорость в бодах

другое дело что, насколько я вижу, при данном коде непонятно сколько время уйдёт на генерацию странной ошибки (чёрт его знает насколько продуктивный класс рандома), а потом, сверху него, всё равно высчитается CRC, что делает данную проверку совсем уж странной.

Цитата Сообщение от Deymus Посмотреть сообщение
как изменяется реальная скорость передачи данных с CRC проверкой в зависимости от настроек порта
никак. какие-бы ни были настройки, порт не считает CRC - это проблема того что принимает посылку, по этому скорость будет одинаковой. но как я писал выше: время - нет.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
04.12.2012, 18:24  [ТС]
Я принципи это прекрасно понимаю, но преподаватель поставил такое задание, мне нужно нарисовать ему график и показать , что программа работает.
вот ежели вы по реализуете запрос на повтор передачи ошибочно принятого пакета, вот тогда - да.
Нене, это уже не тот уровень.
Также в общем пакете
Вот тут поподробнее, а то у меня уже каша намечается. Во первых, за что отвечает ByteSize в настройках порта, во вторых, что за общий пакет? Или под общим пакетов вы подразумеваете, что я делаю свой буфер, накапливаю туда, например, 4 байта, выполняю CRC и посылаю через порт?

Нет, суть задачи в том, что через видимые промежутки времени мне нужно сгенерировать число, состоящее из 5 бит, затем передать его, на принимающей стороне стоит буфер и накапливает их, когда буфер заполняется, он тупо выводит мне полученные данные и результаты в соответствующие listbox'ы.

Добавлено через 11 минут
а потом, сверху него, всё равно высчитается CRC, что делает данную проверку совсем уж странной.
Идея была такая для 5 битного символа вычислить CRC, для обнаружения одинарной ошибки достаточно полинома 3 стемени и соответственно 3 двоичных символов, а значит у меня выходит 5 бит информации 3 бита проверка. Если у меня включен режим ошибки, то я вместо 5 инф битов генерирую новое число от 1 до 32, в итоге у меня отправляется число новое а CRC его старый, что эквивалентно ошибке при передаче.
Возможно моя проблема в том, что 5 бит я рассматриваю, как последоватльность из 5 двоичных символов и вполне естественно хочу дописать к ним еще 3 проверочных.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 20:08
...вы все время упоминаете полином. А сами понимаете, каким образом он будет корректировать (не обнаруживать) ошибку? Потому как CRC и использование циклического кода-полинома - не одно и то же, почитайте про БЧХ-коды.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
04.12.2012, 20:26  [ТС]
В общем решил сделать так, байты отправляю по мере создания, когда набирается пачка и n(заданное число), вычисляю CRC и отправляю следом. Возникла проблема. Все пачки приходят с ошибкой , но генерация случайной ошибки отключена. И на глаз, такое ощущение, что когда начинаю, он выводит мусор сначала, а потом уже нужные мне символы,в итоге получаю сдвиг и Хэш, понятное дело, не совпадает.
Прилагаю целиком проект.

А сами понимаете, каким образом он будет корректировать (не обнаруживать) ошибку?
Руками я пол года считал их и схемой умножения и схемой деления с задержкой, и методом групового кода,так что представление имею. Мне не нужна корректировка. Мне лишь нужно получить ответ произошла ошибка при передаче, или нет. Эту ошибку я сам буду вносить(нажав галочку на форме).Это нужно, чтобы наглядно продемонстрировать работоспособность моей программы по поиску ошибок при передаче.

Ни задача, ни программа не имеют никакого хоть сколько-нибудь требуемого для решения реальных задач смысла.Потому что те ограничения, накладываемые на задачу( запрет использования стандартных средств API для осуществления дополнительного контроля, использование только средств Win32 API работы с файлами (функции CreateFile, GetCommState и т.д.) делают эту задачу не более чем обучающей.
Вложения
Тип файла: rar COM.rar (75.8 Кб, 52 просмотров)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 21:18
В общем решил сделать так, байты отправляю по мере создания, когда набирается пачка и n(заданное число), вычисляю CRC и отправляю следом.
вот это правильно.

Возникла проблема. Все пачки приходят с ошибкой , но генерация случайной ошибки отключена. И на глаз, такое ощущение, что когда начинаю, он выводит мусор сначала, а потом уже нужные мне символы
а вы не на глаз смотрите, пройдитесь сниффером по отправляемым пакетам ...portmon.

Также для тестов вам пригодится virtualnullmodem.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
04.12.2012, 21:55  [ТС]
Да мой преподаватель выделил нам VirtualSerialPortDriver 6.9.Там создается сразу пара портов.Я попробовал запустить предложенную вами программу,но потерпел неудачу. Если я запускаю программу, потом portmon,то выдает Ошибка чтения структуры DCB для принимающего порта. Причем повторный запуск не помогает, приходится снова Build программу и только после этого она снова начинает запускаться.
Щас буду пытаться
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 22:08
ам VirtualSerialPortDriver 6.9
http://www.aggsoft.ru, рекомендую.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
04.12.2012, 23:04  [ТС]
Посмотрим.

Добавлено через 54 минуты
Собственно, вот что я получил:
Для отправляющего порта.
#0A
<COM2: 2012.12.04 22:55:01.987 TX>
#08#06#04#02#F9#61#11#10#0E#0C#0A
<COM2: 2012.12.04 22:55:02.864 TX>
#1C#07#19#17#16#14#12#76#BF#01#1F#1D#1C# 1A#23#19#09#07#05#03#02#4C#45#11#0F#0D
<COM2: 2012.12.04 22:55:04.935 TX>
#0B#09#A9#E2#18#17#15#13#11#F9#4E#00#1E# 1D#1B#19#5D#14#08#06#05#03#01#30#78#10#0 E
<COM2: 2012.12.04 22:55:07.016 TX>
#0C#0B#09#C4#1E#18#16#14#12#11#A8#E2#00# 1E#1C#1A#18#CC#84#07#06#04#02#00#F5#E9#0 F
<COM2: 2012.12.04 22:55:09.087 TX>
#0D#0C#0A
<COM2: 2012.12.04 22:55:09.413 TX>
#08#91#C8#17#15#13#12#10#8C#A6#1F#1D#1B# 19#18#E8#33#07#05#03#01#1F#05#54#0E#0D#0 B
<COM2: 2012.12.04 22:55:11.487 TX>
#09#07#5D#3D#16#14#13#11#0F#F1#A2#1E#1C# 1A#19#17#C5#CB#06#04#02#01#1F#68#A8#0E#0 C
<COM2: 2012.12.04 22:55:13.569 TX>
#0A
<COM2: 2012.12.04 22:55:13.674 TX>
#08#07#0C#91#15#14#12#10#0E#24#32#1D#1C# 1A#18#16#41#9B#05#03#02#00#1E#ED#8C#0D#0 B
<COM2: 2012.12.04 22:55:15.747 TX>
#09#08#06#78#25#15#13#11#0F#0E#DD#76#1D# 1B#19#17#15#F5#1E#04#03#01#1F#1D#68#7D#0 C
<COM2: 2012.12.04 22:55:17.825 TX>
#0A
<COM2: 2012.12.04 22:55:17.935 TX>
#09#07#05#01#E8#14#12#10#0F#0D#F0#8B#1C# 1A#18#16#15#99#72#04#02#00#1E#1D#39#D1#0 B

И для принимающего порта
<COM3: 2012.12.04 22:55:01.991 RX>
#08#06#04#02#19#01#11#10#0E#0C#0A
<COM3: 2012.12.04 22:55:02.870 RX>
#1C#07#19#17#16#14#12#16#1F#01#1F#1D#1C# 1A#03#19#09#07#05#03#02#0C#05#11#0F#0D
<COM3: 2012.12.04 22:55:04.939 RX>
#0B#09#09#02#18#17#15#13#11#19#0E#00#1E# 1D#1B#19#1D#14#08#06#05#03#01#10#18#10#0 E
<COM3: 2012.12.04 22:55:07.020 RX>
#0C#0B#09#04#1E#18#16#14#12#11#08#02#00# 1E#1C#1A#18#0C#04#07#06#04#02#00#15#09#0 F
<COM3: 2012.12.04 22:55:09.092 RX>
#0D#0C#0A
<COM3: 2012.12.04 22:55:09.422 RX>
#08#11#08#17#15#13#12#10#0C#06#1F#1D#1B# 19#18#08#13#07#05#03#01#1F#05#14#0E#0D#0 B
<COM3: 2012.12.04 22:55:11.492 RX>
#09#07#1D#1D#16#14#13#11#0F#11#02#1E#1C# 1A#19#17#05#0B#06#04#02#01#1F#08#08#0E#0 C
<COM3: 2012.12.04 22:55:13.573 RX>
#0A
<COM3: 2012.12.04 22:55:13.678 RX>
#08#07#0C#11#15#14#12#10#0E#04#12#1D#1C# 1A#18#16#01#1B#05#03#02#00#1E#0D#0C#0D#0 B
<COM3: 2012.12.04 22:55:15.752 RX>
#09#08#06#18#05#15#13#11#0F#0E#1D#16#1D# 1B#19#17#15#15#1E#04#03#01#1F#1D#08#1D#0 C
<COM3: 2012.12.04 22:55:17.834 RX>
#0A
<COM3: 2012.12.04 22:55:17.942 RX>
#09#07#05#01#08#14#12#10#0F#0D#10#0B#1C# 1A#18#16#15#19#12#04#02#00#1E#1D#19#11#0 B

Большинство символов совпадает, но кое где проскакивают совершенно разные.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2012, 23:53
...таймаут увеличьте ...с какой скоростью у вас таймер данные фигачит и какова скорость обмена для порта?
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
05.12.2012, 16:28  [ТС]
Таймаут 300, скорость обмена 1200. Таймер где то в районе 600+- для пачки из 5 символов. Вообще я теперь столкнулся немного с другой проблемой. У меня переданная и принятая информация совпадают, а вот хэш нет....

Добавлено через 16 часов 23 минуты
В общем, на данный момент я дошел до следующего.Сами данные у меня передаются правильно.CRC оба раза вычисляется одинаковый, но из-за того, что в настройках Com порта стоит 5 бит, после пересылки на принимающий порт изначальный хеш портится и при сравнении выдает ошибку....Надо править реализацию CRC или шаманить с передачей?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
 
public class Crc16 {
    const ushort polynomial = 0xA001;
    ushort[] table = new ushort[256];
 
    public ushort ComputeChecksum(byte[] bytes) {
        ushort crc = 0;
        for(int i = 0; i < bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes[i]);
            crc = (ushort)((crc >> 8) ^ table[index]);
        }
        return crc;
    }
 
    public byte[] ComputeChecksumBytes(byte[] bytes) {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }
 
    public Crc16() {
        ushort value;
        ushort temp;
        for(ushort i = 0; i < table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j < 8; ++j) {
                if(((value ^ temp) & 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table[i] = value;
        }
    }
}
Вот CRC, который я использовал.В общем не отказался бы от помощи.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
05.12.2012, 16:50
crc тут ни причем.

что в настройках Com порта стоит 5 бит
это где у вас такое?
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
05.12.2012, 17:14  [ТС]
В файле ImportFunc.
Просто иначе я вообще не могу понять для чего в задании указывается,что 5 бит информационные.от полинома 3 степени отказались. Или предлагаете реализовать CRC3?Тем более, что проверяю я не каждое число, а целый пакет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 //Установить настройки порта.
        public static void DCBSet(ref DCB lpDCB, Int32 speed)
        {
            lpDCB.BaudRate = speed;  //   <-  СКОРОСТЬ ПОРТА
            lpDCB.StopBits = 0;
            lpDCB.ByteSize = 5;    //  <-  КОЛИЧЕТВО БИТ В БАЙТЕ
            lpDCB.Parity = 0;
            lpDCB.OutX = false;
            lpDCB.InX = false;
            lpDCB.XonChar = 0x11;
            lpDCB.XoffChar = 0x13;
            lpDCB.XoffLim = 100;
            lpDCB.XonLim = 100;
        }
 
 
        //Настройки тайм аутов. Я не знаю, что они значат, но с ними работает
        public static void SetTimeOut(ref COMMTIMEOUTS cto)
        {
 
            cto.ReadIntervalTimeout = MAXDWORD;
            cto.ReadTotalTimeoutMultiplier = 0;
            cto.ReadTotalTimeoutConstant = 0;
            cto.WriteTotalTimeoutMultiplier = 0;
            cto.WriteTotalTimeoutConstant = 1000;
        }
Если есть желание и возможность, могу скинуть весь проект целиком.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
05.12.2012, 20:01
lpDCB.ByteSize = 5; // <- КОЛИЧЕТВО БИТ В БАЙТЕ
и давно вы байты с битами путаете?

Вот что вам посоветую - нарисуйте свой пакет данных, побитно, на бумажке.
0
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 13
05.12.2012, 22:43  [ТС]
А что я неправильно сказал?Этот параметр, как утверждает MSDN, отвечает за "The number of bits in the bytes transmitted and received." То есть количество бит в байте передаваемой и принимаемой информации.Поскольку числа я генерирую от 0 до 31, то в двоичном представлении оно не более 5 бит и нормально передается.А вот когда я вычисляю CRC16, то используется весь байт, то есть все 8 бит.Когда я его передаю,в соответствии с настрочками приходит лишь 5 из 8 бит.Остальные скорее всего просто отбрасываются(не уверен, может затираются).Поэтому отправив, например, CRC хэш 255 254,я получу 31 и 30.Попытаясь сравнить его с внов вычесленным CRC от полученных данных, я получаю всегда ошибку. В итоге данные верные, а хэш не совпадают, и изменение хэша происходит именно в момент передачи чтения.

Что в моих рассуждениях неверно?
А прошу я помоч с тем, как выкручиваться из этой ситуации. Если я изменю настрочку lpDCB.ByteSize = 8; то программа будет делать все,как надо, но тогда теряется смысл самого задания в том, что инф символов может быть только 5.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
05.12.2012, 23:46
"The number of bits in the bytes transmitted and received.
...верно, но CRC-то вы суете не 5-ти битный.

но тогда теряется смысл самого задания в том, что инф символов может быть только 5.
на самом деле вы эти 5-бит можете включить в "нормальный" байт, а оставшиеся биты занулить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2012, 23:46
Помогаю со студенческими работами здесь

Передача данных через Com порт
Добрый день форумчане! Мне с помощью программы &quot;free-serial-port-monitor&quot; удалось считал данные, которыми через com порт обменивались...

Передача данных через последовательный порт
Ребят, всем добрый вечер! Предстоит следующая задача: нужно реализовать, например - в отдельном классе, функции для передачи данных через...

Передача файлов на телефон через COM порт
Помогите пожалуста понять как можно осуществить передачу файлов на мобильный телефон через АТ команды!Как посылать АТ команды на телефон и...

Передача данных через com -порт на микроконтроллер
Добрый день. Учусь передавать данные на микроконроллер. Данные передаются по com порту. Почитал информацию и своял во это: using System; ...

Получение и передача данных через COM порт
Добрый день Мне кажется, я изобретаю велосипед и должно быть полно примеров такого кода. Но ничего найти не удалось. Суть:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru