Introduction It is possible to chain Arduinos together in such a way as to get communication between the two. Having Arduino-Arduino communication can be useful for many projects, such as having one Arduino to run motors and having another sense the surroundings and then relay commands to the other Arduino.
I'm curious on how would one accomplish event driven programming from a language like python (or other, but for simplicity sake, python will do.). By that I mean providing a system that allow programmer to hook functions to certain events, and fire those events when triggered. (Basically the APIs behind all the GUI toolkits that connects events to functions, and how they recognize events in a main loop).
What I'm thinking right now is a while loop in python in a separate thread that will pick up events as they are triggered (checking conditions). However that seems inefficient.
Any thoughts/example code?
You are right that checking is terribly inefficient. Use messaging instead of checking. (When an event happens, make that system send a notification to the systems waiting on it.)
There are packages for event systems out there. I can't recommend one, but search and check out the source. You might find one you like or you might get ideas for writing one of your own.
-->The following code example demonstrates the use of the SerialPort class to allow two users to chat from two separate computers connected by a null modem cable. In this example, the users are prompted for the port settings and a username before chatting. Both computers must be executing the program to achieve full functionality of this example.
Use this class to control a serial port file resource. This class provides synchronous and event-driven I/O, access to pin and break states, and access to serial driver properties. Additionally, the functionality of this class can be wrapped in an internal Stream object, accessible through the BaseStream property, and passed to classes that wrap or use streams.
The SerialPort class supports the following encodings: ASCIIEncoding, UTF8Encoding, UnicodeEncoding, UTF32Encoding, and any encoding defined in mscorlib.dll where the code page is less than 50000 or the code page is 54936. You can use alternate encodings, but you must use the ReadByte or Write method and perform the encoding yourself.
You use the GetPortNames method to retrieve the valid ports for the current computer.
If a SerialPort object becomes blocked during a read operation, do not abort the thread. Instead, either close the base stream or dispose of the SerialPort object.
SerialPort()SerialPort()SerialPort()SerialPort() | Initializes a new instance of the SerialPort class. |
SerialPort(IContainer)SerialPort(IContainer)SerialPort(IContainer)SerialPort(IContainer) | Initializes a new instance of the SerialPort class using the specified IContainer object. |
SerialPort(String)SerialPort(String)SerialPort(String)SerialPort(String) | Initializes a new instance of the SerialPort class using the specified port name. |
SerialPort(String, Int32)SerialPort(String, Int32)SerialPort(String, Int32)SerialPort(String, Int32) | Initializes a new instance of the SerialPort class using the specified port name and baud rate. |
SerialPort(String, Int32, Parity)SerialPort(String, Int32, Parity)SerialPort(String, Int32, Parity)SerialPort(String, Int32, Parity) | Initializes a new instance of the SerialPort class using the specified port name, baud rate, and parity bit. |
SerialPort(String, Int32, Parity, Int32)SerialPort(String, Int32, Parity, Int32)SerialPort(String, Int32, Parity, Int32)SerialPort(String, Int32, Parity, Int32) | Initializes a new instance of the SerialPort class using the specified port name, baud rate, parity bit, and data bits. |
SerialPort(String, Int32, Parity, Int32, StopBits)SerialPort(String, Int32, Parity, Int32, StopBits)SerialPort(String, Int32, Parity, Int32, StopBits)SerialPort(String, Int32, Parity, Int32, StopBits) | Initializes a new instance of the SerialPort class using the specified port name, baud rate, parity bit, data bits, and stop bit. |
InfiniteTimeoutInfiniteTimeoutInfiniteTimeoutInfiniteTimeout | Indicates that no time-out should occur. |
Close()Close()Close()Close() | Closes the port connection, sets the IsOpen property to |
CreateObjRef(Type)CreateObjRef(Type)CreateObjRef(Type)CreateObjRef(Type) | Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited from MarshalByRefObject) |
DiscardInBuffer()DiscardInBuffer()DiscardInBuffer()DiscardInBuffer() | Discards data from the serial driver's receive buffer. |
DiscardOutBuffer()DiscardOutBuffer()DiscardOutBuffer()DiscardOutBuffer() | Discards data from the serial driver's transmit buffer. |
Dispose()Dispose()Dispose()Dispose() | Releases all resources used by the Component. (Inherited from Component) |
Dispose(Boolean)Dispose(Boolean)Dispose(Boolean)Dispose(Boolean) | Releases the unmanaged resources used by the SerialPort and optionally releases the managed resources. |
Equals(Object)Equals(Object)Equals(Object)Equals(Object) | Determines whether the specified object is equal to the current object. (Inherited from Object) |
GetHashCode()GetHashCode()GetHashCode()GetHashCode() | Serves as the default hash function. (Inherited from Object) |
GetLifetimeService()GetLifetimeService()GetLifetimeService()GetLifetimeService() | Retrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject) |
GetPortNames()GetPortNames()GetPortNames()GetPortNames() | Gets an array of serial port names for the current computer. |
GetService(Type)GetService(Type)GetService(Type)GetService(Type) | Returns an object that represents a service provided by the Component or by its Container. (Inherited from Component) |
GetType()GetType()GetType()GetType() | Gets the Type of the current instance. (Inherited from Object) |
InitializeLifetimeService()InitializeLifetimeService()InitializeLifetimeService()InitializeLifetimeService() | Obtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject) |
MemberwiseClone()MemberwiseClone()MemberwiseClone()MemberwiseClone() | Creates a shallow copy of the current Object. (Inherited from Object) |
MemberwiseClone(Boolean)MemberwiseClone(Boolean)MemberwiseClone(Boolean)MemberwiseClone(Boolean) | Creates a shallow copy of the current MarshalByRefObject object. (Inherited from MarshalByRefObject) |
Open()Open()Open()Open() | Opens a new serial port connection. |
Read(Byte[], Int32, Int32)Read(Byte[], Int32, Int32)Read(Byte[], Int32, Int32)Read(Byte[], Int32, Int32) | Reads a number of bytes from the SerialPort input buffer and writes those bytes into a byte array at the specified offset. |
Read(Char[], Int32, Int32)Read(Char[], Int32, Int32)Read(Char[], Int32, Int32)Read(Char[], Int32, Int32) | Reads a number of characters from the SerialPort input buffer and writes them into an array of characters at a given offset. |
ReadByte()ReadByte()ReadByte()ReadByte() | Synchronously reads one byte from the SerialPort input buffer. |
ReadChar()ReadChar()ReadChar()ReadChar() | Synchronously reads one character from the SerialPort input buffer. |
ReadExisting()ReadExisting()ReadExisting()ReadExisting() | Reads all immediately available bytes, based on the encoding, in both the stream and the input buffer of the SerialPort object. |
ReadLine()ReadLine()ReadLine()ReadLine() | Reads up to the NewLine value in the input buffer. |
ReadTo(String)ReadTo(String)ReadTo(String)ReadTo(String) | Wince cab manager 3 serial. Reads a string up to the specified |
ToString()ToString()ToString()ToString() | Returns a String containing the name of the Component, if any. This method should not be overridden. (Inherited from Component) |
Write(Byte[], Int32, Int32)Write(Byte[], Int32, Int32)Write(Byte[], Int32, Int32)Write(Byte[], Int32, Int32) | Writes a specified number of bytes to the serial port using data from a buffer. |
Write(Char[], Int32, Int32)Write(Char[], Int32, Int32)Write(Char[], Int32, Int32)Write(Char[], Int32, Int32) | Writes a specified number of characters to the serial port using data from a buffer. |
Write(String)Write(String)Write(String)Write(String) | Writes the specified string to the serial port. |
WriteLine(String)WriteLine(String)WriteLine(String)WriteLine(String) | Writes the specified string and the NewLine value to the output buffer. |
DataReceivedDataReceivedDataReceivedDataReceived | Indicates that data has been received through a port represented by the SerialPort object. |
DisposedDisposedDisposedDisposed | Occurs when the component is disposed by a call to the Dispose() method. (Inherited from Component) |
ErrorReceivedErrorReceivedErrorReceivedErrorReceived | Indicates that an error has occurred with a port represented by a SerialPort object. |
PinChangedPinChangedPinChangedPinChanged | Indicates that a non-data signal event has occurred on the port represented by the SerialPort object. |
SecurityPermission
for the ability to call unmanaged code. Associated enumeration: UnmanagedCode