Solved

Reading from Serial Port in VB.net

Posted on 2010-09-03
17
7,145 Views
Last Modified: 2013-11-27
I am trying to read Portal Data Collector through Serial Port. I am success to do it but the problem is that when I try to run in debug mod by press F10 it will work but when I try to run EXE than it stop at some place and don't give any error.

Next problem in this it is reading same Line twice. I think there is problem in thread . Because when I try to write in textbox it will give me thread error.

My code for designer and code behind is as follows
 
Kindly help me to rectify my logical error
Imports System.Threading
Imports System.IO.Ports
Imports System.Text

Public Class frmScanPalReading

  Dim ReadBuffer As String = ""
  Dim _continue As Boolean = False

  Private Sub frmScanPalReading_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
    SerialPort.Close()
  End Sub
  Private Sub frmScanPalReading_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
      With SerialPort
        .PortName = "COM1"
        .Handshake = IO.Ports.Handshake.RequestToSend
        .ReceivedBytesThreshold = 1
        .RtsEnable = True
        .BaudRate = 115200
        .DataBits = 8
        .Parity = IO.Ports.Parity.None
        .StopBits = IO.Ports.StopBits.One

        .Open()
      End With
    Catch ex As Exception
      MsgBox(ex.Message)
    End Try
  End Sub

  Private Sub btnExtract_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExtract.Click
    SendCommand("READ")
  End Sub

  Sub SendCommand(ByVal cmd As String)
    SerialPort.Write(cmd + Chr(13))
  End Sub



  Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    'This event will Receive the data from the selected COM port..
    Dim thRec As Thread
    If e.EventType = SerialData.Chars Then
      thRec = New Thread(AddressOf ReceiveData)
      thRec.IsBackground = True
      thRec.Priority = ThreadPriority.Highest
      thRec.Start()
      Thread.Sleep(2)
    End If
  End Sub

  Private Sub ReceiveData()
    'Sub to Receive Data from the Serial Port, Will Run in a Thread
    Dim bRead, nRead As Integer, crPOS As Integer
    Dim returnStr As String = ""
    Dim ascStr As String = ""
    Dim m As String = ""
    Dim i As Int16 = 1

    bRead = SerialPort.BytesToRead 'Number of Bytes to read
    Dim cData(bRead - 1) As Byte

    SerialPort.Encoding = Encoding.GetEncoding(65001)

    nRead = SerialPort.Read(cData, 0, bRead)  'Reading the Data
    If _continue = False Then crPOS = ByteSearch(cData, "13")

    For Each b As Byte In cData
      If b <> 0 Then
        If crPOS >= i AndAlso _continue = False Then
          ascStr += Chr(b)
          i += 1
        Else
          returnStr += Chr(b)
          _continue = True
        End If
      End If
    Next
    Debug.WriteLine(m)
    If returnStr <> "OVER" AndAlso returnStr <> "" Then
      ReadBuffer += returnStr           'ASCII String

      SendCommand("ACK")
    End If
    Console.Write("==Begin=={0}==End==", ReadBuffer.ToString)
  End Sub

  Function ByteSearch(ByVal bData() As Byte, ByVal SearchString As String) As Int16
    Dim i As Int16 = 1
    For Each b As Byte In bData
      If b = SearchString Then
        Exit For
      End If
      i += 1
    Next
    Return i
  End Function
End Class

Open in new window

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmScanPalReading
  Inherits System.Windows.Forms.Form

  'Form overrides dispose to clean up the component list.
  <System.Diagnostics.DebuggerNonUserCode()> _
  Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing AndAlso components IsNot Nothing Then
      components.Dispose()
    End If
    MyBase.Dispose(disposing)
  End Sub

  'Required by the Windows Form Designer
  Private components As System.ComponentModel.IContainer

  'NOTE: The following procedure is required by the Windows Form Designer
  'It can be modified using the Windows Form Designer.  
  'Do not modify it using the code editor.
  <System.Diagnostics.DebuggerStepThrough()> _
  Private Sub InitializeComponent()
    Me.components = New System.ComponentModel.Container
    Me.txData = New System.Windows.Forms.RichTextBox
    Me.btnExtract = New System.Windows.Forms.Button
    Me.SerialPort = New System.IO.Ports.SerialPort(Me.components)
    Me.SuspendLayout()
    '
    'txData
    '
    Me.txData.Location = New System.Drawing.Point(12, 29)
    Me.txData.Name = "txData"
    Me.txData.Size = New System.Drawing.Size(684, 345)
    Me.txData.TabIndex = 0
    Me.txData.Text = ""
    '
    'btnExtract
    '
    Me.btnExtract.Location = New System.Drawing.Point(287, 393)
    Me.btnExtract.Name = "btnExtract"
    Me.btnExtract.Size = New System.Drawing.Size(75, 23)
    Me.btnExtract.TabIndex = 1
    Me.btnExtract.Text = "Extract"
    Me.btnExtract.UseVisualStyleBackColor = True
    '
    'frmScanPalReading
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.ClientSize = New System.Drawing.Size(708, 446)
    Me.Controls.Add(Me.btnExtract)
    Me.Controls.Add(Me.txData)
    Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
    Me.MaximizeBox = False
    Me.MinimizeBox = False
    Me.Name = "frmScanPalReading"
    Me.Text = "Scan Pal Data Reading"
    Me.ResumeLayout(False)

  End Sub
  Friend WithEvents txData As System.Windows.Forms.RichTextBox
  Friend WithEvents btnExtract As System.Windows.Forms.Button
  Friend WithEvents SerialPort As System.IO.Ports.SerialPort

