首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串行通信协议设计问题

串行通信协议设计问题
EN

Stack Overflow用户
提问于 2013-12-15 01:48:08
回答 2查看 1.1K关注 1票数 2

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

使用JavaScript和very simple script即时消息以100毫秒的间隔将网页背景从白色更改为黑色,并在亮度传感器上读取结果,正如预期的那样,浏览器的计时不是很精确,有时做100毫秒,有时做得更少,有时做得更多,有时会有巨大的偏差。

代码语言:javascript
复制
    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个字节那么多。

EN

回答 2

Stack Overflow用户

发布于 2013-12-15 04:07:38

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

有几个技巧可以帮助你提高可靠性:

A:发送时,预先计算出每个“bit”所需的“开始发送时间”,并在每个bit‘发送’完毕后,根据当前时间与所需时间来修改延迟。这意味着您将避免累积错误(即,如果位1发送得稍有“延迟”,位2的延迟将减少以进行补偿),而不是每位延迟N微秒。

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

换句话说,如果你以1000us的间隔发送数据,你就以62us的间隔采样数据,当你检测到一个'start bit时,你等待500us把你放到时间周期的中心,然后以1000us的间隔采集8个单比特样本,形成一个8位字节。

票数 1
EN

Stack Overflow用户

发布于 2013-12-15 04:27:13

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

代码语言:javascript
复制
Time:  0 1 2 3 4
0:     _/▔\_
1:     _/▔▔▔▔▔\_

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20586378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档