这是一个使用C++的嵌入式解决方案,可以读取手机屏幕的亮度变化,从非常亮(白色)到黑暗(黑色)。

使用JavaScript和非常simple script im以100毫秒的间隔将网页的背景从白色更改为黑色,并在我的亮度传感器上读取结果,正如预期的那样,浏览器的计时不是很精确,有时它的执行时间会少100ms,有时会少一些有时会有很大的偏差。

    var syncinterval = setInterval(function(){
        bytes = "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101";

        bit = bytes[i];
        output_bit(bit);

        i += 1;
        if(i > bytes.length) {
            clearInterval(syncinterval);

            i = 0;
            for (i=0; i < input.length; i++) {
                tbits = input[i].charCodeAt(0).toString(2);
                while (tbits.length < 8) tbits = '0' + tbits;
                bytes += tbits;
            }
            console.log(bytes);

        }
    }, sync_speed);

我的最初想法是,在了解浏览器的计时方式之前,是使用异步串行通信,其中有些人知道“字”来像RS232的起始位一样同步数据流,但是在RS232上,时钟非常精确。

我可以使用第二个传感器来读取屏幕的其他部分作为时钟,在这种情况下,即使监视器或浏览器“决定”运行得更快或更慢,我的系统也只能在存在时钟信号时读取(this is a similar application为他们滑动传感器而不是按我的要求滑动屏幕),但这需要更复杂的硬件系统,我想在寻找软件解决方案之前不要使事情复杂化。

我不需要高速,我试图发送的数据大约只有8字节。

最佳答案

对于任何类型的异步通信,您都依赖于发送器以固定的时间间隔发送新的“位”数据,而接收器则以相同(固定)的间隔对数据进行采样。如果浏览器的时间安排不准确,则只需降低比特率,直到其足够好为止。

您可以使用一些技巧来帮助您提高可靠性:-

a:在发送时,请预先计算每个“位”所需的“开始发送时间”,并根据当前时间与所需时间来修改“发送”每个位后的延迟。这意味着您将避免累积错误(即,如果向位1发送了一些“延迟”,则将减少到位2的延迟以进行补偿),而不是将恒定的每位N微秒延迟。

b:在接收时,必须对传入数据进行采样的速度要比预期的变化快得多。 (UART通常使用16倍的过采样),这意味着您可以与“起始位”(图中的从1到0的初始变化)重新同步,然后可以在其时间段的预期“中心”对每个位进行采样。

换句话说,如果您以1000us的间隔发送数据,则以〜62us的间隔采样数据,并且当您检测到“起始位”时,您等待500us将您置于时间段的中心,然后进行8次位采样以1000us的间隔形成一个8位字节。

关于c++ - 串行通讯协议(protocol)设计问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20586378/

10-09 01:34