End Class

Open in new window

0
Comment
Question by:milindsaraswala
  • 9
  • 6
17 Comments
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33603287
I change my code now but still it is not working. Help me Experts. Sometime it is reading code but some time it is not. When I debug the code it is showing data in the string and it will show in the message box but the run the application string is showing blank and in else part when I try to write in text box it is giving error like

Cross-thread operation not valid
Imports System.Threading
Imports System.IO.Ports
Imports System.Text

Public Class frmScanPalReading

  Dim ReadBuffer As String = ""
  Dim _continue As Boolean = False

  Private Sub frmScanPalReading_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
    SerialPort.Close()
  End Sub
  Private Sub frmScanPalReading_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
      With SerialPort
        .PortName = "COM1"
        .Handshake = IO.Ports.Handshake.RequestToSend
        .ReceivedBytesThreshold = 1
        .RtsEnable = True
        .BaudRate = 115200
        .DataBits = 8
        .Parity = IO.Ports.Parity.None
        .StopBits = IO.Ports.StopBits.One

        .Open()
      End With
    Catch ex As Exception
      MsgBox(ex.Message)
    End Try
  End Sub

  Private Sub btnExtract_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExtract.Click
    SendCommand("READ")
  End Sub

  Sub SendCommand(ByVal cmd As String)
    SerialPort.Write(cmd + Chr(13))
  End Sub



  Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    'This event will Receive the data from the selected COM port..
    ReceiveData()
    'Dim thRec As Thread
    'If e.EventType = SerialData.Chars Then
    '  thRec = New Thread(AddressOf ReceiveData)
    '  thRec.IsBackground = True
    '  thRec.Priority = ThreadPriority.Highest
    '  thRec.Start()
    '  Thread.Sleep(2)
    'End If
  End Sub

  Private Sub ReceiveData()
    Dim cmd As String = "", _buffer = SerialPort.ReadExisting
    Dim crPos As Integer

    crPos = InStr(_buffer, Chr(13))
    If crPos > 1 Then cmd = Microsoft.VisualBasic.Left(_buffer, crPos - 1)

    If cmd = "ACK" AndAlso _continue = False Then
      ReadBuffer = ReadBuffer & Mid(_buffer, crPos + 2)
      _continue = True
      SendCommand(cmd)
    ElseIf cmd <> "OVER" AndAlso _continue = True Then
      ReadBuffer = ReadBuffer & _buffer
      SendCommand("ACK")
      MsgBox(ReadBuffer)
    Else
      txData.Text = ReadBuffer
      'MsgBox(ReadBuffer)
    End If

    'Sub to Receive Data from the Serial Port, Will Run in a Thread
    'Dim bRead, nRead As Integer, crPOS As Integer
    'Dim returnStr As String = ""
    'Dim ascStr As String = ""
    'Dim m As String = ""
    'Dim i As Int16 = 1

    'bRead = SerialPort.BytesToRead 'Number of Bytes to read
    'Dim cData(bRead - 1) As Byte

    'SerialPort.Encoding = Encoding.GetEncoding(65001)

    'nRead = SerialPort.Read(cData, 0, bRead)  'Reading the Data
    'If _continue = False Then crPOS = ByteSearch(cData, "13")

    'For Each b As Byte In cData
    '  If b <> 0 Then
    '    If crPOS >= i AndAlso _continue = False Then
    '      ascStr += Chr(b)
    '      i += 1
    '    Else
    '      returnStr += Chr(b)
    '      _continue = True
    '    End If
    '  End If
    'Next
    'Debug.WriteLine(m)
    'If returnStr <> "OVER" AndAlso returnStr <> "" Then
    '  ReadBuffer += returnStr           'ASCII String

    '  SendCommand("ACK")
    'End If
    'Console.Write("==Begin=={0}==End==", ReadBuffer.ToString)
  End Sub

  Function ByteSearch(ByVal bData() As Byte, ByVal SearchString As String) As Int16
    Dim i As Int16 = 1
    For Each b As Byte In bData
      If b = SearchString Then
        Exit For
      End If
      i += 1
    Next
    Return i
  End Function
