purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 4:13 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 385 ]  На страницу Пред.  1 ... 22, 23, 24, 25, 26  След.
Автор Сообщение
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 2:37 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
О, и мой код виснуть перестал под отладчиком... Правда не этот а более поздняя реализация...
Я так понял, что это поддержка для отладчика, ибо без этой опции и отладчика код работал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 2:42 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Поддержка многопоточности нужна для стабильной работы программы, если в ней больше одного потока.
Отладчик на то и нужен чтобы сообщать об ошибках. То что код работал, еще не значит что он стабильно работал.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Чт ноя 10, 2016 4:22 pm 
Не в сети
студент

Зарегистрирован: Чт ноя 10, 2016 12:27 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте, уважаемые специалисты:)
Я не особый программист, поэтому прошу не судить строго, если мои вопросы покажутся глупыми)
Вопрос по скорости передачи данных:
OpenSerialPort(#SerialPort, SerialPortName$, Bauds, Parity, Data, Stop.f, HandshakeMode, InputBufferSize, OutputBufferSize)

В хелпе для bauds максимальное значение указано в 115200
Могу ли я задать большее значение? (конкретно- 460800)

При попытке это сделать ошибок не возникает, но я не знаю, работает ли функция корректно в таком случае.
Пока не могу выложить код, чтобы вы посмотрели, может быть где-то в другом месте ошибка.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Чт ноя 10, 2016 9:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Зависит от того поддерживает порт ли такую скорость. В случае виртуального USB-COM есть вероятность что поддерживает.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пт ноя 11, 2016 8:03 am 
Не в сети
студент

Зарегистрирован: Чт ноя 10, 2016 12:27 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, спасибо. Да, использую USB.
Сконфигурировал уже на 19200, потом попробую снова на 460800 :)
Три вопроса:
1. Почему функция ComOpen (закомментирована в коде) не открывает порт? (настройки такие же, как и OpenSerialPort, библиотека подключена)
2. Процедура приёма InData: прав ли я в том, что винде надо время, чтобы заполнить буфер? Поэтому он оказывается непустым только в случае вставки задержки.
Какая минимальная задержка позволит не потерять информацию?
3. По поводу записи информации из буфера в файл: в моём варианте бесконечно записывается только размер информации в буфере.
Подскажите, пожалуйста, как правильно организовать запись содержимого буфера в текстовый файл. В дальнейшем планируется начинать запись и заканчивать по старт-стоповым символам. Тут я пока понятия не имею, как я их буду отслеживать, т.к. слабо понимаю принцип работы с буфером.
Спасибо заранее.

