Showing posts with label serial. Show all posts
Showing posts with label serial. Show all posts

Thursday 16 April 2015

VB.NET :: CARA MENGAKSES PORT PARALEL DAN SERIAL MENGGUNAKAN VISUAL BASIC.NET



       Karena Microsoft .NET Framework kelas tidak ada untuk mengakses sumber daya komunikasi yang tersambung ke komputer Anda, Anda dapat menggunakan kontrol MSComm di Microsoft Visual Basic 6.0. Kontrol MSComm menyediakan komunikasi serial untuk aplikasi Anda dengan mengaktifkan transmisi dan penerimaan data melalui serial port. Untuk menerapkan dasar komunikasi serial menggunakan modem, ikuti langkah-langkah berikut:
1.Mulai Microsoft Visual Studio .NET.
2.Pada File menu, arahkan ke baru, dan kemudian klik Project.
3.Pada Jenis proyek, klik Proyek Visual Basic.
4.Pada pola dasar, klik Aplikasi konsol.
5.Di kotak nama , ketik MyConsoleApplication, dan kemudian klik OK.

Secara default, Module1.vb dibuat.
6.Klik kanan MyConsoleApplication proyek, dan kemudian klik Menambahkan referensi.
7.Klik COM tab, klik Microsoft Comm kontrol 6.0 Komponennama, klik pilih, dan kemudian klik OK.

Catatan Untuk menggunakan kontrol MSComm , Anda harus menginstal komponen COM terkait Microsoft Visual Basic 6.0 pada komputer yang sama yang memiliki Microsoft Visual Studio .NET diinstal.

Untuk informasi selengkapnya tentang lisensi masalah ketika Anda menggunakan kontrol Visual Basic 6.0 di Visual Studio .NET, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
318597 Galat saat Anda menggunakan kontrol Visual Basic 6.0 di Visual Studio .NET
8.Ganti kode di Module1.vb dengan contoh kode berikut.

  1. Imports MSCommLib

    Module Module1

    Sub Main()
    'New a MSComm control
    Dim MSComm1 As MSComm
    MSComm1 = New MSComm
    ' Buffer to hold input string.
    Dim Buffer As String
    ' Use the COM1 serial port.
    MSComm1.CommPort = 1
    ' 9600 baud, no parity, 8 data, and 1 stop bit.
    MSComm1.Settings = "9600,N,8,1"
    ' Tell the control to read the whole buffer when Input is used.
    MSComm1.InputLen = 0
    ' Open the serial port.
    MSComm1.PortOpen = True
    Console.WriteLine("Open the serial port.")
    ' Tell the control to make the Input property return text data.
    MSComm1.InputMode() = InputModeConstants.comInputModeText
    'Clear the receive buffer.
    MSComm1.InBufferCount() = 0
    ' Send the attention command to the modem.
    MSComm1.Output = "ATV1Q0" & Chr(13)
    Console.WriteLine("Send the attention command to the modem.")
    Console.WriteLine("Wait for the data to come back to the serial port...")
    ' Make sure that the modem responds with "OK".
    ' Wait for the data to come back to the serial port.
    Do
    Buffer = Buffer & MSComm1.Input
    Loop Until InStr(Buffer, "OK" & vbCrLf)
    ' Read the "OK" response data in the serial port.
    ' Close the serial port.
    Console.WriteLine("Read the OK response data in the serial port.")
    MSComm1.PortOpen = False
    Console.WriteLine("Close the serial port.")
    End Sub

    End Module
  2. 9.Tekan CRTL + F5 untuk membuat dan menjalankan proyek ini. Anda akan menerima pesan output berikut ini:

    Buka serial port.
    Mengirim perintah perhatian ke modem.
    Menunggu untuk data untuk kembali ke serial port...
    Membaca data OK respons di serial port.
    Tutup serial port.

Menggunakan kontrol MSComm dalam Visual Basic .NET untuk mengakses Porta serial