End Class

Open in new window

0
 
LVL 12

Expert Comment

by:Mohamed Abowarda
ID: 33603975
0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33604002
I did this before but it hang my application. if you see my code I have to pass  Read. Then only it will go ahead. Then I have to pass ACK(i.e. Acknowledge) to read another line. So kindly look at my codes try remove bug from it.
0
 
LVL 8

Expert Comment

by:dericstone
ID: 33604547
There are at least two problems I see with this code:
(1) The thread ReceiveData is run everytime the DataReceived event occurs. This might result in multple threads trying simultaneously to read from SerialPort. The correct implementation would start only one thread when the application starts (or some other initial event), and that thread should read data from SerialPort when the DataReceived event occurs. You might need to signal the read through a Semaphore or similar cross-thread signal from DataReceived event handler to the single thread.
(2) Forms objects like TextBox should be accessed only from the thread on which they were created. The line
     txData.Text = ReadBuffer
in ReceiveData will throw an error. One way to work around this is to call txData.Invoke().
0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33604563
Kindly can u give me some sort of code to it. I will be very helpful for the same
0
 
LVL 8

Expert Comment

by:dericstone
ID: 33609279
Following is in C#. I hope you can write similar in VB. I did not compile or run this, but it should give you the idea of where to go.


    private class MySerialStream : SerialStream

    {

      private Thread rxThread = null;

      private object RxThreadSync = new object();



      public SerialStream()

      {

        rxThread = new Thread(new ThreadStart(this.RxThread));

        rxThread.IsBackground = true;

        rxThread.Name = "SerialStream RxThread";

        rxThread.Start();

        this.DataReceived += new SerialDataReceivedEventHandler(serialStream_DataReceived);

      }



      private void serialStream_DataReceived(object sender, SerialDataReceivedEventArgs e)

      {

        lock (this.RxThreadSync)

        {

          Monitor.Pulse(this.RxThreadSync);

        }

      }



      private void RxThread()

      {

        while (this.IsOpen)

        {

          try

          {

            lock (this.RxThreadSync)

            {

              int available = this.BytesToRead;

              byte[] tmpBuf = new byte[available];

              this.Read(tmpBuf, 0, available);

            }

          }

          catch (Exception ex)

          {

          }

        }

      }

    }

Open in new window

0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33610241
Sorry I am VB.net coder I don't understand C#  Kindly can you provide me in consent of following code. Please ..............
Imports System.Threading
Imports System.IO.Ports
Imports System.Text

Public Class frmScanPalReading

  Dim ReadBuffer As String = ""

  Private rxThread As Thread = Nothing
  Private RxThreadSync As New Object()



  Private Sub frmScanPalReading_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
    SerialPort.Close()
  End Sub

  Private Sub frmScanPalReading_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
      With SerialPort
        .PortName = "COM1"
        .Handshake = IO.Ports.Handshake.RequestToSend
        .ReceivedBytesThreshold = 1
        .RtsEnable = True
        .BaudRate = 115200
        .DataBits = 8
        .Parity = IO.Ports.Parity.None
        .StopBits = IO.Ports.StopBits.One

        .Open()
      End With
    Catch ex As Exception
      MsgBox(ex.Message)
    End Try
  End Sub

  Private Sub btnExtract_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExtract.Click
    SendCommand("READ")
  End Sub

  Sub SendCommand(ByVal cmd As String)
    SerialPort.Write(cmd + Chr(13))
  End Sub



  Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    'This event will Receive the data from the selected COM port..
    ReceiveData()
  End Sub

  Private Sub ReceiveData()
    Dim cmd As String = "", _buffer = ""
    Dim crPOS As Integer

    _buffer = ByteToStr()

    crPOS = InStr(_buffer, Chr(13))
    If crPOS > 1 Then cmd = Microsoft.VisualBasic.Left(_buffer, crPOS - 1)

    If cmd = "ACK" Then
      While _buffer <> "OVER" '+ Chr(13)
        SendCommand("ACK")
        _buffer = ByteToStr()
        ReadBuffer = ReadBuffer & _buffer
        'MsgBox(ReadBuffer)
      End While
    Else
      MsgBox("Timeout expired!")
    End If
  End Sub

  Public Function ByteToStr() As String
    Dim strData As String = ""
    Dim bRead, nRead As Integer

    bRead = SerialPort.BytesToRead
    Dim cData(bRead - 1) As Byte

    nRead = SerialPort.Read(cData, 0, bRead)  'Reading the Data

    For Each b As Byte In cData
      If b <> 0 AndAlso b <> 3 AndAlso b <> 10 AndAlso b <> 4 AndAlso b <> 2 AndAlso b <> 16 Then
        strData += Chr(b)
      End If
    Next
    MsgBox(strData)
    Return Trim(strData)
  End Function

