0 đánh giá

Lập trình giao tiếp Arduino với PC dùng VB.NET và cổng COM(USB)

Chúng ta thường sử dụng Arduino giao tiếp với máy tính qua Serial Monitor qua Arduino IDE, vậy làm sao ta giao tiếp với Board qua phần mềm riêng biệt như Arduino ?. Bài hướng dẫn này sẽ hướng dẫn bạn điều đó.

Bước 1: Giới thiệu và chuẩn bị

Với Arduino, cổng USB mặc định trên bản thân nó là cổng Serial0. Khi bạn cắm board vào máy tính, Driver cổng sẽ gán cho board 1 cổng COM mặc định bất kỳ. Khi chúng ta dùng lệnh Serial.println('String...'), Board sẽ gửi thông tin lên cổng COM qua chuẩn truyền nối tiếp. Việc của bạn là phải viết chương trình để nhận dữ liệu đó.

Bước 2: Viết chương trình nhận dữ liệu trên VB.NET

Bạn tiến hành tạo New projects mới, kiểu Windows Form, reference lớp System.IO vào.

Imports System.IO

Mọi dữ liệu nhận được đều gọi sự kiện 

Dim WithEvents SerialPort As New IO.Ports.SerialPort

Chương trình

Imports System.IO

Public Class Form1

    Dim WithEvents SerialPort As New IO.Ports.SerialPort
    Dim selPort As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RefreshPorts()
        SPSetup()
    End Sub

    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        If SerialPort.IsOpen Then
            SerialPort.Write(Chr(1) & Chr(90) & Chr(48) & Chr(57) & Chr(48)) txtSendData.Text)
            SerialPort.Write(txtSendData.Text)
        Else
            SPSetup()
            SerialPort.Write(txtSendData.Text)
        End If
    End Sub

    Private Sub ConnectSerial()
        Try
            SerialPort.BaudRate = 9600
            SerialPort.PortName = selPort
            SerialPort.Open()
        Catch
            SerialPort.Close()
        End Try
    End Sub

    Delegate Sub myMethodDelegate(ByVal [text] As String)
    Dim myD1 As New myMethodDelegate(AddressOf myShowStringMethod)

    Sub myShowStringMethod(ByVal myString As String)
        txtSerialText.AppendText(myString)
    End Sub


    Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
        Dim str As String = SerialPort.ReadExisting
        Invoke(myD1, str)
    End Sub

    Private Sub btnRefreshPorts_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefreshPorts.Click
        RefreshPorts()
    End Sub

    Private Sub RefreshPorts()
        txtPort.Items.Clear()
        For Each sp As String In My.Computer.Ports.SerialPortNames
            txtPort.Items.Add(sp)
        Next

        If txtPort.Items.Count > 0 Then
            txtPort.SelectedIndex = 0
            selPort = txtPort.Text
        End If

    End Sub

    Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
        txtSerialText.Text = String.Empty
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

    Public Sub SPSetup()    Serial Port Setup
        On Error Resume Next
        If SerialPort.IsOpen Then
            SerialPort.Close()
        End If
        SerialPort.PortName = selPort   COM3
        SerialPort.BaudRate = 9600
        SerialPort.DataBits = 8
        SerialPort.StopBits = IO.Ports.StopBits.One
        SerialPort.Handshake = IO.Ports.Handshake.None
        SerialPort.Parity = IO.Ports.Parity.None
        ----->  Now change the Encoding to enable 8-bit communications:  <-----
        SerialPort.Encoding = System.Text.Encoding.GetEncoding(1252)
        SerialPort.Open()
    End Sub

    Private Sub txtPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPort.SelectedIndexChanged
        selPort = txtPort.Text
        Me.Text = String.Format(Arduino Serial Communication - {0}, selPort)
        SPSetup()
    End Sub
End Class

 

Bước 3: Viết chương trình cho Arduino

Chương trình Ví dụ trên Arduino sẽ nhận các ký tự gửi xuống và gửi ngược trở lại PC

char incomingByte = 0;
void setup(){
   Serial.begin(9600); 
}

void loop(){
  if (Serial.available() > 0) {
  // read the incoming byte:
  incomingByte = Serial.read();

  // say what you received in ASCII
  //Serial.print(I received: );
  Serial.println(incomingByte);
  }
}

 

Bước 4: Gửi văn bản

Ở ví dụ trên, ta chỉ gửi từng ký tự một, điều ta cần là gửi các đoạn văn bản nhỏ, vậy ta phải làm sao ?

char incomingBytes[80]; // = 0;
int lf = 10;

void setup(){
   Serial.begin(9600); 
}

void loop(){
  if (Serial.available() > 0) {
  
  // read the incoming byte:
  //incomingByte = Serial.read();
  Serial.readBytesUntil(lf, incomingBytes, 80);

  // say what you received in ASCII
  //Serial.print(I received: );
  Serial.println(incomingBytes);
  memset(incomingBytes, 0, sizeof(incomingBytes));
  }
}

 

(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
3,131 lượt xem ^tháng ^ngày, ^năm
Lam Nguyen Van 380 điểm

Please log in or register to Comment this Media.