Untuk melakukannya, ikuti langkah-langkah berikut:
1.Mulai Microsoft Visual Studio .NET.
2.Pada File menu, arahkan ke baru, dan kemudian klik Project.
3.Pada Jenis proyek, klik Proyek Visual Basic.
4.Pada pola dasar, klik Aplikasi konsol.
5.Di kotak teks nama , ketik MyConsoleApplication, dan kemudian klik OK.

Secara default, Module1.vb dibuat.
6.Menambahkan kode berikut ke Module1.vb sebelum pernyataan Module1 modul :

  1. Option Strict On

    ' Define a CommException class that inherits from the ApplicationException class,
    ' and then throw an object of type CommException when you receive an error message.
    Class CommException
    Inherits ApplicationException
    Sub New(ByVal Reason As String)
    MyBase.New(Reason)
    End Sub
    End Class
7.Menyatakan struktur, konstanta dan referensi eksternal fungsi yang ada di Kernel32.dll

Untuk memanggil unmanaged fungsi dari Visual Basic .NET aplikasi Anda berhasil, Anda harus menyatakan referensi struktur yang Anda lulus sebagai parameter ke fungsi tidak dikelola, dan Anda harus menyatakan konstanta yang Anda lulus sebagai parameter ke fungsi unmanaged. Untuk melakukannya, tambahkan kode berikut untuk Module1.vb setelah pernyataan Module1 modul :

'Declare structures.
Public Structure DCB
Public DCBlength As Int32
Public BaudRate As Int32
Public fBitFields As Int32 'See Comments in Win32API.Txt
Public wReserved As Int16
Public XonLim As Int16
Public XoffLim As Int16
Public ByteSize As Byte
Public Parity As Byte
Public StopBits As Byte
Public XonChar As Byte
Public XoffChar As Byte
Public ErrorChar As Byte
Public EofChar As Byte
Public EvtChar As Byte
Public wReserved1 As Int16 'Reserved; Do Not Use
End Structure

Public Structure COMMTIMEOUTS
Public ReadIntervalTimeout As Int32
Public ReadTotalTimeoutMultiplier As Int32
Public ReadTotalTimeoutConstant As Int32
Public WriteTotalTimeoutMultiplier As Int32
Public WriteTotalTimeoutConstant As Int32
End Structure

'Declare constants.
Public Const GENERIC_READ As Int32 = &H80000000
Public Const GENERIC_WRITE As Int32 = &H40000000
Public Const OPEN_EXISTING As Int32 = 3
Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
Public Const NOPARITY As Int32 = 0
Public Const ONESTOPBIT As Int32 = 0

'Declare references to external functions.
Public Declare Auto Function CreateFile Lib "kernel32.dll" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
ByVal hTemplateFile As IntPtr) As IntPtr

Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean

8.Sebelum Anda dapat mengakses port serial atau paralel port, Anda harus mendapatkan pegangan untuk pelabuhan yang tepat dan kemudian mengkonfigurasi port komunikasi. Untuk melakukannya, tambahkan kode inisialisasi berikut untuk Module1.vb Setelah pernyataan Sub utama .
Catatan Untuk membangun komunikasi dengan pelabuhanx LPT, Anda harus menghentikan layanan Print Spooler. Untuk melakukannya, gunakan Layanan alat dalam alat administratif.

' Declare the local variables that you will use in the code.
Dim hSerialPort, hParallelPort As IntPtr
Dim Success As Boolean
Dim MyDCB As DCB
Dim MyCommTimeouts As COMMTIMEOUTS
Dim BytesWritten, BytesRead As Int32
Dim Buffer() As Byte

' Declare the variables to use for encoding.
Dim oEncoder As New System.Text.ASCIIEncoding
Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)

