C# I²C 发送器线程通过接线Pi



我试图使用工作列表执行I²C发送工作线程。

我将I²C命令保存在ConCurrentQueue中,并尝试通过布线Pi Libary发送它

我是线程和队列的新手,这就是为什么我不知道如何以正确的方式做到这一点。

我试过这个,但它根本不起作用:D

如果有人能看看这个并告诉我我做错了什么,那就太好了。

class worker
{
    public bool enabled = false;
    public struct i2c_command
    {
        public int chip_number;
        public byte subadress;
        public byte data;
    }
    private ConcurrentQueue<i2c_command> i2c_commandsList = new ConcurrentQueue<i2c_command>();
    public void write_i2c(int cn, byte sa, byte data)
    {
        i2c_command i2c_c = new i2c_command();
        i2c_c.chip_number = cn;
        i2c_c.subadress = sa;
        i2c_c.data = data;
        i2c_commandsList.Enqueue(i2c_c);
    }
    public void i2c_worker()
    {
        enabled = true;
        while (enabled = true)
        {
            i2c_command i2c_send = new i2c_command();
            i2c_commandsList.TryDequeue(out i2c_send);
            WiringPi.I2C.wiringPiI2CWriteReg8(i2c_send.chip_number, i2c_send.subadress, i2c_send.data);
        }
    }
}

这是启动线程:

worker worker = new worker();
ThreadStart i2c_sender_ref = new ThreadStart(worker.i2c_worker);
Thread i2c_sender = new Thread(i2c_sender_ref);
i2c_sender.Start();
首先,

您不会检查是否从队列中获取命令 - 您的代码需要更像这样:

public void i2c_worker()
{
    enabled = true;
    while (enabled)
    {
        i2c_command i2c_send;
        if (i2c_commandsList.TryDequeue(out i2c_send))
            WiringPi.I2C.wiringPiI2CWriteReg8(i2c_send.chip_number, i2c_send.subadress, i2c_send.data);
    }
}

最新更新