utf8格式的文本文档
utf8格式的文本文档以0xEFBBBF开头, 后面才是正式文本, 千万别搞错了.
utf8格式的文本文档以0xEFBBBF开头, 后面才是正式文本, 千万别搞错了.
乐鑫官方的ESPtool是python版本的, 也就是esptool.py, 不过发现arduino上面ESP兼容版用的ESPtool是一个exe版本,找了一下,发现是github上的esptool-ck
这儿放几个用法: 从app.elf转app_00000.bin, app_40000.bin.4M flash空间.
esptool -bz 4M -eo app.elf -bo app_00000.bin -bs .text -bs .data -bs .rodata -bc -ec -eo app.elf -es .irom0.text app_40000.bin -ec
上传固件到COM5, 波特率115200, 手动重启方式上传.
esptool -cp COM5 -cd none -cb 115200 -ca 0x00000 -cf 00000.bin -ca 0x40000 -cf 40000.bin
也可以这样
esptool -cp COM5 -cf 00000.bin -ca 0x40000 -cf 40000.bin
清空NodeMCU的Flash
esptool -cp /dev/ttyUSB0 -cd nodemcu -ce
上传固件到espduino/nodemcu,带比较详细一点儿的输出
esptool.exe -vv -cd nodemcu -cb 921600 -cp COM13 -ca 0x00000 -cf ./nh_fixed.bin
通常要将一个数组复制,或者与另一些值连接在一起,会使用concat
a = [1,2,3]
b = a.concat() //1,2,3
c = a.concat(4,5,6) //1,2,3,4,5,6
现在有更优雅的方式: 三个点展开数组
d = [...a, 7,8,9] //1,2,3,7,8,9
在数组内使用...可以展开另一个数组, 就好像是吧这个数组的方括号[]给去掉了一样
另外, function的成员 arguments不是真正的数组, 它没有Push/pop这些方法,但有...方法. 要转换为真正的数组,可以的方法有:
arr1 = [...arguments]
arr2 = Array.from(arguments)
哦,这儿说的是比较常规的方式.
改自己密码当然是
passwd
然后输入旧密码, 新密码x2.
如果你有sudo权限,可以试着这样修改root密码:
sudo passwd root
这时候rmdir无论如何都是用不了的, 使用
rm -rf 目录名
虽然我习惯用mlocate,不过这个命令太高级不通用,有的linux上没装,有的linux上没有(openwrt)
所以还是用find吧
find / -name ps
find / -iname *ps
这个意思是在根目录/及其子目录下查找ps命令,额,大多数情况这样就够了
后面一条命令的意思是忽略大小写, 查找以ps结尾的文件名.
递增循环, 是start, end, step...好吧, 基本还是跟C一样,C是start, condition, cmd
枚举循环,有个ipairs/pairs是什么鬼?
for i = 0,10,1 do
-- something cmd
end
a = {'a','b','c'}
o = {x=1,y=2}
for k,v in ipairs(a) do
-- some code
end
for k,v in pairs(a) do
--some code
end
原来是不同的迭代器:迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的
(string.gmatch)等等
ipairs和pairs什么区别?ipairs从1开始遍历,每次递增1,也就是1/2/3/4...,遇到没有了就停止遍历。pairs遍历所有的key。
简单好用又开源! 下载地址
arduino在中断回调中执行的程序, 确实是无法使用delay的, delay似乎就失效了.
所以中断还是应该尽快返回, 在主程序逻辑中执行. 较长的逻辑可以通过设置标志位, 在主程序中进行检测并执行, 执行完后清除标志位即可.
如果是设置标志位的方式, 在主程序运行中, 新的中断当然会不断地重设标志位, 然而在主程序运行后将清除标志位 , 因此不会重复执行任务.
如果无论主程序是否在执行 ,每次中断任务都需要被完整执行的话, 则可以用计数器替代标志位, 中断时计数器+1, 执行一次再-1, 直到计数器为0时停止执行.
Arduino串口发送注意, 在发送结束后要调用flush, 尤其是在休眠以前, 否则可能发不完哦!
原文: node.js程序注册为windows服务
但不幸的是,这个方法在win7和win10上已经失效了...
新的程序是Installutil.exe和sc.exe
参考msdn上的问答
Installutil的介绍
sc的介绍
仿真一般都用Proteus, 原理图到PCB都能搞定;
MCU这么几个系列:
C51, 开发环境Keil for C51. 著名开发公司Atmel, 还有国内的STC.
MSP430, TI公司的, 主流两个, 一个是TI自己的CCS编译环境, 另一个是IAR Embedded Workbench for MSP430
AVR, Atmel的芯片, 自家的编译环境有Atmel Studio/toolchain, v5版本以前叫做AVR studio.
ARM, 一般是Keil For MDK. STM32也是基于ARM的Cortex M3的.
STM8, 一般是IVR for STM8, ST公司自家的STVD也可以
PIC, Microchip公司,用 MPLAB X IDE
如果用Vue属性做v-for的话, 注意它不能检测对象属性的直接增删, 而是要用Vue.set来增删对象属性.
另外, 在v-for场景下, 数组可以很方便的只显示部分或者做过滤/排序等, 对象就不行了. 所以使用v-for尽量将数据类型设计为数组.
vue-router默认是需要将项目放在服务器的根目录下的, 在浏览器里输入域名是这样:
http://mydomain.com/
vue怎么确认去服务器取数据还是在本地取数据呢? 其实借助的是井号"#", 井号在url中指向的是自己, 而不会去服务器取数据. 如下url, 是在根目录下的vue应用中, 也就是在vue-router中被导航.
http://mydomain.com/#/login
而如下url,将会到服务器上去取数据
http://mydomain.com/login
但如果要放置在子目录下呢, vue应用放在productinfo目录中:
http://mydomain.com/productinfo/#/login
需要两步:
1. 需要配置 router的config:
const RouterConfig = {
base: 'productinfo'
};
const router = new VueRouter(RouterConfig);
vue-router一般都是用vue-cli或者webpack, 做多个文件打包的, 也就是运行:
npm run build
可以打包app. 当然, package.json中需要有对应的build配置, 如下:
"scripts": {
"build": "webpack --progress --hide-modules --config webpack.prod.config.js",
},
那么在webpack.prod.config.js中, 也需要配置路径, 否则默认应用的打包文件就会出错.
以前是
output: {
publicPath: '/dist/',
},
现在改为:
output: {
publicPath: '/productinfo/dist/',
},
重新打包npm run build就好了.
附webpack.prod.config.js完整文件:
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const fs = require('fs');
fs.open('./src/config/env.js', 'w', function(err, fd) {
const buf = 'export default "production";';
fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {});
});
module.exports = merge(webpackBaseConfig, {
output: {
publicPath: '/productinfo/dist/',
filename: '[name].[hash].js',
chunkFilename: '[name].[hash].chunk.js'
},
plugins: [
new ExtractTextPlugin({
filename: '[name].[hash].css',
allChunks: true
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendors',
filename: 'vendors.[hash].js'
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new HtmlWebpackPlugin({
filename: '../index_prod.html',
template: './src/template/index.ejs',
inject: false
})
]
});
超微型接口, 一般是IPX/IPEX/IPAX/AMC/UMCC/MHF/Hirose H.FL... 哦, 真搞不清楚这么个接口居然有如此之多的名字... 这是日本公司Hirose的专利接口, 不过用的实在是太多了...
尺寸上似乎有多种类型. 淘宝常见的似乎是331.5MM的. 阻抗50Ω.传输频率 0~6GHz.
普通结构, 一般是SMA, 是SubMiniature version A的简称, 传输频率 0~18GHz, 阻抗50Ω.直径约6mm.
SMA容易和F头(F connector)混淆. F头阻抗75Ω,直径9.5mm. 典型传输频率0~0.75GHz. 不过到2.2GHz似乎也没有问题.
Q9/BNC接口也常用于接天线.
TNC(Threaded Neill–Concelman)接头, 是BNC接头的螺纹版. 50Ω/0~11GHz. 微波段比BNC表现好. 公口1.5厘米,母口1厘米.
N接头(N Connector), 0~11GHz,有50Ω和75Ω版本. 公口直径有2.03厘米, 母口直径有1.57厘米, 是比较大的接口.
其他:
1. J一般表示公头, K表示母头.
2. SMA和TNC都有RP版. RP是Reverse Polarity的简称,即"反极性".
* 正常版内螺纹端(公头)有针, 外螺纹端(母头)无针.
* RP版的内螺纹端无针, 外螺纹端有针.
pug与stylus虽然看起来写起来都很简洁,然而由于像sublime text这样的编辑器已经对html自动补全支持得很好了, pug和stylus在还没有自动补全的时候, 书写效率未必比原生html和css更快
pug示例:
div.className1.className2(style='font-size:37px') test ok!
stylus示例
.className1
color: green
.className2
background-color: red