Код:
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
Global Status.s
Global Mark.s
Declare ComOut ()
Declare InData ()
FileName.i= Date ()
CreateFile(2, "c:\\Temp\"+FileName +".txt")
OpenFile(2, "c:\\Temp\"+FileName +".txt")
 
 
If OpenWindow(0, 300, 100, 450, 380, "Получение данных", #PB_Window_SystemMenu)
  ButtonGadget(1, 175, 290, 100, 35, "Принять данные")
  ;   TextGadget(2, 20, 275, 25, 15, "Порт")
  ;   TextGadget(5,20,300,100,15,"COM5")
  EditorGadget(2, 10, 10, 430, 250, #PB_String_ReadOnly)
  If IsSerialPort(0)
    CloseSerialPort(0) ; Если порт открыт, то закрываем его.
  EndIf
  If OpenSerialPort(0, "COM5", 19200, #PB_SerialPort_NoParity, 8, 1.5, #PB_SerialPort_NoHandshake, 1024, 1024)
    ;   MyCom.s = "COM5: baud=19200 parity=N data=8 stop=1.5"
    ;   HCom.l
    ;   HCom= ComOpen(MyCom, #HandShakeModeNone, 1024, 1024)
    ;     If HCom
   
    Status.s="Порт открыт успешно"
    ComOut ()
    InData ()
   
  Else
    Status.s="Не удалось открыть порт"
    SetGadgetText (2, "* * * ОШИБКА * * *  "+Status)
  EndIf
  TextGadget(3, 50, 345, 350, 20, Status, #PB_Text_Center)
 
  If IsSerialPort(0)
    CloseSerialPort(0) ; Если порт открыт, то закрываем его.
  EndIf
 
  Repeat
    A=WaitWindowEvent()
    If A=#PB_Event_CloseWindow
      Z=1
    EndIf
  Until Z=1
EndIf
 
Procedure ComOut()             ; Передача данных в порт.    
                               ;   Protected Out.s=Str(1)  
  If IsSerialPort(0)      ;если порт открыт    
    WriteSerialPortString(0, "1") ;по этому сигналу начинается непрерывная передача данных
    Debug(AvailableSerialPortInput(0))
  Else    
    ; Выводим сообщение об ошибке.    
    MessageRequester("Ошибка","Текущий порт не доступен!")    
  EndIf    
EndProcedure
 
 
Procedure InData() ; Прием данных.      
   If IsSerialPort(0)   ; С таким ИД порт открыт.      
    Delay (1000) ;без задержки буфер пустой
    InBytes = AvailableSerialPortInput(0)
    Debug (InBytes)
;     SetGadgetText (2, "Количество данных для передачи: "+InBytes)
    If InBytes>0 ; Получены данные.      
      Protected Dim InBuffer.s(InBytes) ;, RealInBytes
      RealInBytes = ReadSerialPortData(0, @InBuffer(), InBytes)
      If RealInBytes>0
        Repeat
          WriteStringN (2, ""+RealInBytes)
        Until Mark="*"
        CloseFile(2)
      Else
        SetGadgetText (2, "Нет данных для передачи.")
      EndIf
    EndIf
  EndIf      
EndProcedure  
 
 
End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пт ноя 11, 2016 1:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Goshiq писал(а):
Почему функция ComOpen (закомментирована в коде) не открывает порт?
Надеюсь что при этом функция OpenSerialPort закомментирована? Потому что порт можно открыть только раз и пока его не закрыть, повторно не получится открыть.

Goshiq писал(а):
Процедура приёма InData: прав ли я в том, что винде надо время, чтобы заполнить буфер?
При скорости 19200 передача байта занимает примерно 500 микросекунд. Нужно время на отправку и прием данных.

Goshiq писал(а):
Какая минимальная задержка позволит не потерять информацию?
Зависит от многих факторов. В первую очередь это скорость обмена и время задержка ответа устройством подключенным к порту и объем данных. Чем выше скорость, меньше задержка и объем информации, тем быстрее будут получены все данные.

Goshiq писал(а):
как правильно организовать запись содержимого буфера в текстовый файл
Например заменив строку
Код:
1
WriteStringN (2, ""+RealInBytes)

на
Код:
1
WriteData(2, @InBuffer(), InBytes)

Только нужно убрать цикл где проверяется Mark="*".

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пт ноя 11, 2016 2:52 pm 
Не в сети
студент

Зарегистрирован: Чт ноя 10, 2016 12:27 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо, Пётр! Попробую на работе и отпишусь о результатах.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 1:04 pm 
Не в сети
доцент

Зарегистрирован: Пт апр 24, 2020 12:48 am
Сообщений: 32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день.
Как получить список компортов находяшихся в системе?
Перед тем как выбрать порт для работы, надо опросить систему и получить список.
На Qt было просто
Код:
1
2
3
4
5
6
7
8
9
10
11
12
 
//**************** Определение сколько ком.портов есть *******************
   QStringList ports;
    const auto serialPortInfos = QSerialPortInfo::availablePorts();
    int i = 0;
    for (const QSerialPortInfo &serialPortInfo : serialPortInfos)
    {
        ports.insert(i,serialPortInfo.portName());
        i++;
    }
    ui->Port_comboBox->insertItems(0,ports);
 



Поделитесь процедурой/модулем если у кого есть.

Спасибо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 1:43 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 201
Откуда: Україна
Благодарил (а): 13 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Цитата:
Как получить список компортов находяшихся в системе?

1:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
While i < 255
  i+1
  Com$  = "COM" + Str(i)
  hPort = CreateFile_(Com$, #GENERIC_READ|#GENERIC_WRITE, 0, 0, #OPEN_EXISTING, 0, 0)
  If hPort <> #INVALID_HANDLE_VALUE
    CloseHandle_(hPort)
    Debug Com$+"  exists & ready for use"
  Else
    dwError = GetLastError_()
    If dwError = #ERROR_ACCESS_DENIED
      Debug Com$ + " exisits & is currently in use"
    EndIf
  EndIf
Wend



2:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#MAX=300
Define Port.s, Prefix.s
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Prefix = "COM"
CompilerElse
  Prefix = "/dev/ttyS"
CompilerEndIf
 
OpenWindow  (0,100,100,300,300, "list com ports")
EditorGadget(0,10,10,250,280)
For i=0 To #MAX
  Port= Prefix + Str(i)
  If OpenSerialPort(0, Port, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
    AddGadgetItem(0, -1, Port)
    CloseSerialPort(0)
  EndIf
Next
 
Repeat
  Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow



3:
Код:
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
Procedure UpdatePortList(Gadget)
  Define Port.s, Prefix.s
  #MAX=300
 
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Prefix = "COM"
  CompilerElse
    Prefix = "/dev/ttyS"
  CompilerEndIf
 
  ClearGadgetItems(Gadget)
 
  For i=0 To #MAX
    Port= Prefix + Str(i)
    If OpenSerialPort(0, Port, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
      AddGadgetItem(Gadget, -1, Port)
      CloseSerialPort(0)
    EndIf
  Next
EndProcedure
 
Global Combo_0
 
OpenWindow  (0,100,100,300,300, "list com ports")
Combo_0 = ComboBoxGadget(#PB_Any, 10, 10, 100, 25)
UpdatePortList(Combo_0)
 
Repeat
  Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 7:04 pm 
Не в сети
доцент

Зарегистрирован: Пт апр 24, 2020 12:48 am
Сообщений: 32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо большое!
Т.е. принцип в том - пробовать открывать порты, те которые откроются значит присутствуют в системе.
Но что делать если какие либо порты открыты программами?
Попробовал 3-й вариант с открытым Терминалом на Com1 , и все, в списке уже Com1 отсутствует :(
Первый вариант видит Com1 но не видит виртуальных портов:(
Есть другой способ?

Спасибо


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 7:08 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
dibor писал(а):
Но что делать если какие либо порты открыты программами?
Если порт открыт другой программой, к нему доступ все равно не получить, а значит его отсутствие в списке можно считать допустимым.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 9:15 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 201
Откуда: Україна
Благодарил (а): 13 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
4:
Код:
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
Global NewList AvailableComs.s()
 
Procedure GetAvailableComPorts()                                               ;this procedure scans the registry (on win) or dmesg (on linux) to find the connected com ports
   Protected hKey, lpcbName, lpName.s, a$, lType, i, j, Dmesg, Fgrep, Port.s
 
   CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Windows
         If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, #KEY_QUERY_VALUE, @hKey) = #ERROR_SUCCESS
            lpName = Space(1024)
 
            Repeat
               lpcbName = 1024
               If RegEnumValue_(hKey, i, @lpName, @lpcbName, 0, 0, 0, 0) = #ERROR_SUCCESS
                  a$ = Left(lpName, lpcbName)
                  If a$ = ""
                     Break
                  EndIf
                  lpcbName = 1024
                  lType    = 0
                  If RegQueryValueEx_(hKey, a$, 0, @lType, @lpName, @lpcbName) = #ERROR_SUCCESS
                     AddElement(AvailableComs())
                     AvailableComs() = lpName
                  EndIf
                  i + 1
               Else
                  Break
               EndIf
            ForEver
            RegCloseKey_(hKey)
         EndIf
      CompilerCase #PB_OS_Linux
         Dmesg = RunProgram("/bin/dmesg", "", "", #PB_Program_Open | #PB_Program_Read)
         If Dmesg
            Fgrep = RunProgram("/bin/fgrep", "tty", "", #PB_Program_Open | #PB_Program_Connect | #PB_Program_Read, Dmesg)
            If Fgrep
               While ProgramRunning(Fgrep)
                  a$ = ReadProgramString(Fgrep)
                  i  = FindString(a$, "ttyS", 1)
                  If i > 0
                     j = FindString(a$, " ", i)
                     Port = "/dev/" + Mid(a$, i, j - i)
                     hKey = 1
                     ForEach AvailableComs()
                        If AvailableComs() = Port
                           hKey = 0
                           Break
                        EndIf
                     Next
                     If hKey
                        AddElement(AvailableComs())
                        AvailableComs() = Port
                     EndIf
                  EndIf
               Wend
               CloseProgram(Fgrep)
            EndIf
            CloseProgram(Dmesg)
         EndIf
         
         
      CompilerCase #PB_OS_MacOS
         
         
   CompilerEndSelect
 
EndProcedure
 
GetAvailableComPorts()
 
ForEach AvailableComs()
   Debug AvailableComs()
Next



Test Port:
Код:
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
#SERIAL_PORTCOM_MIN = 1
#SERIAL_PORTCOM_MAX = 256
 
Define.i i, j, iPortCom, iPortBaud
Define.s sPortCom, sPortBaud = "50;75;110;150;300;600;1200;1800;2400;4800;9600;19200;38400;57600;115200;128000;153600;230400;256000;460800;921600"
 
 
For i=#SERIAL_PORTCOM_MIN To #SERIAL_PORTCOM_MAX
  sPortCom = "COM" + Str(i)
  iPortCom = OpenSerialPort(#PB_Any, sPortCom, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 512)
  If iPortCom And IsSerialPort(iPortCom)
    CloseSerialPort(iPortCom)
    ;
    Debug sPortCom + " : PASS"
    ;
    For j=0 To CountString(sPortBaud, ";")
      iPortCom = OpenSerialPort(#PB_Any, sPortCom, Val(StringField(sPortBaud, j + 1, ";")), #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 512)
      If iPortCom And IsSerialPort(iPortCom)
        CloseSerialPort(iPortCom)
        Debug ">>>>>>>>>>>>>>> " + StringField(sPortBaud, j + 1, ";") + " Baud PASS"
      EndIf
    Next j
    ;
  EndIf
Next i



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Сб май 02, 2020 10:29 pm 
Не в сети
доцент

Зарегистрирован: Пт апр 24, 2020 12:48 am
Сообщений: 32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
LinXP писал(а):
4:

Перфект!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Чт май 14, 2020 11:53 pm 
Не в сети
доцент

Зарегистрирован: Пт апр 24, 2020 12:48 am
Сообщений: 32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
      CompilerCase #PB_OS_Linux
         Dmesg = RunProgram("/bin/dmesg", "", "", #PB_Program_Open | #PB_Program_Read)
         If Dmesg
            Fgrep = RunProgram("/bin/fgrep", "tty", "", #PB_Program_Open | #PB_Program_Connect | #PB_Program_Read, Dmesg)
            If Fgrep
               While ProgramRunning(Fgrep)
                  a$ = ReadProgramString(Fgrep)
                  i  = FindString(a$, "ttyS", 1)
                  If i > 0
                     j = FindString(a$, " ", i)
                     Port = "/dev/" + Mid(a$, i, j - i)
                     hKey = 1


Не работает эта часть для Линукса :(
Для /bin/dmesg требуются права рута, как-то не пойму как это сделать на любой станции. :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пт май 15, 2020 1:38 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
dibor писал(а):
Для /bin/dmesg требуются права рута
Для работы с COM портом тоже.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 385 ]  На страницу Пред.  1 ... 22, 23, 24, 25, 26  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB