0

ATmega8A から情報を受け取る GUI インターフェイスを開発しています。GUI からの以下のコードは、次のことを行う必要があります。

  • byte[] testヘッダーのチェック: ここでは、チェック対象のバイト配列 ( ) にデータを読み込んでいます。OxFF
  • の場合header == 0xFF、2 番目のバイト配列を読み取ります ( byte[] data)

以下のコードを参照してください。

今、私は次の問題を抱えています。たとえば 1 などの単純な数字を送信すると、その数字はtextBox1問題なく に表示されます。ただし、433 のような番号を送信しようとすると、常に 4 を受信し、33 は失われます。含まれているifステートメントが原因だと思いますが、そのデータが失われている理由を説明できません。

namespace RS232
{
   public partial class fclsRS232Tester : Form
   {
    string InputData = String.Empty;
    string initText = "waiting...";

    delegate void SetTextCallback(string text);

    public fclsRS232Tester()
    {
        InitializeComponent();

        // Nice methods to browse all available ports:
        string[] ports = SerialPort.GetPortNames();

        // Add all port names to the combo box:
        foreach (string port in ports)
        {
            cmbComSelect.Items.Add(port);
        }

        cmbBaud.Items.Add(2400);
        cmbBaud.Items.Add(9600);

        cmbComSelect.SelectedIndex = 0;
        cmbBaud.SelectedIndex = 1;

        button4.Enabled = false;
        textBox1.Text = initText;
        textBox2.Text = initText;

    }

    private void cmbComSelect_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (port.IsOpen) port.Close();
        port.PortName = cmbComSelect.SelectedItem.ToString();
        stsStatus.Text = port.PortName + ": 9600,8N1";

        // try to open the selected port:
        try
        {
            port.Open();
            button4.Enabled = true;
            textBox1.Clear();
            textBox2.Clear();
        }
        // give a message, if the port is not available:
        catch
        {
            MessageBox.Show("Serial port " + port.PortName + " cannot be opened!", "RS232      tester", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            cmbComSelect.SelectedText = "";
            stsStatus.Text = "Select serial port!";
        }
    }

    private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
    {
        int bytenumber;
        int bufferSize = port.BytesToRead;
        byte[] test = new byte[1];
        byte[] data = new byte[bufferSize];
        byte[] data2 = new byte[bufferSize];

        port.Read(test, 0, 1);

        if (test[0] == 0xFF)  //Receive X-andY- coordinates from MCU and plot the coordinates 
        {
            bytenumber = port.Read(data, 0, bufferSize);
            string info = System.Text.Encoding.ASCII.GetString(data);

            this.Invoke((MethodInvoker)delegate
            {
                this.txtIn.Text += info;                      
            }
        }
    }
}
4

2 に答える 2

0

この問題は、すべてのデータをバッファに格納することで解決されました。

private void port_DataReceived_1(オブジェクト送信者, SerialDataReceivedEventArgs e) { int bytenumber; バイト[] データ = 新しいバイト[10];

        bytenumber = port.Read(data, 0, 10);

        if (data[0] == 0xFF)
        {
        }
    }

于 2014-09-14T00:43:15.527 に答える
0

DataReceived ハンドラーは、受信バッファーでデータが利用可能になるたびに呼び出されます。そのため、バッファ内のすべてのデータを読み取り、次のデータ バーストが受信される前にヘッダーなどの有効性を処理します。新しいデータが受信されると、古いデータが上書きされ、データが失われます。あなたの場合、port.Read() への呼び出しで 1 バイトだけを読み取っています。それをport.Read(test, 0, bufferSize); に変更します。

さらに、データをバッファに保存し、データ処理を別のスレッドで実行するだけです。ハンドラーで過ごす時間が長いほど、データが失われる可能性が高くなります。

于 2014-09-07T09:34:25.217 に答える