[英]C# Serial Port Threading, application crashes after some time
我正在編寫一個程序,從COM端口讀取數據並在屏幕上顯示。 當數據讀取頻率較低時,它可以完美地運行並且可以全天運行。 但是,當數據每秒發送一次時,程序每30分鍾崩潰一次。 錯誤代碼是c0000005訪問沖突。
void Start()
{
_serialPort = new SerialPort(TempPortName, 9600, Parity.None, 8, StopBits.One);
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = 1000;
_serialPort.ReadBufferSize = 100000;
readThread = new Thread(Read);
readThread.Start();
}
void Read()
{
string MessageSection = "";
char[] end = {'\r'};
//string MessageSection = "";
while (readData)
{
Thread.Sleep(10);
if (_serialPort.IsOpen)
{
string message = "test";
try
{
message = ((char)(_serialPort.ReadByte())).ToString();
}
catch
{
message = "";
}
if (message != "")
{
message = MessageSection + message;
string[] MessageArray = message.Split(end);
if (!message.EndsWith("\r"))
{
MessageSection = MessageArray[MessageArray.Length - 1];
}
else
{
if(message.Length>0)
{
doSomething();
}
MessageSection = "";
}
}
else {
}
}
else
{
try
{
_serialPort.Open();
}
catch
{
print("Error");
}
}
}
}
我正在使用Unity 3D,它是關於緩沖區嗎?
使用while loop
進行串行端口通信並不是一種不錯的方式。 您注冊SerialPort.DataReceived
Event以接收端口上的in-comming數據。
以下是MSDN的示例代碼
using System;
using System.IO.Ports;
class PortDataReceived
{
public static void Main()
{
SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.