' Convert String to Byte().
Buffer = oEnc.GetBytes("Test")
Try
' Access the serial port.
Console.WriteLine("Accessing the COM1 serial port")
' Obtain a handle to the COM1 serial port.
hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
' Verify that the obtained handle is valid.
If hSerialPort.ToInt32 = -1 Then
Throw New CommException("Unable to obtain a handle to the COM1 port")
End If
' Retrieve the current control settings.
Success = GetCommState(hSerialPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to retrieve the current control settings")
End If
' Modify the properties of the retrieved DCB structure as appropriate.
' WARNING: Make sure to modify the properties according to their supported values.
MyDCB.BaudRate = 9600
MyDCB.ByteSize = 8
MyDCB.Parity = NOPARITY
MyDCB.StopBits = ONESTOPBIT
' Reconfigure COM1 based on the properties of the modified DCB structure.
Success = SetCommState(hSerialPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to reconfigure COM1")
End If
' Retrieve the current time-out settings.
Success = GetCommTimeouts(hSerialPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to retrieve current time-out settings")
End If
' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate.
' WARNING: Make sure to modify the properties according to their supported values.
MyCommTimeouts.ReadIntervalTimeout = 0
MyCommTimeouts.ReadTotalTimeoutConstant = 0
MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
MyCommTimeouts.WriteTotalTimeoutConstant = 0
MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to reconfigure the time-out settings")
End If
' Write data to COM1.
Console.WriteLine("Writing the following data to COM1: Test")
Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
If Success = False Then
Throw New CommException("Unable to write to COM1")
End If
' Read data from COM1.
Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero)
If Success = False Then
Throw New CommException("Unable to read from COM1")
End If
Catch ex As Exception
Console.WriteLine(Ex.Message)
Finally
' Release the handle to COM1.
Success = CloseHandle(hSerialPort)
If Success = False Then
Console.WriteLine("Unable to release handle to COM1")
End If
End Try

Try
' Parallel port.
Console.WriteLine("Accessing the LPT1 parallel port")
' Obtain a handle to the LPT1 parallel port.
hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
' Verify that the obtained handle is valid.
If hParallelPort.ToInt32 = -1 Then
Throw New CommException("Unable to obtain a handle to the LPT1 port")
End If
' Retrieve the current control settings.
Success = GetCommState(hParallelPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to retrieve the current control settings")
End If
' Modify the properties of the retrieved DCB structure as appropriate.
' WARNING: Make sure to modify the properties according to their supported values.
MyDCB.BaudRate = 9600
MyDCB.ByteSize = 8
MyDCB.Parity = NOPARITY
MyDCB.StopBits = ONESTOPBIT
' Reconfigure LPT1 based on the properties of the modified DCB structure.
Success = SetCommState(hParallelPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to reconfigure LPT1")
End If
' Retrieve the current time-out settings.
Success = GetCommTimeouts(hParallelPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to retrieve current time-out settings")
End If
' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate.
' WARNING: Make sure to modify the properties according to their supported values.
MyCommTimeouts.ReadIntervalTimeout = 0
MyCommTimeouts.ReadTotalTimeoutConstant = 0
MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
MyCommTimeouts.WriteTotalTimeoutConstant = 0
MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
Success = SetCommTimeouts(hParallelPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to reconfigure the time-out settings")
End If
' Write data to LPT1.
' Note: You cannot read data from a parallel port by calling the ReadFile function.
Console.WriteLine("Writing the following data to LPT1: Test")
Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
If Success = False Then
Throw New CommException("Unable to write to LPT1")
End If
Catch ex As Exception
Console.WriteLine(Ex.Message)
Finally
' Release the handle to LPT1.
Success = CloseHandle(hParallelPort)
If Success = False Then
Console.WriteLine("Unable to release handle to LPT1")
End If
End Try

Console.WriteLine("Press ENTER to quit")
Console.ReadLine()
9.Membangun menu, klik Membangun solusi.
10.Pada Debug menu, klik mulai menjalankan aplikasi.

Anda mungkin menerima teks berikut di konsol:
Mengakses COM1 Porta serial
Menulis data berikut untuk COM1: uji

Membaca data berikut dari COM1: Serial Data
Mengakses port paralel LPT1

Menulis data berikut untuk LPT1: uji

Tekan ENTER untuk keluar dari
CatatanSerial Data mewakili data yang Anda membaca dari porta serial. 
10.Untuk menutup aplikasi, tekan tombol ENTER di konsol.



    Sumber: http://support.microsoft.com/kb/823179/id-id

    VB.NET :: Komunikasi Serial Com Port dengan VB.Net (PENERIMA)


    Berikut ini adalah komponen-komponen yang digunakan :
    1. ComboBox (2 buah)
    2. Button (2 buah)
    3. Label (3 buah)
    4. TextBox (1 buah)
    5. SerialPort (1 buah)
    Buat tampilan program menjadi seperti gambar dibawah ini.
    terima serial
    Berikut ini adalah program lengkapnya.
    Public Class Form1
        Dim myPort As Array
        Delegate Sub SetTextCallback(ByVal As String)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            myPort = IO.Ports.SerialPort.GetPortNames()
            ComboBox2.Items.Add(9600)
            ComboBox2.Items.Add(19200)
            ComboBox2.Items.Add(38400)
            ComboBox2.Items.Add(57600)
            ComboBox2.Items.Add(115200)
            For i = 0 To UBound(myPort)
                ComboBox1.Items.Add(myPort(i))
            Next
            ComboBox1.Text = ComboBox1.Items.Item(0)
            ComboBox2.Text = ComboBox2.Items.Item(0)
            Button1.Enabled = True
            Button2.Enabled = False
        End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            SerialPort1.PortName = ComboBox1.Text
            SerialPort1.BaudRate = ComboBox2.Text
            SerialPort1.Open()
            Button1.Enabled = False
            Button2.Enabled = True
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            SerialPort1.Close()
            Button1.Enabled = True
            Button2.Enabled = False
        End Sub
    Private Sub ReceivedText(ByVal As String)        ‘compares the ID of the creating Thread to the ID of the calling Thread
            If Me.TextBox1.InvokeRequired Then
                Dim x As New SetTextCallback(AddressOf ReceivedText)
                Me.Invoke(x, New Object() {(text)})
            Else
                ‘Me.TextBox2.Text = ” “
                Me.TextBox1.Text =
              End If    End Sub
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            ‘Automatically called every time a data is received at the serialPort
            ReceivedText(SerialPort1.ReadExisting())
        End Sub
    End Class
    Untuk menguji program, kita dapat menggunakan Program Pengirim yang sudah dibahas pada artikel sebelumnya atau bisa juga menggunakan Virtual Terminal.

    VB.NET :: Komunikasi Serial Com Port dengan VB.Net (MENGIRIM)



    Komunikasi serial merupakan salah satu metode untuk mengirimkan data dari suatu perangkat ke perangkat yang lain. Komunikasi serial banyak digunakan dalam berbagai aplikasi karena kemudahannya dalam dukungan terhadap sistem.
    Dalam posting kali ini, saya akan menyampaikan cara pembuatan program pengiriman data serial menggunakan Microsoft Visual basic 2010. Tanpa banyak basa basi lagi, berikut ini adalah tahap-tahap pembuatan program pengirim data serial.
    Komponen-komponen yang diperlukan adalah:
    1. ComboBox (2 buah)
    2. Label (3 buah)
    3. Button (3 buah)
    4. TextBox (1 buah)
    5. SerialPort (1 buah)
    Buatlah tampilan program seperti pada gambar dibawah ini.
    kirim serial
    Berikut adalah List Program-nya.
    Public Class Form1
        Dim myPort As Array  ‘COM Port yang terdeteksi pada sistem akan disimpan disini
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ‘Cek semua com port yang memungkinkan
     myPort = IO.Ports.SerialPort.GetPortNames()    
            ‘Nilai Baud Rate yang bisa digunakan
      ComboBox2.Items.Add(9600)                      
            ComboBox2.Items.Add(19200)
            ComboBox2.Items.Add(38400)
            ComboBox2.Items.Add(57600)
            ComboBox2.Items.Add(115200)
            For i = 0 To UBound(myPort)
                ComboBox1.Items.Add(myPort(i))
            Next
     ‘Atur Com Port pada Port yang pertama terdeteksi
     ComboBox1.Text = ComboBox1.Items.Item(0)   
     ‘Atur Baud Rate pada Baud yang pertama terdeteksi
     ComboBox2.Text = ComboBox2.Items.Item(0)
            Button1.Enabled = True                      ‘Inisialisasi tombol
            Button2.Enabled = False
            Button3.Enabled = False
        End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            SerialPort1.PortName = ComboBox1.Text
            SerialPort1.BaudRate = ComboBox2.Text
            SerialPort1.Open()
            Button1.Enabled = False
            Button2.Enabled = True
            Button3.Enabled = True
        End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            SerialPort1.Close()
            Button1.Enabled = True
            Button2.Enabled = False
            Button3.Enabled = False
        End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            SerialPort1.Write(TextBox1.Text)
        End Sub
    End Class
    Berikut ini adalah hasil running dari program dan hasil pengiriman.
    hasil kirimHasil running.
    hasil tampilanHasil pengiriman.

    SERIAL :: istilah dalam komunikasi serial


    Berikut ini beberapa istilah dalam komunikasi serial, yaitu :
    1      Synchronous (sinkron) adalah kondisi pengiriman data serial yang disertai dengan pengiriman detak (clock).
    2      Asynchronous (asinkron) adalah kondisi dengan detak tidak dikirim bersamaan dengan data serial sehingga masing-masing perangkat keras yang berkomunikasi harus menciptakan detaknya sendiri.
    3      Baud rate merupakan istilah yang digunakan untuk kecepatan aliran data. Satuan baud rate adalah bps (bit per second). Contohnya, 9600 bps atau 19200 bps.
    4      Full duplex adalah jenis komunikasi serial yang menyatakan hubungan antara dua perangkat keras, A dan B. Jika A sedang melakukan pengiriman data, pada saat yang sama, A dapat menerima data dari B, dan sebaliknya. Kondisi ini dinamakan full duplex atau komunikasi dua arah. Contohnya, telepon.
    5      Half duplex merupakan kondisi ketika proses pengiriman dan penerimaan data tidak dapat dilakukan secara bersamaan seperti pada full duplex namun dilakukan secara bergantian. Contohnya, pesawat intercom dan walkie talkie.
    Jenis komunikasi serial diantaranya UART (Universal Asynchronous Receiver/Transmitter), SPI, dan I2C (Inter Integrated Circuit). Pada komunikasi serial asinkron jenis full duplex digunakan tiga jalur yaitu, jalur Tx (transmit / pengiriman), jalur Rx(receive / penrimaan), dan jalur ground. Umumnya jumlah data yang dikirim adalah satu bit start, delapan bit data, dan satu bit stop sehingga dalam satu frame data terdapat sepuluh bit (format 1-8-1).
    komunikasi serial
    komunikasi serial
    Komunikasi serial pada mikrokontroler AT89S51 bergantung pada kondisi pin Rx dan Tx. Data yang akan dikirim dan diterima harus diletakkan atau ditampung pada register SBUF (serial buffer). SBUF pada mikrokontroler  dipisahkan antara pengiriman data dan penerimaan data tetapi dalam pemrogramannya hanya ada satu yaitu SBUF saja. Tugas compiler untuk memahami SBUF yang dimaksud oleh program dan menterjemahkannya ke dalam kode mesin untuk masing-masing SBUF.
    Register SBUF
    Register SBUF
    Register lain yang berkaitan dengan komunikasi serial adalah SCON (Serial Port Control Register) dan PCON (Power Control Register). Bit kedua dan bit ketiga SCON hanya digunakan untuk komunikasi serial dengan data sembilan bit sedangkan bit-bit yang lain digunakan di hampir setiap mode komunikasi serial.
    Register SCON
    Register SCON
    Isi register SCON
    Isi register SCON
    Register PCON digunakan untuk pengaturan baud rate atau kecepatan transmisi serial yaitu melalui bit yang bernama SMOD. Register PCON terdiri atas delapan bit seperti diilustrasikan berikut.
    Register PCON
    Register PCON
    Saat pertama kali mikrokontroler dihidupkan atau dalam kondisi reset, semua nilai bit pada PCON adalah 0 (nol). Dari lima bit yang ada pada register PCON, mikrokontroler MCS-51 hanya menggunakan tiga bit saja yaitu SMOD, PD, dan IDL. Dari tiga bit tersebut, yang berhubungan dengan komunikasi serial adalah SMOD. GF1 dan GF0 digunakan untuk fungsi umum atau general purpose register.
    Isi register PCON
    Isi register PCON
    Port serial AT89S51 dapat digunakan untuk empat mode sesuai pengaturan bit SM0 dan SM1 seperti pada gambar dibwah ini. Mode yang umum dipakai adalah UART 8 bit (mode 1) sedangkan aplikasi yang rentan terhadap gangguan menggunakan mode 2 dan mode 3.
    Mode kerja port serial
    Mode kerja port serial
    Berikut penjelasan masing-masing mode, yaitu :
    1      Mode 0
    Mode 0 merupakan mode sinkron dengan detak juga ikut dikirimkan bersamaan dengan data serial. Detak dikirim melalui TxD (dengan kecepatan fosc/12). Sedangkan, pin RxD digunakan untuk mengirim dan menerima data. Sifat mode 1 adalah half duplex. Jika CPU difungsikan untuk menerima data, maka RI dikosongkan terlebih dahulu (RI=0) dan REN=1.
    2      Mode 1
    Mode 1 merupakan mode asinkron full duplex. Format data yang digunakan adalah 1 bit start, 8 bit data, dan 1 bit stop dengan protokol RS-232 tetapi dengan level tegangan TTL. Sepuluh bit paket data tersebut dikirim melalui pin TxD dan dapat diterima melalui pin RxD.
    3      Mode 2
    Mode 2 adalah mode asinkron full duplex dengan sebelas bit paket data yaitu, 1 bitstart, 8 bit data, 1 bit RB8 (atau TB8) dan 1 bit stop. RB8 digunakan untuk menerima bit data ke-9 sedangkan TB8 digunakan untuk menampung bit data ke-9 yang akan dikirimkan. Bit data ke-9 sering disebut juga sebagai Parity (P). mode 2 mendukung pemanfaatan multiprosesor. Baud rate dapat dipilih antara fosc/32 ataufosc/64 tergantung pada pilihan SMOD di register PCON. Jika SMOD=0 maka baud rate adalah fosc/64 dan jika SMOD=1 maka baud rate adalah fosc/32.
    4      Mode 3
    Mode 3 sama dengan mode 2. Perbedaannya hanyalah terletak pada baud rate.Baud rate pada mode ini daopat diatur melalui timer 1.
    Mode 1 dan mode 3 sering digunakan untuk komunikasi RS-232 dengan format berikut :
    • Mode 1 : 1 + 8 + 1
    • Mode 3 : 1 + 8 + P + 1
    Pengaturan baud rate pada mikrokontroler AT89S51 disesuaikan dengan mode yang dipilih.
    Hubungan mode dengan baud rate
    Hubungan mode dengan baud rate
    Rumus baud rate untuk setiap mode komunikasi serial, yaitu :
    Rumus mode serial
    Rumus mode serial