Накидал читалку данных из ком-порта, вроде ничего особенного не делаю, а по истечение минуты получаю вылет в синий экран смерти.
Читалка крайне жуткая, т.е. выглядит жутко. Там анализ бинарного протокола, и мне было его легче смотреть 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;
} |
|
Вернуться к обсуждению:
Вылет в синий экран при чтении данных из ком-порта C#