Sharer adalah .NET dan Perpustakaan Arduino . Ini memungkinkan aplikasi desktop untuk membaca/menulis variabel dan fungsi panggilan jarak jauh di Arduino , menggunakan protokol sharer accross komunikasi serial. Sharer awalnya telah dikembangkan untuk proyek Ballcuber (https://ballcuber.github.io), tetapi sekarang menjadi perpustakaan mandiri;).
// C#
var connection = new SharerConnection ( "COM3" , 115200 ) ;
connection . Connect ( ) ; Komentar: Untuk beberapa papan, seperti mikro dan Leonardo, perlu untuk mengatur sinyal RT dan DTR dengan properti RtsEnable dan DtrEnable .
// C# - My Arduino code has a function : int Sum(int a, byte b);
var result = connection . Call ( "Sum" , 10 , 12 ) ;
// result.Status : OK
// result.Type : int
// result.Value : 22 // C# - Read all digital pins : digitalRead(0) to digitalRead(13)
for ( int i = 0 ; i <= 13 ; i ++ ) {
var digitalValue = connection . Call ( "digitalRead" , i ) ;
// digitalValue.Status : OK
// digitalValue.Type : bool
// digitalValue.Value : true or false
} // C# - Definition of all functions
var functions = connection . Functions ;
// functions[0].Name : function name
// functions[0].ReturnType : enum void, int, long, ...
// functions[0].Arguments[0].Name // Name of first argument
// functions[0].Arguments[0].Type // enum void, int, long, ... // C#
connection . WriteVariable ( "myVar" , 15 ) ; // returns true if writting OK // C# - Write simultaneously several variables by passing a List<WriteVariable>()
connection . WriteVariables ( listOfVariablesToWrite ) ; // C# - Definition of all variables
var variables = connection . Variables ;
// variables[0].Name : variable name
// variables[0].Type : enum int, long, ... // C#
var value = connection . ReadVariable ( "myVar" ) ;
// value.Status : OK
// value.Value : 12 // C# - Read simultaneously several variables
var values = connection . ReadVariables ( new string [ ] { "myVar" , "anotherVar" , "yetAnother" } ) ; // C#
var info = connection . GetInfos ( ) ;
// info.Board : Arduino UNO
// info.CPUFrequency : 16000000 (Hz)
// a lot more : info.CPlusPlusVersion, info.FunctionMaxCount, info.VariableMaxCount, ... Anda dapat mengirim dan menerima pesan klasik di port serial dengan fungsi WriteUserData . Juga, acara UserDataReceived dinaikkan ketika data dikirim oleh Arduino.
PERINGATAN: Tidak mungkin untuk membaca atau menulis variabel dan fungsi panggilan di pawang event UserDataReceived Anda.
// C#
connection . WriteUserData ( "Hello!" ) ;
connection . WriteUserData ( 12.2 ) ;
connection . WriteUserData ( new byte [ ] { 0x12 , 0x25 , 0xFF } ) ;
// Event raised when new user data sent by Arduino
connection . UserDataReceived += UserDataReceived ; // C++ Arduino
# include < Sharer.h >
// A simple function that sums an integer and a byte and return an integer
int Sum ( int a, byte b) {
return a + b;
}
// a simple integer
int myVar = 25 ;
void setup () {
Sharer. init ( 115200 ); // Init Serial communication with 115200 bauds
// Expose this function to Sharer : int Sum(int a, byte b)
Sharer_ShareFunction ( int , Sum, int , a, byte, b);
// Share system functions
Sharer_ShareFunction ( bool , digitalRead, uint8_t , pin);
Sharer_ShareVoid (pinMode, uint8_t , pin);
// Expose this variable to Sharer so that the desktop application can read/write it
Sharer_ShareVariable ( int , myVar);
}
// Run Sharer engine in the main Loop
void loop () {
Sharer. run ();
}Sharer dibagi menjadi 2 repositori, satu untuk sumber Arduino dan yang lainnya untuk sumber .NET
Sharer tersedia di Manajer Perpustakaan yang tersedia di Tools/Manage Libraries... Cari saja Sharer dan instal versi terbaru.
Silakan unduh Arsip Perpustakaan Sharer: https://github.com/rufus31415/sharer/releases/latest/download/sharer.zip
Sharer telah diuji dengan Arduino Uno, Nano, Mega dan karena. Ini mungkin bekerja dengan papan lain. Ekstrak sehingga Anda mendapatkan direktori yang lebih sharer di Direktori "Perpustakaan" Arduino Anda: C:Program Files (x86)ArduinolibrariesSharer
Anda kemudian dapat menikmati contoh -contoh dengan memulai kembali IDE Arduino Anda dan pergi ke File / examples / Sharer .
Sharer.net tersedia di nuget: https://www.nuget.org/packages/sharer/
Gunakan baris perintah ini untuk menginstalnya dengan manajer paket Anda:
Install-Package Sharer
Rakitan sharer.dll dapat diunduh di sini: https://github.com/rufus31415/sharer.net/releases/latest/download/sharerasssemblies.zip
Arsip ini berisi paket nuget sharer.nupkg dan sharer.dll yang dikompilasi dalam rilis apa pun untuk target berikut:
Contoh Windows Forms membutuhkan .NET Framework 3.5. Ini dapat diunduh di sini: https://github.com/rufus31415/sharer.net/releases/latest/download/sharerwindowsformsexample.zip
Contoh konsol dijalankan dengan .NET Core 3.0. Tetapi Anda tidak perlu runtime untuk menjalankannya. Contoh konsol mandiri tersedia di sini:
© RUFUS31415 Lihat file lisensi untuk detailnya.
File header <sharer.h> harus dimasukkan.
Dalam setup() , Sharer diinisialisasi dengan melewati baudrate ke function Sharer.init(...) . Ini secara internal memanggil Serial.init() dengan baudrate yang sama.
Dalam fungsi loop() , Sharer.run() harus dipanggil. Ini menjalankan kernel internal Sharer yang decodes perintah diterima.
# include < Sharer.h >
void setup () {
Sharer. init ( 115200 );
}
void loop () {
Sharer. run ();
}Anda juga dapat menginisialisasi lebih sharer dengan aliran lain, seperti serial2 dari Arduino karena jika Anda menggunakan Serial2 untuk berkomunikasi dengan aplikasi desktop:
void setup () {
// Initialize with another Serial interface
Serial2. begin ( 9600 );
Sharer. init (Serial2);
} Untuk menambahkan variabel dalam daftar variabel bersama, Anda harus menghubungi makro Sharer_ShareVariable . Argumen pertamanya adalah jenis variabel, dan yang kedua adalah namanya. Makro ini memungkinkan Shower memiliki pointer ke variabel, namanya, jenisnya dan ukuran memori.
byte myByteVar;
long myLongVar;
int myIntArray[ 2 ];
void setup () {
Sharer. init ( 115200 );
Sharer_ShareVariable (byte, myByteVar);
Sharer_ShareVariable ( long , myLongVar);
Sharer_ShareVariable ( int , myIntArray[ 0 ]);
Sharer_ShareVariable ( int , myIntArray[ 1 ]);
} Untuk menambahkan variabel dalam daftar fungsi bersama, Anda harus menghubungi Macro Sharer_ShareFunction . Argumen pertamanya adalah tipe yang dikembalikan, dan yang kedua adalah namanya. Mengikuti argumen makro menggambarkan argumen fungsi yang dibagikan berdasarkan jenisnya dan namanya. Tidak ada batasan dalam jumlah argumen yang dapat Anda bagikan, tetapi semua argumen harus dibagikan.
Berbagi metode kelas tidak didukung dan fungsi bersama harus fungsi gratis (fungsi statis non-anggota).
Anda dapat membagikan fungsi Anda sendiri, tetapi semua fungsi sistem seperti Analogread, DigitalRead, DigitalWrite, Millis, ...
int Sum ( int a, byte b) {
return a + b;
}
void setup () {
Sharer. init ( 115200 );
// Share your function to Sharer : int Sum(int a, byte b)
Sharer_ShareFunction ( int , Sum, int , a, byte, b);
// Sharer system functions
Sharer_ShareFunction ( int , analogRead, uint8_t , pin);
Sharer_ShareFunction ( bool , digitalRead, uint8_t , pin);
} Fungsi batal adalah fungsi tanpa jenis yang dikembalikan. Anda harus menghubungi makro Sharer_ShareVoid untuk berbagi fungsi void. Argumen pertama adalah namanya, diikuti oleh jenis dan nama setiap argumen.
void TurnLEDOn ( void ) {
pinMode ( 13 , OUTPUT);
digitalWrite ( 13 , true );
}
void SetLEDState ( bool state) {
pinMode ( 13 , OUTPUT);
digitalWrite ( 13 , state);
}
void setup () {
Sharer. init ( 115200 );
// Share your void fuctions
Sharer_ShareVoid (TurnLEDOn);
Sharer_ShareVoid (SetLEDState, bool , state);
// Sharer system void functions
Sharer_ShareVoid (digitalWrite, uint8_t , pin);
}Kelas yang lebih sharer mewarisi dari stream, sehingga Anda dapat menggunakan fungsi -fungsi berikut. Tolong, jangan pernah menggunakan sharer.print (), sharer.println () atau sharer.write () di dalam fungsi bersama, menulis woud akan diabaikan.
void loop () {
Sharer. run ();
// gets the number of bytes available in the stream
int available = Sharer. available ();
// reads last reveided byte (-1 if no data to read)
int lastByte = Sharer. read ();
// Empty the stream
Sharer. flush ();
// reads data from the serial buffer until the target is found
// returns, true if data is found
bool found = Sharer. find ( " string to find " );
// Returns the next byte of incoming serial data without removing it from the internal serial buffer
// Successive calls to peek() will return the same character
int nextByte = Sharer. peek ();
// reads characters from the serial buffer into a String
String str = Sharer. readString ();
// Looks for the next valid integer in the incoming serial
int lastInt = Sharer. parseInt ();
lastInt = Sharer. parseInt (SKIP_ALL); // all characters other than digits or a minus sign are ignored when scanning the stream for an integer. This is the default mode
lastInt = Sharer. parseInt (SKIP_NONE); // nothing is skipped, and the stream is not touched unless the first waiting character is valid.
lastInt = Sharer. parseInt (SKIP_WHITESPACE); // only tabs, spaces, line feeds, and carriage returns are skipped.
// returns the first valid floating point number from the Serial buffer
float lastFloat = Sharer. parseFloat ();
lastFloat = Sharer. parseFloat (SKIP_ALL); // all characters other than a minus sign, decimal point, or digits are ignored when scanning the stream for a floating point number. This is the default mode.
lastFloat = Sharer. parseFloat (SKIP_NONE); // Nothing is skipped, and the stream is not touched unless the first waiting character is valid.
lastFloat = Sharer. parseFloat (SKIP_WHITESPACE); // only tabs, spaces, line feeds, and carriage returns are skipped.
// Prints ASCII encoded string
Sharer. print ( 85 ); // sends the string "85"
Sharer. print ( 1.23456 ); // sends the string "1.23"
Sharer. print ( ' N ' ); // sends the string "N"
Sharer. print ( " Hello world. " ); // sends the string "Hello world."
Sharer. print ( 78 , BIN); // sends the string "1001110"
Sharer. print ( 78 , OCT); // sends the string "116"
Sharer. print ( 78 , DEC); // sends the string "78"
Sharer. print ( 78 , HEX); // sends the string "4E"
Sharer. print ( 1.23456 , 0 ); // sends the string "1"
Sharer. print ( 1.23456 , 2 ); // sends the string "1.23"
Sharer. print ( 1.23456 , 4 ); // sends the string "1.2345"
Sharer. println ( " Hello ;) " ); // send the string and a new line "Hello ;)n"
Sharer. println (); // just sends a new line
// Write a single byte
Sharer. write ( 0x12 );
} Anda dapat mengubah batas Sharer dengan mengedit konstanta file C:Program Files (x86)ArduinolibrariesSharersrcSharerConfig.h .
// maximum number of shared functions
# define _SHARER_MAX_FUNCTION_COUNT 16
// maximum number of shared variables
# define _SHARER_MAX_VARIABLE_COUNT 32
// circle buffer size for user serial message
# define _SHARER_USER_RECEIVE_BUFFER_SIZE 64
// maximum number of call to Serial.read() each time Sharer.Run() is called
# define _SHARER_MAX_BYTE_READ_PER_RUN 1000 Anda dapat menemukan di sini dokumentasi lengkap sharer.net: /sharer.net/sharer.net.documentation.md.
Perintah membutuhkan waktu kurang dari 10ms untuk dipanggil pada Arduino UNO (Command + Response) di 115200 bauds. Protokol dioptimalkan agar tidak memiliki string untuk memecahkan kode, hanya aliran biner untuk menafsirkan, byte byte. Jejak kaki memori telah dioptimalkan dengan menggunakan f () makro dan progmem untuk menyimpan nama variabel, fungsi dan argumen dalam flash.
Sharer menggunakan protokol unik yang disebut Sharer Protocole. Setiap perintah serial yang diterima oleh Arduino diinterpretasikan.
Untuk dilanjutkan, saya berjanji ...
Saya punya beberapa ide untuk memperluas fitur yang lebih tajam seperti:
Jika Anda tertarik untuk membantu saya dengan pengembangan yang lebih besar, saya akan dengan senang hati menerima permintaan fitur. Fork juga diterima;)