3.9 KiB
3.9 KiB
title | date | draft | tags | ||||
---|---|---|---|---|---|---|---|
📟 Работа с Serial в Gambas | 2023-03-18T16:31:00+03:00 | false |
|
Задача
Получать и отправлять данные по Serial в Gambas.
Что будет использоваться
- UART устройство, в моём случае Arduino Nano.
- Библиотека
AsyncStream.h
от AlexGyver для асинхронного чтения из Serial. - Arduino IDE для загрузки скетча в МК.
- Среда Gambas, очевидно же.
Код для Arduino
Показываю пример работы библиотеки AsyncStream.h
со страницы на GitHub.
#include "AsyncStream.h"
AsyncStream<100> serial(&Serial, '\n');
void setup() {
Serial.begin(9600);
}
void loop() {
if (serial.available()) {
Serial.println(serial.buf);
}
}
Код получает данные по Serial
и сразу печатает его в обратно.
В своём случает я хочу, чтобы Arduino отправляла PONG,
если ей передать PING.
А также каждые 5 секунд отправляла сообщение в Serial.
#include "AsyncStream.h"
// Объявление AsyncStream
// 50 -- значение задержки чтения
AsyncStream<50> serial(&Serial, '\n');
// таймер для хранения значения millis()
unsigned long timer = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (serial.available()) {
if (strcmp(serial.buf, "ping") == 0) {
Serial.println("PONG");
}
}
if (millis() - timer > 5000) {
Serial.println("Every 5 sec message");
timer = millis();
}
}
Код для Gambas
Подключение к Serial
' Переменная порта
Public SerialDevice As New SerialPort
' Метод подключения к порту
Public Sub SerialDeviceConnect() As Boolean
Dim Port As String = "/dev/ttyUSB0"
' если есть подключение к порту, завершаем функцию
If SerialDevice.Status Then Return False
Print "Connecting to " & Port
SerialDevice.PortName = Port
SerialDevice.Speed = "9600"
SerialDevice.Parity = 0
SerialDevice.DataBits = "8"
SerialDevice.StopBits = "1"
SerialDevice.FlowControl = 0
Try SerialDevice.Open()
If Error Then Print "ERROR: Bad address"
End
' Метод, который вызывает подключение к Serial
Public Sub DeviceConnectButton_Click()
SerialDeviceConnect()
End
Таймер, который вызывает чтение из Serial и печает полученные данные
' Таймер
Public Sub LogTimer_Timer()
If SerialDevice.Status Then
Dim SerialText As String = SerialRead()
If SerialText.Len > 0 Then Print SerialText
Endif
End
Метод, который получает данные из Serial и печатает их
' Метод получения команд из Serial
Public Sub SerialRead() As String
Dim RxLen As Integer ' Длина полученных данных
Dim Rx As String ' Полученная строка
Try Read #SerialDevice, Rx, Lof(SerialDevice)
If Error Then
Return
Else
RxLen = InStr(Rx, Chr(13))
If RxLen > 0 Then
Return Replace$(Rx, "\n", "")
Endif
Endif
End
Метод, который отправляет команду в Serial
' Отправка команд в Serial
Public Sub SerialWrite(Text As String)
Try Write #SerialDevice, Text
If Error Then Print "Ошибка"
End
' Метод, который вызывает подключение к Serial
Public Sub DeviceSendButton_Click()
SerialWrite("ping")
End