问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

433频率可以用315频率的解码程序吗?两种频率的解码程序是一样的吗?

发布网友 发布时间:2022-04-07 09:43

我来回答

3个回答

懂视网 时间:2022-04-07 14:04

Workerman是一个高性能的socket服务器通讯框架,用于快速开发各种网络应用,包括tcp的、udp的、长连接、短连接应用。下面我们来介绍一下workerman定时器使用。

add

int WorkermanLibTimer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])

定时执行某个函数或者类方法

参数

time_interval:多长时间执行一次,单位秒,支持小数,可以精确到0.001,即精确到毫秒级别。

callback:回调函数注意:如果回调函数是类的方法,则方法必须是public属性

args:回调函数的参数,必须为数组,数组元素为参数值

persistent:是否是持久的,如果只想定时执行一次,则传递false(只执行一次的任务在执行完毕后会自动销毁,不必调用Timer::del())。默认是true,即一直定时执行。

返回值

返回一个整数,代表计时器的timerid,可以通过调用Timer::del($timerid)销毁这个计时器。

示例

1、定时函数为匿名函数(闭包)

use WorkermanWorker;
use WorkermanLibTimer;
require_once './Workerman/Autoloader.php';

$task = new Worker();
// 开启多少个进程运行定时任务,注意多进程并发问题
$task->count = 1;
$task->onWorkerStart = function($task)
{
 // 每2.5秒执行一次
 $time_interval = 2.5;
 Timer::add($time_interval, function()
 {
 echo "task run
";
 });
};

// 运行worker
Worker::runAll();

2、定时函数为普通函数

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

// 普通的函数
function send_mail($to, $content)
{
 echo "send mail ...
";
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 $to = 'workerman@workerman.net';
 $content = 'hello workerman';
 // 10秒后执行发送邮件任务,最后一个参数传递false,表示只运行一次
 Timer::add(10, 'send_mail', array($to, $content), false);
};

// 运行worker
Worker::runAll();

3、定时函数为类的方法

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

