这是一个使用C++的嵌入式解决方案,我读取手机屏幕上亮度的变化,从非常亮(白)到暗(黑)。
使用JavaScript和very 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上,时钟非常精确。

我可以使用第二个传感器来读取屏幕的不同部分作为时钟,在这种情况下,即使监视器或浏览器“决定”走得更快或更慢,我的系统只会在有时钟信号时读取(this is a similar application是滑动传感器而不是按我需要的方式轻拍屏幕),但这需要更复杂的硬件系统,在搜索软件解决方案之前,我不想让事情变得复杂。
我不需要很高的速度,我试图发送的数据只有8个字节那么多。
发布于 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位字节。
发布于 2013-12-15 04:27:13
您可以考虑不使用固定速率编码,其中每个位都表示为相同长度的序列,而使用可变速率编码:
Time: 0 1 2 3 4
0: _/▔\_
1: _/▔▔▔▔▔\_这意味着在解码时,你所需要做的就是测量屏幕亮起的时间。短脉冲是0,长脉冲是1。可悲的是,它的效率很低,但不需要精确的时钟,并且应该相对抵抗不准确的计时。通过在字节之间使用一些同步脉冲(例如,010序列),您可以自动检测脉冲的长度,因此最终根本不需要固定的时钟。
https://stackoverflow.com/questions/20586378
复制相似问题