【问题标题】:Serial communication protocol design issues串行通信协议设计问题
【发布时间】:2014-01-02 09:28:56
【问题描述】:

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

使用 JavaScript 和一个非常 simple script 我以 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 个字节。

【问题讨论】:

  • 你能不能改变你的系统,这样你就可以在一半的屏幕上显示带有数据的分割背景,在另一半的屏幕上显示时钟?您需要两个传感器,但您可以让浏览器控制时钟,因此计时本来应该很容易做到......

标签: c++ serial-port protocols


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您可能会考虑不使用固定速率编码,其中每个位都表示为相同长度的序列,而是使用可变速率编码:

    Time:  0 1 2 3 4
    0:     _/▔\_
    1:     _/▔▔▔▔▔\_
    

    这意味着在解码时,您需要做的就是测量屏幕点亮的时间。短脉冲为 0,长脉冲为 1。它的效率非常低,但不需要准确的时钟,并且应该相对抵抗不准确的时序。通过在字节之间使用一些同步脉冲(例如,010 序列),您可以自动检测脉冲的长度,因此最终根本不需要固定时钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多