class Mail
{
 // 注意,回调函数属性必须是public
 public function send($to, $content)
 {
 echo "send mail ...
";
 }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 // 10秒后发送一次邮件
 $mail = new Mail();
 $to = 'workerman@workerman.net';
 $content = 'hello workerman';
 Timer::add(10, array($mail, 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

4、定时函数为类方法(类内部使用定时器)

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

class Mail
{
 // 注意,回调函数属性必须是public
 public function send($to, $content)
 {
 echo "send mail ...
";
 }

 public function sendLater($to, $content)
 {
 // 回调的方法属于当前的类,则回调数组第一个元素为$this
 Timer::add(10, array($this, 'send'), array($to, $content), false);
 }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 // 10秒后发送一次邮件
 $mail = new Mail();
 $to = 'workerman@workerman.net';
 $content = 'hello workerman';
 $mail->sendLater($to, $content);
};

// 运行worker
Worker::runAll();

5、定时函数为类的静态方法

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

class Mail
{
 // 注意这个是静态方法,回调函数属性也必须是public
 public static function send($to, $content)
 {
 echo "send mail ...
";
 }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 // 10秒后发送一次邮件
 $to = 'workerman@workerman.net';
 $content = 'hello workerman';
 // 定时调用类的静态方法
 Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

6、定时函数为类的静态方法(带命名空间)

namespace Task;
require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

class Mail
{
 // 注意这个是静态方法,回调函数属性也必须是public
 public static function send($to, $content)
 {
 echo "send mail ...
";
 }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 // 10秒后发送一次邮件
 $to = 'workerman@workerman.net';
 $content = 'hello workerman';
 // 定时调用带命名空间的类的静态方法
 Timer::add(10, array('TaskMail', 'send'), array($to, $content), false);
};

// 运行worker
Worker::runAll();

7、定时器中销毁当前定时器(use闭包方式传递$timer_id)

use WorkermanWorker;
use WorkermanLibTimer;
require_once './Workerman/Autoloader.php';

$task = new Worker();
$task->onWorkerStart = function($task)
{
 // 计数
 $count = 1;
 // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
 $timer_id = Timer::add(1, function()use(&$timer_id, &$count)
 {
 echo "Timer run $count
";
 // 运行10次后销毁当前定时器
 if($count++ >= 10)
 {
  echo "Timer::del($timer_id)
";
  Timer::del($timer_id);
 }
 });
};

// 运行worker
Worker::runAll();

8、定时器中销毁当前定时器(参数方式传递$timer_id)

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

class Mail
{
 public function send($to, $content, $timer_id)
 {
 // 临时给当前对象添加一个count属性,记录定时器运行次数
 $this->count = empty($this->count) ? 1 : $this->count;
 // 运行10次后销毁当前定时器
 echo "send mail {$this->count}...
";
 if($this->count++ >= 10)
 {
  echo "Timer::del($timer_id)
";
  Timer::del($timer_id);
 }
 }
}

$task = new Worker();
$task->onWorkerStart = function($task)
{
 $mail = new Mail();
 // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
 $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};

// 运行worker
Worker::runAll();

9、只在指定进程中设置定时器

一个worker实例有4个进程,只在id编号为0的进程上设置定时器。

use WorkermanWorker;
use WorkermanLibTimer;
require_once './Workerman/Autoloader.php';

$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function($worker)
{
 // 只在id编号为0的进程上设置定时器,其它1、2、3号进程不设置定时器
 if($worker->id === 0)
 {
 Timer::add(1, function(){
  echo "4个worker进程,只在0号进程设置定时器
";
 });
 }
};
// 运行worker
Worker::runAll();

更多workerman知识请关注workerman教程栏目。

热心网友 时间:2022-04-07 11:12

一、 基本概念 工作频率:433.92MHz 调制方式:ASK/OOK,FSK,GFSK 现有遥控与接收器方案中,多数使用 ASK/OOK 调试方式。ASK 即“幅移键控”又称为“振幅键控”,也 有称为“开关键控”(通断键控)的,所以又记作 OOK(On-Off keyed)信号。ASK 是一种相对简单的 调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅 移就是把频率、相位作为常量,而把振幅作为变量,信息比特是通过载波的幅度来传递的。如下图所 示,ASK 调制方式的典型时域波形,虚线部分表示二进制的 0 和 1,红色实线部分表示调制信号:
二、 国家标准 标准可参考“信部无[2005]423 号 关于发布《微功率(短距离)无线电设备的技术要求》的通知”,要 求如下: (十一)各类民用设备的无线控制装置 不得用于无线控制玩具、模型等。 1.使用频率:314-316MHz,430-432MHz,433.00-434.79MHz 发射功率限值:10mW(e.r.p) 占用带宽:不大于 400kHz 三、 编码与解码 以遥控器为例,在明确调制方式后,需要为遥控器编码方式进行约定。一组遥控编码通常需要包含“引 导码/起始码”、“用户码” 、“数据码” 、 “结束码”、 “重复码”,格式如下:
确定编码组成后需要明确“逻辑 0” 、 “逻辑 1”的表示方法,可以遵循标准的编码方案,也可以进行自 定义。标准编码方案可以使用“曼彻斯特编码”等方案,在自定义编码方案时可以参考下图所示的编码 规则,主要是电平顺序与电平长度的组合。
以遥控的编码为例进行分析,得到如下编码波形:
假设: 高电平长码 + 低电平短码表示逻辑 1 高电平短码 + 低电平长码表示逻辑 0 可以得到该组数据为“0x88 0x03 0xBD 0xB6”。

解码过程是对编码过程的逆向,解码程序需要根据编码方案进行设计。竞品遥控器的解码方案请参考 “参考示例” 。 四、 参考示例 根据测得的遥控器编码波形可知,433MHz 接收端输出的信号中,电平维持时间有 20ms、9ms、1.6ms、 700us 这几种。使用 1.6ms 高电平 + 700us 低电平表示逻辑 1,700us 高电平 + 1.6ms 低电平表示逻辑 0,9ms 高电平表示引导/起始码,700us 高电平 + 20ms 低电平表示结束码,同时也表示“重复码“”的 起始。 程序设计中,对 700us 的电平进行检测并计数,要保证做够的容错能力,需要将定时器中断做到 100us 以下,甚至更小,显然使用定时器中断处理时不合理的。在本示例中,采用外部中断 + 定时器计数的 方式进行电平长度采样。外部中断采用上升沿和下降沿触发,在中断中根据当前电平切换边沿触发方 式。定时器使用系统时钟(16.6MHz)的 64 分频作为时钟源,具有足够的分辨率,可提高接收机的容错 能力。 数据采样逻辑中,下降沿时判断当前高电平表示的逻辑值,上升沿是对上一步中产生的逻辑值进行确 认,若逻辑值合法则对该逻辑值进行记录,若不合法,这舍弃该逻辑值,并初始化接收机,等待下一次 数据。程序流程图如下:
示例代码: 外部中断初始化为上升沿触发,当前电平 INT45Level 默认为低。 使用定时器 3 作为计数器
/*---------------定时器时钟使用系统频率 64 分频------------------*/
//1ms 计数 260 //实测引导码高电平长度为 9.7ms,低电平长度为 2ms
#define HeadCont_H 2540 //9.7ms
#define HeadCont_L 500 //2ms

//实测逻辑 1 为高电平 1.7ms+低电平 0.6ms
#define OneCode_H 450 //1.7ms
#define OneCode_L 160 //0.6ms
//假设 0 码为高电平 0.6ms+低电平 1.7ms
#define Zero_H 160
#define Zero_L 450
//容错范围
#define FaultTolerant 50
寄存器定义
uint16 T3Counter;
bit INT45Level = 0;
bit ZeroCode; //接收到逻辑 0
bit OneCode; //接收到逻辑 1
bit MaybeRemoteStart; //疑似接收到起始码
bit RemoteStart; //开始接收遥控数据
bit ReadOver; //接收完成
#define DefRemoteDataBufLen 10 //默认遥控数据长度
idata uint8 RemoteDataBuffer[DefRemoteDataBufLen]; //接收缓冲区
idata uint8 ReadTab[DefRemoteDataBufLen]; //已接收,待处理数据
idata uint8 ReadBitCont; //读取 Bit 计数
idata uint8 ReadBuffer; //数据缓存区
idata uint8 ReadByteCont; //读取字节计数

外部中断服务程序
void INT45_interrupt() interrupt 9
{
u8 backtemp;
backtemp = INSCON;
INSCON = 0x00;
if((EXF1&0x20) == 0x20)
{
//读取 T3 计数器
INSCON |= 0x40;
T3CON = 0x00;
T3Counter = 0x0000|(TH3 << 8);
T3Counter |= TL3;
TL3 = 0x00;
TH3 = 0x00;
T3CON = 0x24; //系统分频 1/64,启动定时器
INSCON &= ~0x40;
if(INT45Level) //处理下降沿
{
if((T3Counter > (HeadCont_H - FaultTolerant))&&(T3Counter < (HeadCont_H + FaultTolerant)))
{
MaybeRemoteStart = 1; //疑似遥控数据头
}
else
{
if((T3Counter> (OneCode_H - FaultTolerant))&&(T3Counter < (OneCode_H + FaultTolerant)))
{
OneCode = 1;
ZeroCode = 0;
}
else
{
if((T3Counter > (Zero_H - FaultTolerant))&&(T3Counter < (Zero_H + FaultTolerant)))
{
ZeroCode = 1;
OneCode = 0;
}
else
{
ZeroCode = 0;
OneCode = 0;
}
}
}
INT45Level = 0; //当前电平为低
EXF0 = 0x80; //设置为上升沿触发
}
else //处理上升沿
{
if(RemoteStart)
{
if((T3Counter >(OneCode_L - FaultTolerant))&&(T3Counter < (OneCode_L + FaultTolerant)))
{
if(OneCode)
{ //接收到一个 bit 为 1
GetOneByte();
}
else
{ //数据出错,丢弃
RemoteStart = 0;
OneCode = 0;
ZeroCode = 0;
ReadOver = 0;
}
}
else
{
if((T3Counter > (Zero_L - FaultTolerant))&&(T3Counter < (Zero_L + FaultTolerant)))
{
if(ZeroCode)
{ //接收到一个 bit 为 0
GetOneByte();
}
else
{ //数据出错,丢弃
RemoteStart = 0;
OneCode = 0;
ZeroCode = 0;
ReadOver = 0;
}
}
else
{
if(ZeroCode && (T3Counter > 4000)) //结束码,同时也是重复码的起始
{
ReadOver = 1;
OneCode = 0;
ZeroCode = 0;
RemoteStart = 0;
GetOneByte();
}
else
{ //干扰数据,接收器初始化
RemoteStart = 0;
OneCode = 0;
ZeroCode = 0;
ReadOver = 0;
}
}
}
}
else
{
if(MaybeRemoteStart)
{
if((T3Counter > (HeadCont_L - 20))&&(T3Counter < (HeadCont_L + 20)))
{
RemoteStart = 1; //遥控数据开始发送
ReadBitCont = 0; //读取 Bit 计数
ReadBuffer = 0; //数据缓存区
ReadByteCont = 0; //读取字节计数
ReadOver = 0;
MaybeRemoteStart = 0;
}
}
}
INT45Level = 1; //当前电平为高
EXF0 = 0x40; //设置为下降沿触发
}
}
EXF1 = 0x00;
INSCON = backtemp;
}

GetOneByte()子函数,接收完整字节并处理
void GetOneByte()
{
int i;
if(ReadBitCont<=7)
{
ReadBuffer <<= 1;
if(OneCode)
{
ReadBuffer |= 0x01;
}
}
ReadBitCont ++;
if(ReadBitCont >= 8)
{
RemoteDataBuffer[ReadByteCont++] = ReadBuffer; //每接收 1byte,写入缓存
ReadBuffer = 0;
ReadBitCont = 0;
}
if(ReadOver) //全部接收完后
{
for(i=0;i<ReadByteCont;i++)
{
ReadTab[i]=RemoteDataBuffer[i];
}
ReadByteCont = 0;
}
}

热心网友 时间:2022-04-07 12:30

国内最好使用430-440MZH段,如:433.92MHz是使用最普遍的,配套产品齐全。315MHz也可以,但使用的人太多,容易受干扰。868,915MHz不太适合用在国内,该频段主要用于民用手机市话通的收费设备。
无线通信中使用的频段只是电磁波频段中很小的一部分,定义了无线电波的频率范围。
为了合理使用频谱资源,保证各种行业和业务使用频谱资源时彼此之间不会干扰,国际电信联盟无线委员会(ITU-R)颁布了国际无线电规则,对各种业务和通信系统所使用的无线频段都进行了统一的频率范围规定。
这些频段的频率范围在各个国家和地区实际应用时会略有不同,但都必须在国际上规定的这些范围内。
按照国际无线电规则规定,现有的无线电通信共分成航空通信、航海通信、陆地通信、卫星通信、广播、电视、无线电导航,定位以及遥测、遥控、空间探索等50多种不同的业务,并对每种业务都规定了一定的频段。
扩展资料

在通讯领域中,频段指的是电磁波的频率范围,单位为Hz,按照频率的大小,可以分为:
甚低频(VLF)3 kHz~30 kHz,对应电磁波的波长为甚长波100 km~10 km。
低频(LF)30 kHz ~300 kHz,对应电磁波的波长为长波10 km~1 km。
中频(MF)300 kHz~3000 kHz,对应电磁波的波长为中波1000 m~100 m。
高频(HF)3 MHz~30 MHz,对应电磁波的波长为短波100 m~10 m。
甚高频(VHF)30 MHz~300 MHz,对应电磁波的波长为米波10 m~1 m。
特高频(UHF)300 MHz~3000 MHz,对应电磁波的波长为分米波100cm~10 cm。
超高频(SHF)3 GHz~30 GHz,对应电磁波的波长为厘米波10 cm~1 cm。
极高频(EHF)30 GHz~300 GHz,对应电磁波的波长为毫米波10 mm~1 mm。
至高频300 GHz~3000 GHz,,对应电磁波的波长为丝米波1 mm~0.1 mm。
参考资料来源:百度百科-频段
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
从焦作市到郑州快递一个羽毛球拍需用多少钱 iPhone X还能坚挺两年,升级到ios 15发热严重要靠红魔冰磁散热器 Peltier Module散热方式 一加18W冰点散热背夹-超强散热,极速降温 2015年春晚有哪些明星 新闻 如何评价央视主持人朱军?以及如何评价朱军所主持的《艺术 纯粮食白酒品牌大全,让你喝得放心(真正的纯粮食白酒有哪些品牌)_百度... ...工作单位要辞退并提出会给出相应赔偿,但合同马上到期,如到期后... ABC外语培训学校ABC教育集团总裁——刘成 abc是国产品牌吗?口碑如何? 躺床上四个小时睡不着怎么办? 不着觉躺了一两个小时也睡不着怎么办 躺着两个小时了就是睡不着咋办? 在床上躺了三个小时了,还是睡不着,怎么办? 五一班共有17幅书法作品参加学校的书法比赛,其中4幅作品从全校255幅参赛作品中获奖 当今书法展览都存在哪些问题? 躺床上5个小时睡不着 多参加书法大赛有什么好处,书法有前景吗 晚上躺在床上几个小时睡不着觉怎么办 书法绘画比赛评分标准 老是失眠,躺两三个小时都睡不着!该怎么办? 实验小学举办书法展,获奖的作品中有28幅不是五年级的,24幅不是六年级的,五、六年级参展作品共有20幅 书法大赛如何面试考核? 腾讯企业qq可以无限制发红包吗,uc发红包了,大家快领,下手要快 腾讯企业qq可以无限制发红包吗 腾讯QQ看点的企业红包能提现吗? 书法大赛的评分细则 求定值的方法 企业qq可以接收红包吗 云南户户通出现E04对不起该频道未受权是什么问题? 入睡困难,经常睡下2个小时还睡不着,请问怎么办 经常失眠,躺在床上好几个小时还是睡不着,请问这是怎么回事?应该怎么治疗呢? 失眠怎么办,难以入睡,躺在床上几个小时睡不着 我失眠了。躺在床上两个多小时睡不着。怎么办啊? 一天只是睡三个小时就睡不着了怎么办呢? 躺在床上一小时了还是睡不着怎么办 躺了3个小时可就是睡不着怎么办 每天很困躺在床上几个小时但是还是睡不着 理光spc261dn nfc打印功能怎么用 佳能打印机,打印一栏出现NFC是什么意思 理光G5打印机哪些实用的功能? ricoh打印机 nfc怎么用 理光 打印机 如何在局域网内共享打印 厦门宝岛之窗酒店管理有限公司怎么样? 东莞市温泉之窗商旅服务有限公司怎么样? 求自助游广州的详细方案 广州市欧陆商务酒店有限公司怎么样? 滚筒洗衣机洗涤档位是什么意思 小天鹅洗滚筒洗衣机,水位选择au,转速选择800。可以么?有没有详细参数表... 广州黄埔区有好点的商务酒店吗,可以约客户谈判的那种