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

SerialPort COM, запрос-ответ

23.11.2014, 06:21. Показов 8849. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Значица работаю с устройством через COM-порт. Есть спецификация. При включении устройства оно посылает на компорт Connect message. С этим проблем нет, запускаю отдельный поток в котором слушаю компорт вот:
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
 class Program
    {
        static SerialPort myCOM;
 
        static void Main(string[] args)
        {
            myCOM = new SerialPort("COM2", 38400);
            myCOM.Open();
            if(myCOM.IsOpen)
            {
                Console.WriteLine("Opened");
                Thread t = new Thread(() => ReadData());
                t.Start();
            }
 
            Console.Read();
        }
 
        static string ReadData()
        {
            string buff = "";
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if(buff.Length == 52)
                    {
                        Console.WriteLine(buff);
                        return buff;
                    }
                }
            }
        }
вот такая вот строка приходит при включении
{{++!!0000E0001A1,CONNECT;LTR3_SERIAL_23 71297F!!--}}

И вот мне нужно отправлять на устройство запроси и слушать ответы, но чего то не получается, либо я не понял как это делается
В методе Main(),после строчки Console.Read();, формирую строку запроса, и пишу ее в порт, и слушаю что придет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Console.Read();
            if (myCOM.IsOpen)
            {
                byte[] datar = new byte[256];
                TransportFrame tc = TransportFrame.Create(packetNumber, ETransportFrameType.LoadtronicProtocols, "1; ;10");
                packetNumber++;
                myCOM.Write(tc.CompleteMessage);
                Thread.Sleep(600);
                myCOM.Read(datar, 0, datar.Length);
                Console.WriteLine(Encoding.UTF8.GetString(datar, 0, datar.Length));
 
            }
            Console.Read();
        }
Но код останавливается на myCOM.Read и ничего не получает.
Очень нужно научиться вести диалог с устройством, и потом парсить данные что приходят.
З.Ы. Устройство называется LOADTRONIC, кому надо прикрепляю спецыфикацию запросов (del), может я чего то там важного не заметил. И клас формирующий строку запроса (del).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2014, 06:21
Ответы с готовыми решениями:

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?: serPort.BaseStream.Write(data,0,datalen); ...

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

Ответ на Get запрос
на сайте крутиться код <html> <head> <title></title> <?php echo "wtf"; ?> ...

22
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.11.2014, 09:27
...у вас уже есть параллельный поток чтения из порта ReadData(), его используйте.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.11.2014, 10:02
Franky, что-то никак не могу скачать спецификацию протокола. Закиньте сюда, или на другой файлообменник...
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
23.11.2014, 17:41  [ТС]
raxp, окей пытаюсь сделать так
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
 class Program
    {
        static SerialPort myCOM;
 
        static int packetNumber;
 
        static void Main(string[] args)
        {
            Thread t;
            myCOM = new SerialPort("COM2", 38400);
            myCOM.Open();
            if(myCOM.IsOpen)
            {
                Console.WriteLine("Opened");
                t = new Thread(() => ReadData(""));
                t.Start();
            }
 
            Console.Read();
            if (myCOM.IsOpen)
            {
                byte[] datar = new byte[256];
                TransportFrame tc = TransportFrame.Create(packetNumber, ETransportFrameType.LoadtronicProtocols, "1; ;10");
                packetNumber++;
                t = new Thread(() => ReadData(tc.CompleteMessage));
                t.Start();
            }
            Console.Read();
        }
 
        static string ReadData(string s)
        {
            string buff = "";
            myCOM.Write(s);
            Thread.Sleep(500);
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if(buff.Length == 52)
                    {
                        Console.WriteLine(buff);
                        return buff;
                    }
                }
            }
        }
    }
И все равно код останавливается на чтении.

insite2012, А так? DID 50752 Loadtronic Serial Protocol v0.7-2.7z
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.11.2014, 17:56
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(myCOM.IsOpen)
            {
                Console.WriteLine("Opened");
                t = new Thread(() => ReadData(""));
                t.Start();
            }
 
            Console.Read();
            if (myCOM.IsOpen)
            {
                byte[] datar = new byte[256];
                TransportFrame tc = TransportFrame.Create(packetNumber, ETransportFrameType.LoadtronicProtocols, "1; ;10");
                packetNumber++;
                t = new Thread(() => ReadData(tc.CompleteMessage));
                t.Start();
            }
            Console.Read();
