經過大量的研究,我仍然難倒了。我有一個連續讀取數據的串口對象。我所能做的就是生成dataReceived事件,與端口通信,並將接收到的值輸出到調試窗口。所以,我很確定這一切都在身體上運作。問題是當我嘗試將串行端口輸出傳遞給我的原始線程時出現錯誤。它說我不能有線程交叉討論(或者是那種效果)。我一直在嘗試使用backgroundWorker,但我不確定這是我想要的解決方案,加上我的新手技能有點超出我的頭腦。我試圖使用調用,但該方法似乎不可用。 (我可能是從錯誤的對象調用?)無論如何部分在下面。線程之間的串口通信
namespace Photometer
{
class csRadiometerILT1700
{
//manufacturer specs for baud rate, databits, and stop bits
static string portName="COM1";
static int baudRate = 1200;
static int dataBits = 8;
//instantialize a serial port object for the Radiometer
private SerialPort RadiometerSerial = new SerialPort(portName, baudRate, Parity.None, dataBits, StopBits.One);
//constructor
//public csRadiometerILT1700(Form ParentForm, Chart outputChart)
public csRadiometerILT1700()
{
//two handshaking properties of the ILT1700. Handshaking is enabled and
//http://stackoverflow.com/questions/6277619/problem-reading-serial-port-c-net-2-0-to-get-weighing-machine-output
RadiometerSerial.Handshake= Handshake.RequestToSend;
RadiometerSerial.DtrEnable = true;
RadiometerSerial.DataReceived += new SerialDataReceivedEventHandler(RadiometerSerial_DataReceived);
}
public void openPort()
{
if (!RadiometerSerial.IsOpen)
{
RadiometerSerial.Open();
}
}
public void closePort()
{
RadiometerSerial.Close();
}
string RadiometerVoltageReadingString;
int RadiometerVoltageReadingInt;
private void RadiometerSerial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//It's here that this.invoke()... cannot be called.
RadiometerVoltageReadingString= (RadiometerSerial.ReadExisting().ToString()); //y-value
Debug.Print(RadiometerVoltageReadingString.ToString());
makeRadioReadingDouble(RadiometerVoltageReadingString);
}
private void makeRadioReadingDouble(string inputVoltageString)
{
List<double> outputVoltageDouble=new List<double>(2);
if (!(inputVoltageString == "\r\n" || inputVoltageString == ""))
{
string[] voltageValAndExpo = inputVoltageString.Split(new string[] { "e", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
for (int inCounter = 0; inCounter < voltageValAndExpo.Count(); inCounter=inCounter+2)
{
double voltageVal = Convert.ToDouble(voltageValAndExpo[inCounter]);
double voltageExpo = Convert.ToDouble(voltageValAndExpo[inCounter + 1]);
outputVoltageDouble.Add(Math.Pow(voltageVal, voltageExpo));
}
}
}
}
}
這是當我形成任何有識之士的讚賞碼
csRadiometerILT1700 Radiometer;
...
Radiometer = new csRadiometerILT1700();
Radiometer.openPort();
加載所有調用。
編輯: 我改變了我的csRadiometerILT1700構造函數
public csRadiometerILT1700(Form inputForm)
{
//inputForm.Invoke(
//two handshaking properties of the ILT1700. Handshaking is enabled and
//http://stackoverflow.com/questions/6277619/problem-reading-serial-port-c-net-2-0-to-get-weighing-machine-output
RadiometerSerial.Handshake= Handshake.RequestToSend;
RadiometerSerial.DtrEnable = true;
RadiometerSerial.DataReceived += new SerialDataReceivedEventHandler(RadiometerSerial_DataReceived);
inputForm.Invoke(DataReceived);
}
,並在csRadiometerILT1700類中聲明
public event Delegate DataReceived;
。但是這給了我「數據接收必須是委託類型」的錯誤。我現在如何解決這個問題?我在正確的軌道上嗎?
請勿從ctor中調用。以下是設置事件的鏈接:http://stackoverflow.com/questions/2448487/how-to-dispatch-events-in-c/2448530#2448530 –
當收到有意義的數據時,您的課程應該提高其事件。將它打包成一個EventArgs派生類。表單訂閱(+ =)並在其處理程序中調用。 –