4 / 4 / 2
Регистрация: 09.03.2012
Сообщений: 24
1

Вылет в синий экран при чтении данных из ком-порта

26.11.2012, 09:27. Показов 1855. Ответов 2
Метки нет (Все метки)

Накидал читалку данных из ком-порта, вроде ничего особенного не делаю, а по истечение минуты получаю вылет в синий экран смерти.
Читалка крайне жуткая, т.е. выглядит жутко. Там анализ бинарного протокола, и мне было его легче смотреть hex-строкой, оттого там всякие преобразования из строки в массив байтов и обратно. Потом бы избавился когда алгоритм нормальный накидаю.
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
            DateTime now = DateTime.Now;            
            StringBuilder hexData = new StringBuilder(); //хранит бинарные строки (буфер)
            bool firstTime = true;
            while ((DateTime.Now - now).Minutes<10) //поставил тестить на 10 минут
            {
                byte[] message = new byte[GPSPort.BytesToRead];
                if (message.Length != 0)
                {
                    GPSPort.Read(message, 0, message.Length);
                    string hex = BitConverter.ToString(message).Replace("-", ""); 
                    hexData.Append(hex);
                    hex = hexData.ToString();
                    if (hex.IndexOf("A0A2") != -1)
                    {
                        hex = hex.Replace("A0A2", "/");
                        if (firstTime)
                        {
                            firstTime = false;
                            //избавляюсь от части до начала сообщения
                            hex = hex.Substring(hex.IndexOf("/"), hex.Length - hex.IndexOf("/"));
                        }
                        int lastInd = 0;
                        int prevInd = 0;
                        int countStartSymb = 0;
                        while ((lastInd = hex.IndexOf("/", lastInd)) != -1)
                        {
                            countStartSymb++;
                            if (countStartSymb == 2)
                            {
                                string messageHex = hex.Substring(prevInd, lastInd - prevInd).Replace("/", "");
                                hex = hex.Substring(lastInd);
                                lastInd = 0;
                                countStartSymb = 1;
                                byte[] tempBytes = HexToBytes(messageHex);
                                if (tempBytes.Length > 4)
                                {
                                    //читаю два байта длины сообщения
                                    int b = tempBytes[0];
                                    int b2 = tempBytes[1];
                                    int length = (((int)b) << 8) + b2 - 1; //считываем длину сообщения (-1 т.к. считываем отдельно номер сообщения)
                                    int id = tempBytes[2]; //номер сообщения
                                    byte[] payload = new byte[length];
                                    Array.Copy(tempBytes, 3, payload, 0, length);          
                                    //два байта чексуммы                        
                                    b = tempBytes[tempBytes.Length - 4]; 
                                    b2 = tempBytes[tempBytes.Length - 3];
                                    int checksum = ((int)b << 8) + b2;
                                    if (MessageBlock.GetChecksum(payload, id) == checksum)
                                    {
                                        if (tempBytes[tempBytes.Length - 2] == 0xB0 && tempBytes[tempBytes.Length - 1] == 0xB3)
                                        {
                                            //тут бы что-то было...
                                        }
                                    }
                                }
                            }
                            prevInd = lastInd;
                            lastInd++;
                        }
                        hexData = new StringBuilder(hex);
                    }
                }
            }
Вот, это всё, что тут есть. Вылетает почти сразу, и минуты не проходит.
Скорость компорта не менял, какая базовая в SerialPort стоит, такая и есть, SerialPort.ReadTimeout/SerialPort.WriteTimeout тоже не трогал.
Что я не так делаю? Вроде нагрузка не такая большая, чтобы вылетать в синий экран.
GPSPort - это класс, унаследованный от SerialPort, с парочкой моих методов. Но тут они не используются.

Добавлено через 10 минут
Вот остальные функции, которые там использовались.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public byte[] HexToBytes(string hex)
        {
            byte[] arr = new byte[hex.Length / 2];
            for (int i = 0; i < hex.Length; i += 2)
            {
                arr[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            }
            return arr;
        }
        public static int GetChecksum(byte[] payload, int id)
        {
            int checkSum = id;
            for (int i = 0; i < payload.Length; i++)
            {
                checkSum += payload[i];                
            }
            return checkSum & 0x7fff;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2012, 09:27
Ответы с готовыми решениями:

Чтение из COM порта, При чтении из порта зависает read()
Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею:...

Переброс данных с ком порта в сеть
Вообщем нужно чтобы устройство подключенное к ком порту. с помощью программы или чего либо еще...

Отображение данных принятых с ком порта (C# windows forms)
Есть контроллер ардуино. Если на него послать через ком порт on контакт 1 будет замкнут, если off...

Ошибка при открытии ком порта
при попытке компиляции выдаёт ошибку: 4 G:\_1codegraf\COM_INIT.h:13 cannot convert 'char*' to...

2
Эксперт .NET
17086 / 12560 / 3300
Регистрация: 17.09.2011
Сообщений: 20,813
26.11.2012, 09:37 2
Да, жуткий - это мягко сказано.

А какой код ошибки на синем экране?
Предполагаю, что что-то не так с драйверами порта, и шарп тут не при делах.
1
4 / 4 / 2
Регистрация: 09.03.2012
Сообщений: 24
26.11.2012, 10:47  [ТС] 3
Как ни странно, но сейчас ее не возникает, хотя мучался пол-дня и сделал перерыв недавно на часик.
IRQL_NOT_LESS_OR_EQUAL - вот такая по памяти была, гугл выдал, что ошибка драйверов действительно.
Читаю по блютузу, его наверное нужно сменить попробовать.

Добавлено через 54 минуты
Нашел, в каких случаях вылетает.
Если я ставлю где-нибудь брекпойнт, а затем снимаю его и жму f5. Тут он и вылетает. Хотя раньше и так просто вылетал. Короче мутное дело, но большое спасибо за наводку. Куплю другой блютуз.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2012, 10:47
Помогаю со студенческими работами здесь

Ошибки при настройке ком-порта
Здравствуйте! Я пишу программу для ком-порта. Пытаюсь заполнить структуры DCB. Четность, количество...

Вылет при чтении в переменную
здравствуйте,вот такая проблема: var a1:Double; an:Double; n:Integer; r:Double; ...

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

Вылет и синий экран х000000ЕА и уходит на перезагрузку.
Доброго времени суток уважаемым форумчанам! проблема с компом состоит в следующем. Работал он у...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru