0

ハードウェアでシリアル プロトコルをセットアップするために、ComboBox、TextBox、および 2 つのボタンを備えた単純な Windows フォームを作成しました。

ただし、何かを送信するたびに、ハードウェアから返信がありますが、C# では表示されません。代わりに、操作がタイムアウトしたという例外が発生します。オシロスコープを使用して、何かを受信したかどうかを確認したところ、陽性でした. しかし、C# は前述のようにコードを表示しません。

以下にコードを添付します。どんな助けでも大歓迎です。前もって感謝します。

public partial class Form3 : Form
{
    string buffer;
    public SerialPort myComPort = new SerialPort();
    delegate void setTextCallback(string text);


    public Form3()
    {
        InitializeComponent();
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        try
        {
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher("root\\CIMV2",
                "SELECT * FROM Win32_PnPEntity");

            foreach (ManagementObject queryObj in searcher.Get())
            {
                if (queryObj["Caption"].ToString().Contains("(COM"))
                {

                    comboBox1.Items.Add(queryObj["Caption"]);
                }
            }
            comboBox1.Text = comboBox1.Items[0].ToString();
        }
        catch (ManagementException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void setText(string text)
    {
        if (textBox1.InvokeRequired)
        {
            setTextCallback tcb = new setTextCallback(setText);
            this.Invoke(tcb, new object[] { text });
        }
        else
        {
            textBox1.Text = text;
        }
    }

    void myComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            string myString = myComPort.ReadLine();
            setText(myString);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        myComPort.Close();

          //  button1.Enabled = false;
            string name = comboBox1.Text;
            string[] words = name.Split('(', ')');
            myComPort.PortName = words[1];
            myComPort.ReadTimeout = 5000;
           // myComPort.WriteTimeout = 500;
            myComPort.BaudRate = 9600;
            myComPort.DataBits = 8;
            myComPort.StopBits = StopBits.One;
            myComPort.Parity = Parity.None;
            myComPort.DataReceived += new SerialDataReceivedEventHandler(myComPort_DataReceived);

            myComPort.Open();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        myComPort.WriteLine("?GV1\r");   
    }
}
4

2 に答える 2

0

それは言う

...DataReceived イベントは、受信したすべてのバイトに対して発生するとは限りません...

次のようなものを試してください:

    private static void DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // prevent error with closed port to appears
        if (!_port.IsOpen)
            return;
        // read data
        if (_port.BytesToRead >= 1)
        {
            // ...
            // read data into a buffer _port.ReadByte()

            DataReceived(sender, e);
        }

        // ...
        // if buffer contains data, process them
    }
于 2013-02-15T10:15:12.147 に答える
0

この URL を見てください:

http://csharp.simpleserial.com/

WMI の次の URL:

http://www.codeproject.com/Articles/32330/A-Useful-WMI-Tool-How-To-Find-USB-to-Serial-Adapto

于 2013-02-15T10:18:19.163 に答える