串行通信协议设计问题

时间:2013-12-14 17:48:08

标签: c++ serial-port protocols

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

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

    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上,时钟非常精确。

enter image description here

我可以使用第二个传感器将屏幕的不同部分作为时钟读取,在这种情况下,即使显示器或浏览器“决定”更快或更慢,我的系统只会在有时钟信号时读取(this is a similar application他们刷传感器而不是按照我的需要制作屏幕,但这需要更复杂的硬件系统,我不想在搜索软件解决方案之前使事情复杂化。

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

2 个答案:

答案 0 :(得分:1)

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

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

a:发送时,预先计算每个'比特'所需的'开始发送时间',并根据当前时间与所需时间的关系,在每个比特被'发送'后修改延迟。这意味着你将避免累积误差(即如果比特1稍晚发送,第2比特的延迟将减少以补偿),而不是每比特延迟一个恒定的N微秒。

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

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

答案 1 :(得分:1)

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

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

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