Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用线程读取com端口#_C#_Multithreading_Serial Port - Fatal编程技术网

C# 在c中使用线程读取com端口#

C# 在c中使用线程读取com端口#,c#,multithreading,serial-port,C#,Multithreading,Serial Port,我想要一些关于线程的建议,因为我是新手。我在网上读了几篇关于线程的文章 我正在读取com端口数据。我希望使用线程,这样它将每5秒读取一次数据,并更新列表框上的数据。目前,正在读取所有数据。 我不知道从哪里开始 我应该从哪里开始放置线程代码?我使用的是Windows窗体,c#VS2008 以下是我从com端口读取数据的代码: void datareceived(object sender, SerialDataReceivedEventArgs e) {

我想要一些关于线程的建议,因为我是新手。我在网上读了几篇关于线程的文章

我正在读取com端口数据。我希望使用线程,这样它将每5秒读取一次数据,并更新列表框上的数据。目前,正在读取所有数据。 我不知道从哪里开始

我应该从哪里开始放置线程代码?我使用的是Windows窗体,c#VS2008

以下是我从com端口读取数据的代码:

    void datareceived(object sender, SerialDataReceivedEventArgs e)
    {            
        myDelegate d = new myDelegate(update);
        listBox1.Invoke(d, new object[] { });

    }


    public void update()
    {           

        while (serialPortN.BytesToRead > 0)
            bBuffer.Add((byte)serialPortN.ReadByte());
        ProcessBuffer(bBuffer);

    }

    private void ProcessBuffer(List<byte> bBuffer)
    {            

        int numberOfBytesToRead = 125;

        if (bBuffer.Count >= numberOfBytesToRead)
        {            


                listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + "  " + " HR: " + (bBuffer[103].ToString()));


            // Remove the bytes read from the list
            bBuffer.RemoveRange(0, numberOfBytesToRead);

        }

    }        
void datareceived(对象发送方,SerialDataReceivedEventArgs e)
{            
myDelegate d=新的myDelegate(更新);
调用(d,新对象[]{});
}
公共无效更新()
{           
while(serialPortN.BytesToRead>0)
bBuffer.Add((字节)serialPortN.ReadByte());
进程缓冲区(bBuffer);
}
私有void ProcessBuffer(列表bBuffer)
{            
int numberOfBytesToRead=125;
如果(bBuffer.Count>=numberOfBytesToRead)
{            
listBox1.Items.Add(“SP:+(bBuffer[43].ToString())+”“+”HR:+(bBuffer[103].ToString());
//从列表中删除读取的字节
b缓冲区移除范围(0,编号为BYTESTOREAD);
}
}        

谢谢大家

为什么不使用计时器呢?将其放入适当形式的InitializeComponent方法中

using System.Timers;

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.Text = "Form1";

    Timer timer = new Timer();

    timer.Interval = 5000;
    timer.Elapsed += new ElapsedEventHandler(TimerElapsed);

    //timer.Enabled = true; // you may need this, but probably not if you are calling the start method.
    timer.Start();
}

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    // put your code here to read the COM port
}
此代码唯一的另一个问题是,您将得到一个无效的异常跨线程操作

您必须像这样修改代码

private void ProcessBuffer(List<byte> bBuffer)
{
    int numberOfBytesToRead = 125;

    if (bBuffer.Count >= numberOfBytesToRead)
    {
        this.Invoke(new Action(() =>
        {
            listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + "  " + " HR: " + (bBuffer[103].ToString()));
        });

        // Remove the bytes read from the list
        bBuffer.RemoveRange(0, numberOfBytesToRead);
    }
}
它调用ProcessBuffer方法没有意义,因为缓冲区从哪里来

如果我没有走上正确的道路,也许可以扩展您的代码示例,我很乐意提供更多帮助


请注意我对您的代码所做的一些样式更改(请随意选择或保留),C#中的方法应该以大写字母开头,调用变量bBuffer在C#中不是标准的。另一点是,如果只从类内调用该方法,则应将其设置为私有。

嗨,彼得,谢谢你的回答。对于读取com端口数据,我在按钮单击事件下插入了数据。我是否应该将按钮单击事件处理程序放在无效计时器下?谢谢我不是百分之百的跟随。您在按钮单击事件下插入数据是什么意思?插入什么数据?如果您想知道是否可以在代码文件中的void timerecursed之后放置按钮单击事件处理程序,则可以。对不起,Peter,我的意思是,在timer appeased方法中,我可以插入进程缓冲区编码吗?由于处理数据的进程缓冲区方法。是否要从“TimeRecursed”方法中调用“update”方法?这取决于bBuffer来自哪里?我不清楚您每5秒想要做什么,从端口读取,或者更新GUI。我会更新上面的答案。嗨,彼得,谢谢你的回复。我想每5秒读一次com端口。我尝试调用update()方法,但列表框一直在读取com端口。它不是每5秒读取一次。目前,我正在使用你的代码。但是计时器不是每5秒一次。。再次感谢。
void TimerElapsed(object sender, ElapsedEventArgs e)
{
    Update();
}

public void Update()
{
    while (serialPortN.BytesToRead > 0)
        buffer.Add((byte)serialPortN.ReadByte());
    ProcessBuffer(buffer);
}