2

C#でシリアルポートを開いているときにこの問題が発生しています(これは単純なはずです;またはそう思いました)。

シリアル ポートを開こうとすると、次の例外が発生します。

セマフォのタイムアウト期間が過ぎました。

これを行っているメソッドは次のとおりです。

public static void Open_TheActivePortWeWillUse(String Drone_StringNameFromUser)
{
    var TempSerialPort = new SerialPort (
        Drone_StringNameFromUser, 
        (int) SerialPortParameter.TheSerialPortSpeed);

    // Now we have a name that anybody can see and use
    OurSpecificPorts.TheActivePortWeAreUsing = TempSerialPort;      
    // We'll do 8-N-1 since almost the whole planet does that
    OurSpecificPorts.TheActivePortWeAreUsing.DataBits = 8;  
    // We'll do 8-N-1
    OurSpecificPorts.TheActivePortWeAreUsing.Parity = Parity.None;    
    // We'll do 8-N-1
    OurSpecificPorts.TheActivePortWeAreUsing.StopBits = StopBits.One;    

    OurSpecificPorts.TheActivePortWeAreUsing.DataReceived +=    
        OurBackGroundSerialPortReceiver;
    // We can now open our active port, which is what this line does
    OurSpecificPorts.TheActivePortWeAreUsing.Open();      
}

私にとって最も奇妙なことは、このエラーが一貫していないことです。半分の時間は正常に機能し、残りの半分は機能しません

私のコードに明らかに問題がある人はいますか? 何か不足していますか?

4

1 に答える 1

2

メソッド内で SerialPort オブジェクトを宣言すると、メソッドが閉じた後にアクセスできなくなります。ポートを開くために機能する方法は次のとおりです。

  private void OpenSerialPort(String portName)
    {
        try
        {
            serialPort1.Close();
            serialPort1.PortName = portName;
            serialPort1.BaudRate = 115200;
            serialPort1.DataBits = 8;
            serialPort1.Handshake = Handshake.None;
            serialPort1.Parity = Parity.None;
            serialPort1.RtsEnable = false;
            serialPort1.StopBits = StopBits.One;

            serialPort1.Open();

        }
        catch (Exception ex)
        {
            MessageBox.Show("Could not open serial port " + portName, "Error");
        }
    }

SerialPort オブジェクトはクラスで宣言されています。

namespace Arcadia
{
    public partial class Form1 : Form
    {
        private SerialPort serialPort1;

そして、コンストラクターにコールバックが追加されます。

    public Form1()
    {
        InitializeComponent();

        serialPort1.DataReceived += new SerialDataReceivedEventHandler(this.SerialPortReadCallback);

データの送信は別の方法で処理されます。

    private void SerialPortWrite(String writeString)
    {
        if (serialPort1.IsOpen)
        {
            serialPort1.WriteLine(writeString);
        }
    }

受信したデータのコールバックは次のとおりです。

    private void SerialPortReadCallback(object sender, SerialDataReceivedEventArgs args)
    {
        try
        {

            while (serialPort1.BytesToRead > 0)
            {
                // Do something with the data

            }
        }
        catch (Exception ex)
        {
        }
    }
于 2012-12-20T20:53:03.303 に答える