Код: Выделить всё
buffer = buffer & UserForm.MSComm.Input
If InStr(buffer, "Grbl") Or InStr(buffer, "{0/0}ok" & vbCrLf) Then
PortCom = True 'порт ответил Grbl
Exit Function
End If
на другие кнопки "пауза" , "стоп" и тд.
Пример с использованием события comEvReceive.
Плюс в том , что вы отправили команду GRBL и больше ничего не делаете , ждетекогда произойдет событие comEvReceive , которое означает , что в буфере есть ответ.
Итак приступим.
Добавляем ссылку на "Comm Control" в Tool -> References. Добавляем на форму "MSComm"
Добавляем кнопку и пишем обработку для этой кнопки.
Сами ручками указываете номер порта (пока) , к которому подключен GRBL
Код: Выделить всё
Private Sub CommandButtonConnect_Click()
MSComm.RThreshold = 1 ' Разрешаем события comEvReceive , которые происходят когда в буфере появляется ответ от GRBL
Port_ = 4 ' Номер порта
UserForm.MSComm.CommPort = Port_
UserForm.MSComm.Settings = "115200,N,8,1"
UserForm.MSComm.InputLen = 0
UserForm.MSComm.PortOpen = True
End SubКод: Выделить всё
Dim GRBLAnswerText As String ' Здесь будет ответ от GRBL
Private Sub MSComm_OnComm()
Select Case MSComm.CommEvent
Case comEvReceive ' Событие которое происходит когда в буфере находиться полный ответ GRBL
GRBLAnswerText = MSComm.Input
If InStr(GRBLAnswerText, "Grbl") Then
UserForm.Caption = "Подключили GRBL"
Else
TextOut.Text = TextOut.Text & GRBLAnswerText ' TextOut.Text текстовое поле куда будет выводиться ответ от GRBL
TextOut.SetFocus
GRBLAnswerText = ""
End If
End Select
End Sub
Код: Выделить всё
MSComm.Output = "G0 x19.12 y251.36 z0" & Chr(13)В нем нет проверок от "падения", а только демонстрация подключения.
Как определить номер порта к которому подключен GRBL.
Есть 255 потенциальных портов к которым можно подключится.В цикле от 1 до 255 , передаем функции GetDefaultCommConfig номера портов.
В ответ получаем 0 или 1 .
0 - к порту ничего не подключено
1 - в порт включен какое то устройство.
По завершении цикла вы будете иметь номера портов (пример 1, 4 ,10) ,к которым что то подключено.
По очереди,к каждому порту (1,4,10) пытаемся подключиться и ждем 1-3 сек ответа "Grbl 1.1g ['$' for help]"
Если порт не ответил в течении 1-3 сек , переходим к следующему порту.
У меня , гарантированно (почти всегда) ответ получается через 1,5 сек.
Если у вас не успевает ответить , увеличте время.
Во вложенном выше примере , вы вручную (в коде ) указываете номер порта , но перед подключением
есть проверка функцией GetDefaultCommConfig , на наличие устройства в этом порту.
Вот еще пример , но он сильно захламлен интерфейсом.
Но в нем можно отправлять готовый g code на станок.БЕЗ парсинга вектора. Теперь вы знаете как из Corel Draw или любой другой программы которая поддерживает vba (хоть excel)
подключиться к GRBL и отправлять G CODE.
Для генерации g coda в Corel Draw нужно , перебрать все векторные объекты "cdrCurveShape" , которые состоят из сегментов , а сегменты состоят из узлов и уже в узлах хранятся координаты х и у .
Если вы сделаете парсинг координат в Corel Draw 16 и выше и хранить координаты будете а классе Point (без явной реализации), то этот макрос не будет работать в Corel Draw 13 и ниже. Так как в Corel Draw 13 нет класса Point , что бы все работало нужно явно реализовать класс Point.
Код: Выделить всё
Private x_ As Double
Private y_ As Double
Property Get x() As Double
x = x_
End Property
Property Let x(ByVal Value As Double)
x_ = Value
End Property
Property Get y() As Double
y = y_
End Property
Property Let y(ByVal Value As Double)
y_ = Value
End Property
Так , что без претензий к внешнему виду форм.