Skip to content

A C# port of the Arduino SerialTransfer library for robust, packetized serial communication between .NET applications and Arduino devices.

License

Notifications You must be signed in to change notification settings

frozer/SerialTransfer.NET

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SerialTransfer.NET

A C# port of the Arduino SerialTransfer library for robust, packetized serial communication between .NET applications and Arduino devices.

Overview

SerialTransfer.NET enables reliable communication between C# applications and Arduino devices using a packet-based protocol with CRC validation. It supports sending both text messages and structured binary data with minimal overhead.

Key features:

  • Packet framing with start/stop bytes
  • CRC error checking
  • Support for different packet types via packet IDs
  • Transmitting and receiving structured data
  • Automatic packet acknowledgment

Installation

Requirements

  • .NET Framework 4.6.1+ or .NET Core 3.1+ / .NET 5.0+
  • System.IO.Ports package for SerialPort functionality

Via NuGet (Coming Soon)

Install-Package SerialTransfer.NET

Manual Installation

  1. Clone this repository
  2. Add the project to your solution or directly reference the DLL

Project Structure

SerialTransfer.NET/
├── src/                     # Source code for the library
│   ├── PacketCRC.cs         # CRC implementation
│   ├── Packet.cs            # Packet handling
│   └── SerialTransfer.cs    # Main SerialTransfer class
├── samples/                 # Example applications
└── tests/                   # Unit and integration tests

Usage

Basic Example

using System;
using System.IO.Ports;
using System.Text;
using SerialTransfer;

// Create and configure SerialPort
SerialPort port = new SerialPort
{
    PortName = "COM3",
    BaudRate = 115200,
    DataBits = 8,
    Parity = Parity.None,
    StopBits = StopBits.One
};

// Create SerialTransfer instance
SerialTransfer transfer = new SerialTransfer();
transfer.Begin(port);

// Send text message
string message = "Hello Arduino!";
byte[] messageBytes = Encoding.ASCII.GetBytes(message);

for (int i = 0; i < messageBytes.Length; i++)
{
    transfer.Packet.TxBuff[i] = messageBytes[i];
}

transfer.SendData((ushort)messageBytes.Length, 1);

// Receive response
if (transfer.Available() > 0)
{
    byte packetId = transfer.CurrentPacketId();
    byte bytesRead = transfer.BytesRead;
    
    string response = Encoding.ASCII.GetString(
        transfer.Packet.RxBuff, 0, bytesRead);
    
    Console.WriteLine($"Response: {response}");
}

// Clean up
transfer.Close();

Sending and Receiving Structs

// Define a struct for binary transmission
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct SensorData
{
    public int Id;
    public float Temperature;
    public float Humidity;
    public byte Status;
}

// Create data to send
SensorData data = new SensorData
{
    Id = 42,
    Temperature = 23.5f,
    Humidity = 65.0f,
    Status = 1
};

// Manually serialize and send the struct
int structSize = Marshal.SizeOf(data);
byte[] structBytes = new byte[structSize];

GCHandle handle = GCHandle.Alloc(structBytes, GCHandleType.Pinned);
try
{
    Marshal.StructureToPtr(data, handle.AddrOfPinnedObject(), false);
}
finally
{
    handle.Free();
}

// Copy to transmit buffer
for (int i = 0; i < structBytes.Length; i++)
{
    transfer.Packet.TxBuff[i] = structBytes[i];
}

// Send with packet ID 2
transfer.SendData((ushort)structSize, 2);

// Receive and deserialize struct
if (transfer.Available() > 0)
{
    SensorData receivedData = new SensorData();
    transfer.RxObj(ref receivedData);
    
    Console.WriteLine($"Received: ID={receivedData.Id}, " +
                      $"Temp={receivedData.Temperature}°C");
}

Arduino Compatibility

This library is designed to work with the Arduino SerialTransfer library. Your Arduino sketch should include:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup() {
  Serial.begin(115200);
  myTransfer.begin(Serial);
}

void loop() {
  if(myTransfer.available()) {
    // Process received data
    // ...
    
    // Send response
    // ...
  }
}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

About

A C# port of the Arduino SerialTransfer library for robust, packetized serial communication between .NET applications and Arduino devices.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published