【问题标题】:Windows IoT Raspberry Pi 3 C# RTC DS3231Windows IoT 树莓派 3 C# RTC DS3231
【发布时间】:2018-03-21 11:15:04
【问题描述】:

这篇文章可能与Windows IoT and DS3231 RTC clock 重复,但它似乎对我不起作用。我没有在这种环境中使用 i2c 的经验。

我的预期功能是,

  1. 在启动时检查是否有任何网络连接来更新系统时钟
  2. 如果离线系统将从DS3231读取datetime并更新 系统datetime
  3. datetimedatepicker 的任何更改或 timepicker 它将更新DS3231

我的问题是

  1. 如何检查网络可用性以更新系统时钟。
  2. DS3231阅读 分别使用i1cdevice.writeread 需要write read addressi2c 会自动读取所有数据直到收到stop 位还是我必须设置一个计数器?

    private const byte DS3231_I2C_WADDR = 0xD0;
    private const byte DS3231_I2C_RADDR = 0xD1;
    private I2cDevice DS3231_RTC; 
    
    byte[] i2CWriteBuffer;
    byte[] i2CReadBuffer;
    
    private async void Read_DS3231_RTC()
    {
        var settings = new I2cConnectionSettings(DS3231_I2C_RADDR);
        settings.BusSpeed = I2cBusSpeed.StandardMode;
        var controller = await I2cController.GetDefaultAsync();
        DS3231_RTC = controller.GetDevice(settings);
    
        try
        {
            DS3231_RTC.WriteRead(new byte[] { DS3231_I2C_RADDR }, i2CReadBuffer);
            }
        catch (Exception e)
        {
            StatusMessage.Text = "Fail to Init I2C:" + e.Message;
            return;
        }
    }
    
  3. 写信给DS3231dateicker & timepicker 用于时间设置 设置 datetime 后如何更新为 DS3231

    private void DatePicker_DateChanged(object sender, DatePickerValueChangedEventArgs e)
    {
        DateTimeSettings.SetSystemDateTime(e.NewDate.UtcDateTime);
        SetTime_DS3231();
    }
    
    private void TimePicker_TimeChanged(object sender, TimePickerValueChangedEventArgs e)
    {
        var currentDate = DateTime.Now.ToUniversalTime();
    
        var newDateTime = new DateTime(currentDate.Year,
                                       currentDate.Month,
                                       currentDate.Day,
                                       e.NewTime.Hours,
                                       e.NewTime.Minutes,
                                       e.NewTime.Seconds);
    
        DateTimeSettings.SetSystemDateTime(newDateTime);
    }
    

谢谢。

【问题讨论】:

    标签: c# uwp raspberry-pi3 windows-iot-core-10 real-time-clock


    【解决方案1】:

    1.如何检查网络可用性以更新系统时钟。

    您可以使用 NetworkInterface 类的 GetIsNetworkAvailable 方法来检查互联网是否连接。您可以通过此topic 了解有关如何在通用 Windows 平台中检查 Internet 连接类型的更多知识。

    bool isInternetConnected = NetworkInterface.GetIsNetworkAvailable();
    

    2.使用i1cdevice.writeread从DS3231读取需要单独写入读取地址? i2c会自动读取所有数据吗 直到收到停止位或我必须设置一个计数器?

    没有必要分开写读。 WriteRead 方法 执行原子操作,将数据写入设备所连接的内部集成电路 (I2 C) 总线,然后从其读取数据,并在写入和读取操作之间发送重启条件。第二个参数是要从 I2 C 总线读取数据的缓冲区。缓冲区的长度决定了从设备请求多少数据。它不会自动停止,直到收到停止位。如果 I2 C 设备在读取整个缓冲区之前否定确认数据传输,则会出现错误(错误代码0x8007045D)。

    3. 要写入 DS3231,有 dateicker 和 timepicker 用于在设置日期时间时设置时间我如何更新到 DS3231

    正如TRS在主题Windows IoT and DS3231 RTC clock 中回复的一样,他/她提供了设置时钟的方法。

    新更新:

        private async void SetTime_DS3231(DateTime dt)
        {
            int SlaveAddress = 0x68;
    
            try
            {
                // Initialize I2C
                var Settings = new I2cConnectionSettings(SlaveAddress);
                Settings.BusSpeed = I2cBusSpeed.StandardMode;
    
                if (AQS == null || DIS == null)
                {
                    AQS = I2cDevice.GetDeviceSelector("I2C1");
                    DIS = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(AQS);
                }
    
                using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
                {
                    byte write_seconds = decToBcd((byte)dt.Second);
                    byte write_minutes = decToBcd((byte)dt.Minute);
                    byte write_hours = decToBcd((byte)dt.Hour);
                    byte write_dayofweek = decToBcd((byte)dt.DayOfWeek);
                    byte write_day = decToBcd((byte)dt.Day);
                    byte write_month = decToBcd((byte)dt.Month);
                    byte write_year = decToBcd((byte)(dt.Year%100));
    
                    byte[] write_time = { 0x00, write_seconds, write_minutes, write_hours, write_dayofweek, write_day, write_month, write_year };
    
                    Device.Write(write_time);
    
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.Write(ex.Message);
            }
        }
    
        private static byte decToBcd(byte val)
        {
            return (byte)(((int)val / 10 * 16) + ((int)val % 10));
        }
    

    【讨论】:

    • 谢谢。对于Write,我如何应用该方法,因为它是using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
    • 我还有一个问题是,当我在TimePicker_TimeChanged 的末尾插入SetTime_DS3231(newDateTime) 和在DatePicker_DateChanged 的末尾插入SetTime_DS3231(e.NewDate.UtcDateTime) 时,我遇到了System.UnauthorizedAccessException: 'Access is denied. (Excep_FromHResult 0x80070005)'
    • 您需要在 Package.appxmanifest 中添加系统管理功能,因为 DateTimeSettings.SetSystemDateTime 需要权限。
    • 如果`if(isInternetConnected == true)`&系统时钟将通过物联网更新,我怎么知道time何时更新,以便我可以更新DS3231一旦系统时间通过网络更新。
    • 感谢分享代码。我已根据您的代码更新了我的回复,以便对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多