не находите странным создавать два раза подряд поток?
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
23.11.2014, 18:13  [ТС]
raxp, А как мне тогда логичнее сделать.
Пробую еще так
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
 class Program
    {
        static SerialPort myCOM;
 
        static int packetNumber;
 
        static void Main(string[] args)
        {
            Thread t;
            myCOM = new SerialPort("COM2", 38400);
            myCOM.Open();
            if(myCOM.IsOpen)
            {
                Console.WriteLine("Opened");
                t = new Thread(() => ReadData());
                t.Start();
            }
            Console.Read();
        }
 
        static string ReadData()
        {
            string buff = "";            
            Thread.Sleep(500);
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if(buff.Length == 52)
                    {
                        Console.WriteLine(buff);
                        break;
                    }
                }
            }
            byte[] datar = new byte[256];
            TransportFrame tc = TransportFrame.Create(packetNumber, ETransportFrameType.LoadtronicProtocols, "1; ;10");
            packetNumber++;
            myCOM.Write(tc.CompleteMessage);
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if (buff.Length == 52)
                    {
                        Console.WriteLine(buff);
                        return buff;
                    }
                }
            }
        }
    }
Все равно запрос улетел а в ответ ничего не прилетает
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.11.2014, 19:01
...логичнее сначала построить логику-алгоритм поведения своей программы прежде, чем писать код. оки, снимите сниффером дамп обмена, Portmon к примеру. Увидим, что отсылаете и приходит ли чего в ответ на самом деле, может элементарно с настройками порта проблемы или несоответствие протоколу.
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
23.11.2014, 19:07  [ТС]
raxp, Программу буду строить потом, для начала хочется отправить на устройство простой запрос и получить простой ответ.
Цитата Сообщение от raxp Посмотреть сообщение
снимите сниффером дамп обмена, Portmon к примеру. Увидим, что отсылаете и приходит ли чего в ответ на самом деле, может элементарно с настройками порта проблемы или несоответствие протоколу.
А вот тут непонял.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.11.2014, 19:13
http://technet.microsoft.com/r... 96644.aspx
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.11.2014, 19:28
Franky, полистал немного протокол, ну у погуглил. Если я все верно понял, то это протокол обмена по последовательному порту с каким-то устройством, для доступа к какой-то базе данных, находящейся на удаленном устройстве.
Расскажите поточнее, как (и с чем) все это работает, чтобы не переводить мануал.
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
23.11.2014, 20:15  [ТС]
insite2012, Устройство называется LOADTRONIC, устанавливается на экскаваторы, погрузчики, и т.д. Устройство экономит время на взвешивание поднятого материала, относительно штатных датчиков встроенных в экскаваторы. Кроме того, в устройство можно загружать/посылать новие "задачи" на выполнение, где водителю указывается какой материал и в каком количестве надо загрузить. Кроме того в устройстве имеется своя база данных с выполненными работами, или с теми что еще предстоит выполнить, материалов, проэктов, заказчиков, локаций ,и т.д.
До сих пор обмен происходил между кабиной водитеся и будкой оператора на стройплощадке например, у них там какая то штатная програмулина которая выгружает все в эксельевский файл. Я прохожу стажировку в компании которая разработала вэб-приложение для удобства учета ресурсов на всяких больших стройках, и все такое. Учет прэектов конкретного пользователя, количество сотрудников, каждий сотрудник регистрирует сколько часов и над каким проэктом он работал, какой материал расходовался, и т.д. И клиенты хотят чтобы была возможность не вводить даные из LOADTRONIC-а вручную каждый раз в наше приложение, а чтобы LOADTRONIC умел автоматически синхронизировать данные между свой базой, и базой нашего приложения. Обмен будет происходить посредством GSM соединения. И вот пока мне прислали поковырять устройство пока что через COM, потом все переделается на сокеты. И кроме простого Connect message ничего получить от устройства не удается.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.11.2014, 20:30
Цитата Сообщение от Franky Посмотреть сообщение
Устройство называется LOADTRONIC, устанавливается на экскаваторы, погрузчики
Это я уже понял, нагуглил.
Цитата Сообщение от Franky Посмотреть сообщение
мне прислали поковырять устройство пока что через COM
А штатная программа есть, или вы сразу с нуля свою пишете? Я это к тому, что отмониторить бы протокол шттаной программы...
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
23.11.2014, 20:47  [ТС]
insite2012, Нет, есть только устройство и Technical Note, ито уже третью версию мне присылают. Я их раньше просил чтобы прислали пример исходящего и входящего сообщений, что-бы хоть знать как его еще все парсить потом, но пока что прогресса немного.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
23.11.2014, 21:15
у них там какая то штатная програмулина которая выгружает все в эксельевский файл
Нет, есть только устройство и Technical Note, ито уже третью версию мне присылают
выписывайте командировку, если никто не хочет прислать штатную. Снимите дамп на месте. В большинстве случаев это срабатывает, чтобы менеджера/руководство подняли свои мягкие места и решили вопрос с ПО разработчика, ибо на командировки нужны мани

