Classic from MSDN
https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
SerialPort.DataReceived - событие
https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
SerialPort.DataReceived - событие
public event SerialDataReceivedEventHandler DataReceived
Данные события может быть вызвано элементов в SerialData перечисления. Поскольку необходимость генерации такого события определяется операционной системой, могут выводиться не все ошибки четности.Событие DataReceived также возникает, если получен символ конца файла , независимо от того, числа байтов во внутреннего входном буфере и значения свойства P:System.IO.Ports.SerialPort. ReceivedBytesThreshold.PinChanged, DataReceived, и ErrorReceived события могут вызываться по порядку и может присутствовать небольшая задержка между ними в основном потоке при сообщении об ошибке и при выполнении обработчика событий. Только один обработчик событий может выполняться одновременно.Возникновение DataReceived для каждого байта полученных событий не гарантируется. Необходимо спользовать BytesToRead свойство, чтобы определить, сколько данных оставить для чтения в буфере.Событие DataReceived возникает во вторичном потоке при получении данных от SerialPort объекта .Поскольку это событие вызывается во вторичном потоке, а не главного потока, попытка изменить некоторые элементы в основном потоке, таких как элементы пользовательского интерфейса может вызвать исключение потоковой обработки.using System; using System.IO.Ports; using System.Threading; namespace comportMSDN { class Program { public static SerialPort mySerialPort; public static void Main(string[] args) { mySerialPort.PortName = "COM11"; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); var dataArray = new byte[] { 0xFF }; while (true) { Thread.Sleep(100); mySerialPort.Write(dataArray, 0, 1); } Console.ReadKey(); mySerialPort.Close(); } private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e) { int inp = mySerialPort.BytesToRead; string indata =""; //SerialPort sp = (SerialPort)sender; if (mySerialPort.BytesToRead > 0) { indata = mySerialPort.ReadExisting(); } //Console.WriteLine("Data Received:"); Console.Write(indata); } } }При необходимости изменить элементы в главном Form или Control, запросы на изменение post должны вызываться с помощью Invoke, который будет работать в соответствующем потоке.
// Determine which mode (string or binary) the user is in
if (CurrentDataMode == DataMode.Text)
{
// Read all the data waiting in the buffer
var data = _comport.ReadExisting();
// Check all the data
CheckDeviceSingal(data);
// Write all data in text file
WriteDeviceDataInTextFile(data);
// Display the text to the user in the terminal
Log(LogMsgType.Incoming, data);
}
else
{
// Obtain the number of bytes waiting in the port's buffer
var bytes = _comport.BytesToRead;
// Create a byte array buffer to hold the incoming data
var buffer = new byte[bytes];
// Read the data from the port and store it in our buffer
_comport.Read(buffer, 0, bytes);
// Show the user the incoming data in hex format
Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
}
private string stroka="";
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(DoUpdate));
}
private void DoUpdate(object s,EventArgs e)
{
stroka = stroka + serialPort1.ReadExisting();
}
Комментариев нет:
Отправить комментарий
ваше мнение...