End Class

Open in new window

0
 
LVL 8

Expert Comment

by:dericstone
ID: 33610876
Your code does not use threading. I recommend using threading. See sample code below. I have tried to convert this to VB, but there may still be some problems.
Namespace MyNamespace

    Class MySerialStream

      Private rxThread As Thread

      Private RxThreadSync As Object

      Private serialStrea as SerialStream



      Public Sub New()

        Dim str As New MySerialStream()

        Dim rxThread As New Thread(AddressOf str.RxThread)

        rxThread.IsBackground = true;

        rxThread.Name = "SerialStream RxThread";

        rxThread.Start();

        AddHandler serialStream.DataReceived, AddressOf serialStream_DataReceived

      End Sub



      Private Sub MySerialStream::serialStream_DataReceived(object sender, SerialDataReceivedEventArgs e)

         SyncLock RxThreadSync

           Monitor.Pulse(RxThreadSync)

         End SyncLock

      End Sub



      Private Sub MySerialStream::RxThread()

        Dim available As Integer = 0;

        Dim tmpBuf(available) As Byte

        While (serialStream.IsOpen)

            Monitor::Wait( RxThreadSync );

            available = serialStream.BytesToRead;

            serialStream.Read(tmpBuf, 0, available);

        End While

      End Sub

 

Open in new window

0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 
LVL 5

Author Comment

by:milindsaraswala
ID: 33611136
Sir,

I used before the same but I am stuck so I again requesting you to change my working code. I will be very much appreciate.

Again I am requesting. From last 1 week I am running behind this.
0
 
LVL 8

Expert Comment

by:dericstone
ID: 33613328
Please give it a try and post your code when you have integrated the threading. Try runninging it and tell me where you get stuck. I'm not in a position to write all the code for you.
0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33613445
First of all I reading your 2 -3 time but I am getting first line on [b]Private serialStrea as SerialStream [/b] I am not getting what is this SerialStream. And if you see my code Sending some command to the serialPort and then it invoke datarecived event in that I am calling receivedata procedure which I did not find.

If you don't mind than I can send you my codes file through email. So you change the same and send me back the result. Sorry again to bother you.
0
 
LVL 8

Expert Comment

