Sharer는 .NET 및 Arduino 라이브러리 입니다. Sharer Protocole을 사용하여 Arduino의 변수 및 원격 통화 기능을 읽고 쓰기/쓰기 할 수 있습니다. Sharer는 처음에 Ballcuber 프로젝트 (https://ballcuber.github.io)를 위해 개발되었지만 이제 독립형 라이브러리입니다.).
// C#
var connection = new SharerConnection ( "COM3" , 115200 ) ;
connection . Connect ( ) ; 비고 : Micro 및 Leonardo와 같은 일부 보드의 경우 RtsEnable 및 DtrEnable 특성으로 RTS 및 DTR 신호를 설정해야합니다.
// 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, ... WriteUserData 함수로 직렬 포트에서 클래식 메시지를 보내고받을 수 있습니다. 또한 Arduino가 데이터를 전송하면 UserDataReceived 이벤트가 제기됩니다.
경고 : UserDataReceived 이벤트 핸들러에서 변수를 읽거나 쓰고 호출 기능을 할 수 없습니다.
// 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는 2 개의 리포지토리로 나뉩니다. 하나는 Arduino 소스 용이고 다른 하나는 .NET 소스 용으로 나뉩니다.
Sharer는 메뉴 Tools/Manage Libraries... Sharer를 찾고 최신 버전을 설치하십시오.
Sharer Library Archive : https://github.com/rufus31415/sharer/releases/latest/download/sharer.zip을 다운로드하십시오
Sharer는 Arduino Uno, Nano, Mega 및 Due와 함께 테스트되었습니다. 다른 보드와 함께 작동 할 수 있습니다. Arduino "라이브러리"디렉토리에 Sharer 디렉토리를 얻을 수 있도록 추출하십시오. C:Program Files (x86)ArduinolibrariesSharer
그런 다음 Arduino IDE를 다시 시작하여 예제를 즐기고 메뉴 File / examples / Sharer 로 이동할 수 있습니다.
sharer.net은 nuget : https://www.nuget.org/packages/sharer/에서 사용할 수 있습니다.
이 명령 줄을 사용하여 패키지 관리자와 함께 설치하십시오.
Install-Package Sharer
Sharer.dll 어셈블리는 여기에서 다운로드 할 수 있습니다 : https://github.com/rufus31415/sharer.net/releases/latest/download/sharerasssemblies.zip
이 아카이브에는 다음 대상에 대해 AnyCPU 릴리스에서 Nuget 패키지 Sharer.nupkg 및 Sharer.dll이 포함되어 있습니다.
Windows Forms 예제에는 .NET 프레임 워크 3.5가 필요합니다. 여기에서 다운로드 할 수 있습니다 : https://github.com/rufus31415/sharer.net/releases/latest/download/sharerwindowsformsexample.zip
콘솔 예제는 .NET Core 3.0으로 실행됩니다. 그러나 실행하기 위해 런타임이 필요하지 않습니다. 독립형 콘솔 예제는 다음과 같습니다.
© Rufus31415 자세한 내용은 라이센스 파일을 참조하십시오.
헤더 파일 <sharer.h>가 포함되어야합니다.
function setup() 에서 Sharer.init(...) 함수하기 위해 baudrate를 전달하여 Sharer가 초기화됩니다. 내부적으로 Serial.init() 동일한 보드 레이트로 호출합니다.
function loop() 에서 Sharer.run() 호출해야합니다. 수신 명령을 디코딩하는 Sharer의 내부 커널을 실행합니다.
# include < Sharer.h >
void setup () {
Sharer. init ( 115200 );
}
void loop () {
Sharer. run ();
}또한 데스크탑 애플리케이션과 통신하기 위해 Serial2를 사용하는 경우 Arduino의 Serial2와 같은 다른 스트림으로 Sharer를 초기화 할 수 있습니다.
void setup () {
// Initialize with another Serial interface
Serial2. begin ( 9600 );
Sharer. init (Serial2);
} 공유 변수 목록에 변수를 추가하려면 매크로 Sharer_ShareVariable 호출해야합니다. 첫 번째 인수는 변수의 유형이고 두 번째 인수는 이름입니다. 이 매크로를 사용하면 Sharer가 변수, 이름, 유형 및 메모리 크기에 대한 포인터를 가질 수 있습니다.
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 ]);
} 공유 함수 목록에 변수를 추가하려면 매크로 Sharer_ShareFunction 호출해야합니다. 첫 번째 인수는 반환 된 유형이고 두 번째 인수는 이름입니다. 매크로의 주장에 따라 공유 함수의 인수는 그 유형과 이름으로 설명합니다. 공유 할 수있는 인수의 수에는 제한이 없지만 모든 인수는 공유되어야합니다.
클래스 메소드 공유가 지원되지 않으며 공유 함수는 자유 함수 (비회원 정적 함수) 여야합니다.
자신의 기능을 공유 할 수 있지만 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);
} 무효 함수는 반환 된 유형이없는 함수입니다. 공극 함수를 공유하려면 매크로 Sharer_ShareVoid 호출해야합니다. 첫 번째 인수는 그 이름이며, 각 인수의 유형과 이름이 뒤 따릅니다.
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);
}Sharer 클래스는 스트림에서 상속되므로 다음 기능을 사용할 수 있습니다. 공유 함수 내부에서 sharer.print (), sharer.println () 또는 sharer.write ()를 사용하지 마십시오.
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 );
} 파일 C:Program Files (x86)ArduinolibrariesSharersrcSharerConfig.h 의 상수를 편집하여 Sharer의 한계를 변경할 수 있습니다.
// 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 여기에서 sharer.net : /sharer.net/sharer.net.documentation.md의 전체 문서를 찾을 수 있습니다.
명령은 115200 Bauds의 Arduino Uno (Command + Response)에서 10ms 미만이 호출됩니다. 프로토 콜은 해독 할 문자열이없고 바이트에 의해 바이트를 해석하는 이진 스트림 만 갖도록 최적화됩니다. 메모리 발자국은 f () 매크로 및 프로그 메법을 사용하여 변수, 함수 및 인수의 이름을 플래시에 저장하여 최적화되었습니다.
Sharer는 Sharer Protocole이라는 독특한 프로토콜을 사용합니다. Arduino가받은 모든 연속 명령은 해석됩니다.
계속하기 위해 약속합니다 ...
다음과 같은 공유 기능을 확장 할 몇 가지 아이디어가 있습니다.
Sharer Development를 도와주는 데 관심이 있다면 기능 요청을 기꺼이받을 것입니다. 포크도 환영합니다;)