Но, перед этим дамп обмена (пост #9) с устройством в тему, дабы видеть реалии жизни. Может ответ есть, да у вас затык.
1
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
24.11.2014, 18:08
Самый простой для вас сейчас способ выяснить, что не так - использовать portmon и(опционально) terminal by Br@y ++
В дальнем будущем рекомендую вам переделать проект следующим образом:
во-первых, создайте класс-обёртку вокруг вашего порта. Пусть serialPort будет закрытым полем этого класса.
во-вторых, в этом классе создайте не один,а два дополнительных потока - один на приём, другой на передачу.
Естественно, в таком случае нужно написать блокировку вокруг поля ком-порта, чтобы потоки не пытались писать/читать одновременно.
Наконец, третье и самое важное. У вас в протоколе чётко объявлены границы пакета, есть условный stx и условный etx. Это гораздо проще, чем например у термопринтеров, которые просто плюются байтами на печать, периодически без всякого предупреждения разбавляя этот поток ещё и командами, без всяких старотовых бит, контрольных сумм и прочего. Вам легче - читайте с порта не текст, а байты, при чём по одному в цикле. Ожидайте стартовый байт, остальное игнорируйте. Когда похожее на стартовый байт будет обнаружено, читайте дальше всю стартовую последовательность побайтово. Тогда будет однозначно известно, что пришёл пакет. Также ожидая конец пакета точно будет известно, когда он закончится, а перед ним ещё и crc, можно проверить правильность пакета. Останется только распарсить данные.

Однако замечу, что у портмона есть свои минусы. Он не перехватывает непосредственно байты ком и лпт портов, он перехватывает события винды о передаче байтов. Следовательно, если устройство послало вам в порт кучу байт, но их ни одно программа не вычитала, портмон ничего не покажет, будто устройство молчало. Учтите это.
Если проблемы будут продолжаться, можете попробовать переделать ваш приёмный поток следующим образом: пусть он принимаетбайты по одному, конвертирует их в чар-символы и выводит в консоль. По крайней мере вы будете видеть всепришедшие байты, правильные или нет. Эдакий лог прямо в окне консоли.Но вообще для таких дел пишут логгеры.
1
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
24.11.2014, 18:35
...запустить стандартный гипертерминал и поиграться через него с устройством, снять дамп - дело двух минут.
0
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
24.11.2014, 18:59  [ТС]
Спасибо всем за отзывчивость
raxp, Поигрался сегодня программкой Advanced Serial Port Monitor, тоже слал через нее запросы - нифига. Потом мне наконецто отписали разработчики из LOADTRONIC, что у них там видите ли в TransportProtocol чуток неправильно формируеться строка запроса потому что FrameType должен кодироваться одним шестнадцатиричным символом "The Type must be E (1 byte hex E = decimal 14)". А у меня их клас тупо там где Е должна быть пихал 14. Исправил. Теперь через этот Advanced Serial Port Monitor посылаю запрос (вот как он выглядит {{++!!0000E000051;;10B4A2!!--}}) и вуаля, прилетает ответ:

ответ {{++!!0001E000181;2371;110;1; 2371; 23718CEC!!--}}

Но вот в мою тестовую консольную программу так ничего и не прилетает

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
class Program
    {
        static SerialPort myCOM;
 
        static int packetNumber;
 
        static void Main(string[] args)
        {
            Thread t;
            myCOM = new SerialPort("COM2", 38400);
            myCOM.Open();
            if(myCOM.IsOpen)
            {
                Console.WriteLine("Opened");
                t = new Thread(() => ReadData());
                t.Start();
            }
            Console.Read();
        }
 
        static string ReadData()
        {
            string buff = "";            
            Thread.Sleep(500);
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if (buff.Length>12 && buff.Substring(0, TransportFrame.StartTag.Length) == TransportFrame.StartTag && buff.Substring(buff.Length - TransportFrame.EndTag.Length, TransportFrame.EndTag.Length) == TransportFrame.EndTag)
                    {
                        Console.WriteLine(buff);
                        break;
                    }
                }
            }
            byte[] datar = new byte[256];
            TransportFrame tc = TransportFrame.Create(packetNumber, ETransportFrameType.LoadtronicProtocols, "1;;10");
            packetNumber++;
            myCOM.Write(tc.CompleteMessage);
            //Thread.Sleep(500);
            while (true)
            {
                string temp = myCOM.ReadExisting();
 
                if (!String.IsNullOrEmpty(temp))
                {
                    buff += temp;
                    if (buff.Substring(0, TransportFrame.StartTag.Length) == TransportFrame.StartTag && buff.Substring(buff.Length - TransportFrame.EndTag.Length, TransportFrame.EndTag.Length) == TransportFrame.EndTag)
                    {
                        Console.WriteLine(buff);
                        return buff;
                    }
                }
Exerion, я приблизительно понял о чем вы говорите, но в коде слабо представляю как это реализовать, особенно ту часть которая с потоками, не шарю как в одном потоке посылать запрос а в другом ловить ответ.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.11.2014, 20:49
Franky, вот накидал для вас простую консольку, скопируйте ее и попробуйте. Алгоритм такой: программа с интервалом в 1сек. посылает запрос и ждет ответа. И так 10 раз. Если есть ответ - читает его, переводит в строку и выводит на консоль.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
 
namespace SPMonitor_Project {
    class Program {
        static SerialPort port;
        static void Main(string[] args) {
            //string s = "++!!0001E000181;2371;110;1; 2371; 23718CEC!!--";
            //byte[] answer = Encoding.ASCII.GetBytes(s);
            Task.Factory.StartNew(() => { SendPacketsInPort("++!!0000E000051;;10B4A2!!--"); });
            Console.ReadLine();
        }
        static void SendPacketsInPort(string data) {
            byte[] byteDataToPort = Encoding.ASCII.GetBytes(data);
            using (port = new SerialPort("COM1") { BaudRate = 9600 }) {
                port.Open();
 
                for (int i = 0; i < 10; i++) {
                    port.DiscardInBuffer();
                    port.Write(byteDataToPort, 0, byteDataToPort.Length);
                    if (ReadDataFromPort()) {
                        return;
                    }
                    Thread.Sleep(1000);
                }
                Console.WriteLine("No data presents!");
            }
        }
        static bool ReadDataFromPort() {
            for (int i = 0; i < 10; i++) {
                if (port.BytesToRead == 46) {
                    byte[] dataFromPort = new byte[port.BytesToRead];
                    for (int j = 0; j < 46; j++) {
                        dataFromPort[j] = (byte)port.ReadByte();
                    }
                    string resultString = Encoding.ASCII.GetString(dataFromPort);
                    Console.WriteLine("Result is: {0}", resultString);
                    return true;
                }
                else {
                    Thread.Sleep(500);
                }
            }
            return false;
        }
    }
}
Добавлено через 4 минуты
P.S. Да, не забудьте сконфигурировать порт в методе, я его там так с потолка сконфигурировал. Имя, скорость и так далее.
2
10 / 10 / 5
Регистрация: 20.02.2013
Сообщений: 59
25.11.2014, 10:49  [ТС]
insite2012, Спасибо. А мне вот нужно сначала слушать включилось ли устройство, ждать все тот же Connect message, и после этого надо посылать разные запросы на устройство. Для каждого запроса надо делать отдельный таск?

И я все пытаюсть хотя бы тестовый запрос отослать, и принять что-то. Но чето запрос пишется в порт, а устройство как будто и не слышало что я что-то послал ему. Вот такая тестовая програмулина новая:
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
 static void Main(string[] args)
        {
            SerialPort sp = new SerialPort("COM2");
 
            sp.BaudRate = 38400;
            sp.Parity = Parity.None;
            sp.StopBits = StopBits.One;
            sp.DataBits = 8;
            sp.Handshake = Handshake.None;
            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
 
            sp.Open();
            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadLine();            
            string requestStr = "{{++!!0000E000051;;10B4A2!!--}}";
 
            Console.WriteLine("Send "+requestStr);
            //byte[] byteReq = Encoding.ASCII.GetBytes(requestStr);
            //sp.Write(byteReq,0,byteReq.Length);
            sp.Write(requestStr);
 
            //Thread.Sleep(500);
            //string indata = sp.ReadExisting();
            //Console.Write(indata);
            Console.ReadLine();
            sp.Close();
        }
 
        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("In hendler");
            Console.WriteLine("Data Received: ");
            SerialPort sp = (SerialPort)sender;
            Thread.Sleep(500);
            string indata = sp.ReadExisting();            
            Console.Write(indata);
            Console.WriteLine();
        }
И я непонимаю как еще можна писать в порт. Почему программа которую я юзаю Advanced Serial Port Monitor может послать строку и получить ответ

а я из кода такие елементарные вещи не могу сделать?

И еще в этом примере я использую SerialDataReceivedEventHandler, а какое преимущество вообще использовать таски или потоки перед использованием прослушки ивентов? СОМ-порты они ведь вроде-как не потокобезопасны? разтолкуйте молодому
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.11.2014, 10:59
Franky, вы через монитор порта отсылаете запрос и вам приходит ответ, так? Попробуйте то, что я вам написал. Скажете результат.
Цитата Сообщение от Franky Посмотреть сообщение
какое преимущество вообще использовать таски или потоки перед использованием прослушки ивентов?
Скажем так, порты-штука довольно тормозная. Допустим, нам необходимо принять 20 байт. Но событие приема порта возникнет по приходу первого же байта. Да, есть свойство, где этот момент можно регулировать, но блоки приема по размеру могут быть всегда разными. И каждый раз возиться с этим свойством. Именно поэтому я пишу именно по такому шаблону, как показано выше в моем проекте - цикл с задержкой и проверка количества байт в приемном буфере порта. Как только количество равно ожидаемому размеру блока - выход из цикла и чтение. Или выход по таймауту.
Цитата Сообщение от Franky Посмотреть сообщение
СОМ-порты они ведь вроде-как не потокобезопасны?
Это тут вообще не при чем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.11.2014, 10:59
Помогаю со студенческими работами здесь

Почему ответ на GET запрос из Python отличается от ответа на GET запрос из HTTP Analyzer
Добрый день. Делаю GET запрос из HTTP Analyzer Указываю только адрес запроса: https://www.nn.ru/community/sp/food/ Получаю ответ -...

Ответ на запрос
Доброго времени суток ) Такой вопрос... Кто знает как при отправке сайту get или post запросв получить ответ в виде xml файла с нужной...

Ответ на запрос
У меня есть переменная которая принимает данные: $data = $_POST; Мне нужно после того как я принял данные отправить ответ. Ответ...

Ответ на AJAX запрос
Всем привет. Не могу разобраться, я либо понял как работать с ajax либо нет) Вот такой код на JS: $(document).ready(function() { ...

Кракозябры в ответ на запрос в Vk
делаю запрос к вк, в ответ получаю кракозябры, как это исправить? кодировка вк windows-1251 import httplib conn =...


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

Или воспользуйтесь поиском по форуму:
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