by:dericstone
ID: 33613514
What is SerialPort from _your_ code? I'm assuming it is of type SerialStream? Where is the declaration? See code below. I replaced serialStream by SerialPort (your name) and I showed you how to call ReceiveData. I hope that is clearer.
Namespace MyNamespace

    Class MySerialStream

      Private rxThread As Thread

      Private RxThreadSync As Object

      Private SerialPort as SerialStream



      Public Sub New()

        Dim str As New MySerialStream()

        Dim rxThread As New Thread(AddressOf str.RxThread)

        rxThread.IsBackground = true;

        rxThread.Name = "SerialStream RxThread";

        rxThread.Start();

        AddHandler SerialPort.DataReceived, AddressOf SerialPort_DataReceived

      End Sub



      Private Sub MySerialStream::SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

         SyncLock RxThreadSync

           Monitor.Pulse(RxThreadSync)

         End SyncLock

      End Sub



      Private Sub MySerialStream::RxThread()

        Dim available As Integer = 0;

        Dim tmpBuf(available) As Byte

        While (SerialPort.IsOpen)

            Monitor::Wait( RxThreadSync );

            available = SerialPort.BytesToRead;

            SerialPort.Read(tmpBuf, 0, available);

            // Call ReceiveData with argument tmpBuf

        End While

      End Sub



  Private Sub ReceiveData()

    Dim cmd As String = ""

    'Don't call ReadExisting here, but use the argument tmpBuf passed from RxThread()

    'Dim _buffer = SerialPort.ReadExisting

    Dim _buffer = tmpBuf

    Dim crPos As Integer



    crPos = InStr(_buffer, Chr(13))

    If crPos > 1 Then cmd = Microsoft.VisualBasic.Left(_buffer, crPos - 1)



    If cmd = "ACK" AndAlso _continue = False Then

      ReadBuffer = ReadBuffer & Mid(_buffer, crPos + 2)

      _continue = True

      SendCommand(cmd)

    ElseIf cmd <> "OVER" AndAlso _continue = True Then

      ReadBuffer = ReadBuffer & _buffer

      SendCommand("ACK")

      MsgBox(ReadBuffer)

    Else

      txData.Text = ReadBuffer

      'MsgBox(ReadBuffer)

    End If



    'Sub to Receive Data from the Serial Port, Will Run in a Thread

    'Dim bRead, nRead As Integer, crPOS As Integer

    'Dim returnStr As String = ""

    'Dim ascStr As String = ""

    'Dim m As String = ""

    'Dim i As Int16 = 1



    'bRead = SerialPort.BytesToRead 'Number of Bytes to read

    'Dim cData(bRead - 1) As Byte



    'SerialPort.Encoding = Encoding.GetEncoding(65001)



    'nRead = SerialPort.Read(cData, 0, bRead)  'Reading the Data

    'If _continue = False Then crPOS = ByteSearch(cData, "13")



    'For Each b As Byte In cData

    '  If b <> 0 Then

    '    If crPOS >= i AndAlso _continue = False Then

    '      ascStr += Chr(b)

    '      i += 1

    '    Else

    '      returnStr += Chr(b)

    '      _continue = True

    '    End If

    '  End If

    'Next

    'Debug.WriteLine(m)

    'If returnStr <> "OVER" AndAlso returnStr <> "" Then

    '  ReadBuffer += returnStr           'ASCII String



    '  SendCommand("ACK")

    'End If

    'Console.Write("==Begin=={0}==End==", ReadBuffer.ToString)

  End Sub

Open in new window

0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33613532
No actually serialport is component from toolbox and In my code I am adding EventHandler already to the sub procedure.

Sorry and please don't get angry if I am wrong
0
 
LVL 8

Accepted Solution

by:
dericstone earned 500 total points
ID: 33615493
The code below compiles and works. It demonstrates the use of threading and calling Invoke to access a control that was created on another thread. Good luck.
Public Class Form1

    Private rxThreadHandle As System.Threading.Thread

    Private RxThreadSync As Object = New Object

    Private _continue As Boolean

    Delegate Sub ShowDataTemplate(ByVal myString As String)

    Public myDelegate As ShowDataTemplate





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

        Try

            With SerialPort

                .PortName = "COM1"

                '.Handshake = IO.Ports.Handshake.RequestToSend

                .ReceivedBytesThreshold = 1

                .RtsEnable = True

                .BaudRate = 115200

                .DataBits = 8

                .Parity = IO.Ports.Parity.None

                .StopBits = IO.Ports.StopBits.One



                .Open()

            End With

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try



        myDelegate = New ShowDataTemplate(AddressOf ShowData)



        rxThreadHandle = New System.Threading.Thread(AddressOf RxThread)

        rxThreadHandle.IsBackground = True

        rxThreadHandle.Name = "SerialStream RxThread"

        rxThreadHandle.Start()

    End Sub



    Private Sub SerialPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

        SyncLock RxThreadSync

            System.Threading.Monitor.Pulse(RxThreadSync)

        End SyncLock

    End Sub



    Private Sub RxThread()

        Dim tmpBuf As String

        While (SerialPort.IsOpen)

            SyncLock RxThreadSync

                System.Threading.Monitor.Wait(RxThreadSync)

                tmpBuf = SerialPort.ReadExisting

                ReceiveData(tmpBuf)

            End SyncLock

        End While

    End Sub



    Private Sub ShowData(ByVal _buffer As String)

        TextBox1.Text = TextBox1.Text + _buffer

    End Sub



    Private Sub ReceiveData(ByVal tmpBuf As String)

        TextBox1.Invoke(myDelegate, New Object() {tmpBuf})

    End Sub

End Class

Open in new window

0
 
LVL 5

Author Comment

by:milindsaraswala
ID: 33616060
Thank you very much this solve my problem. I know now about thread I had never worked before with it.
0
 
LVL 5

Author Closing Comment

by:milindsaraswala
ID: 33616186
Great he was really patient with me and giving me time and afford to solve my problem.

Though I have irritate him.  
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Creating an analog clock UserControl seems fairly straight forward.  It is, after all, essentially just a circle with several lines in it!  Two common approaches for rendering an analog clock typically involve either manually calculating points with…
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now