终端输入make menuconfig 出现以下错误
原来是ubuntu系统没有ncurses这个库。
解决方法:
sudo apt-get install ncurses-dev
那么ncurses这个库到底是什么东东,起什么作用呢?带着疑问百度了一下。
curses构成了一个工作在底层终端代码之上的封装,并向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了移动光标,建立窗口,产生颜色,处理鼠标操作等功能。使程序员编写应用程序不需要关心那些底层的终端操作。
模拟信号的隔离是非常头疼的,有时候不得不需要隔离。大部分基于以下需要:
1.隔离干扰源;
2.分隔高电压。
隔离数字信号的办法很多,隔离模拟信号的办法却没有想象的那么多,关键是隔离的成本,比想象的都要高出许多。特别是要求精确测量的场合,模拟信号的隔离,成本高得更加是离谱的无法想象。我从事这种系统开发多年,对自己所知道的隔离方法做个小小的总结:
数字隔离方法:
1. 光耦;
2. ADI 的磁隔离芯片,ADuMXXXX(XXXX为数字代号,如 I2C的ADuM1250);
3.自己用变压器隔离。
数字隔离办法,一般实现的都是单向数字信号的隔离,对于双向数字信号,需要两个隔离单元来实现,体积非常的惊人;很难减小体积。相对于速度很成本,如果速度小于100KHz一下,个人推荐用Ps2501这样的常用光耦隔离数字信号,很好的性价比,隔离度也非常的高。一般Ps2501这样的光耦隔离度都在3000V/RMS以上。
但是如果隔离数字信号的频率在200KHz以上,用Ps2501这样的光耦就不行了,要换高速的数字光耦,价格成本也上去了,不划算了。所以可采用ADI的磁隔离芯片。最便宜的磁隔离芯片每通道的价格在$0.7,算下来人民币也才4~5块人民币,选在6N137、6N136这样的高速光耦,已经没有性价比可言,浪费大量的PCB空间用于隔离部分。成本在4块左右,甚至更高,主要看你的6N137的采购量。但ADuM系列的磁隔离芯片的尺寸小很多很多,价格相比也很有优势。唯一美中不足的是磁隔离芯片的隔离电压只能到1000V左右,这个是个很头疼的问题。如果只是隔离干扰源,自然没问题,如果是隔离高电压,那么要仔细考量一下设计了。
自己用隔离变压器来隔离的办法,一般人是用不到的,因为完全没有经济效益。它只有一点好处,就是隔离电压可做得非常高,一般只有变频器、逆变器等IGBT的驱动,需要隔离非常大的电压,超过5000V;才使用。因为一般的芯片和光耦都实现不了了。
模拟信号的隔离:
1.线性光耦;
2. 隔离放大器 ;
3.频压转换和压频转换+数字隔离;
4.飞电容;
5.采用DA/AD+数字隔离的办法实现模拟信号的采样复原,进而实现隔离的办法;
6.普通光耦实现的线性隔离。
线性光耦,做过隔离的朋友都知道。如以前的TIL300,不过好像已经不生产了。可以选择Vishy的IL300作为替代。作为一般模拟信号的线性隔离,是个不错的选择。(我就不上传图了),一般来讲,线性光耦需要两个运放和一些高精度电阻组成合适的电路才能完成信号的隔离。也只是单向隔离。 IL300的价格在十几块钱人民币左右,如果想得到比较好的温度特性,需要两个比较好的运放,所以整个隔离下来的成本在每路:30RMB/Ch, 隔离的频率在200kHz左右。线性度其实并不理想,0.1%的精度都比较难保证;但手册上写着可以到0.01%的伺服精度。实际上,因为温度的影响,线性度在+/-0.5%,所以有更高隔离线性度的童鞋们就不能选择这种办法了。但对于大多数场合都是可以的;
隔离放大器,这个是个终极的宝贝啊,有很多厂家都有, 中国小厂一堆生产这种东西的。线性度都能达到0.1%,比较上档次的是Ti和ADI的隔离放大器,这些东西的成本很高。Ti有一款号称是全球价格最低的隔离放大器,ISO124 。隔离放大器的话,性能稳定,线性度良好,大多数都能达到或远远超过0.1%,都能达到0.01%;但价格的话至少都在40RMB/Ch,ADI的就更加离谱了,大概能到40dollar/Ch,对于做一般工业产品的制造商来讲,实在是望而却步。
第三种方法和第五种方法大同小异,都是把模拟信号变为数字信号然后再隔离数字信号。数字信号再复原成模拟信号,所以,这也意味着这种电路复杂得很。但从隔离效果上讲,应该是一种比较合理的隔离方式。至少在成本和精度上,和隔离放大器最有一拼的。压频转换和频压转换都非常的贵,所以,这种器件不适合做低带宽信号的转换;压频和频压转换不需要单片机的参与,电路上更为简洁,可靠性也更高。如果使用AD/DA转换复原,需要单片机或者FPGA等控制电路的参与,从开发角度来说,需要比较多的精力。相对于频压转换的方法,比较罗嗦,复原的信号带宽和AD/DA的带宽有关。但选择合适的芯片和单片机,如cortex-M0的32位单片机,40MHz左右,几块钱人民币。配合合适的AD/DA,成本也能控制在30RMB/ch,但效果比IL300要好很多,主要是隔离的线性度可以有个非常好的保证。
飞电容,飞电容我没试过,但是飞电容也是个思路特殊的隔离方案。相对于其他的隔离方案,首先是不需要隔离电源;其次是电路简单。飞电容就是将模拟信号作为源,对一个合适的电容进行充电,充完电后,将飞电容切换到测量电路一边,与向飞电容充电的电路完全断开。电容对测量电路放电。测量电路测量出电容的电压。即实现了电压信号的隔离。这个电路的核心在于,切换电容,并控制切换时间。最好使用继电器,但普通的继电器寿命有限,这种玩法肯定就报废了。要使用湿簧继电器;湿簧继电器应该不是便宜的东西,这种方法我也没试过,但是理论上是完全可行的。只不过信号带宽是小得可怜。可能只有10Hz吧。
普通的光耦只是使用了特殊的思路,用另外一个光耦做第一个光耦的反馈和补偿,如下图。
这种方法呢,个人觉得隔离一般的信号还可以,因为没有Datasheet等保证,实际上大批量应用是很难保证一致性和稳定性的。只是应用于线性度要求非常不高的场合。成本在所有模拟信号隔离方案里应该是最低的,可以做到5块钱/ch以下。
Android中的自动完成文本框控件AutocompleteTextview是一个非常强大的控件,这个控件分为两部分,输入文本的EditTextView和用来显示更多信息的下拉列表控件ListView。 当用户输入一个字的时候,该控件会自动搜索与输入内容匹配的内容,并以列表项呈现。用户点击列表项,文本框自动填充选中的内容。
下午在使用这个控件的时候,在填充完美工给的贴图之后,属性 android:completionHint="最近搜索记录" 显得很难看, 如下图红框
查了一下控件的所有属性,可以使用android:completionHintView="@layout/completionhintview" 来代替android:completionHint="最近搜索记录" ,也就是自定义下拉菜单底部信息的样式。下面是我定义的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#343535"
android:gravity="left|center_vertical"
android:paddingLeft="5dp"
android:text="最近搜索记录"
android:textColor="#8c8c8c"
android:textSize="12sp" />
这个布局一定要这么写 ,否则你会遇到下面两个问题:
1.该布局已经有父布局错误
原因:该布局外部不得嵌套其他布局,如LinearLayout,RelativeLayout等。
2.找不到该控件布局,并且抛出空指针错误。
原因:布局中TextView的id必需为 @android:id/text1
所谓水有源,树有根。 下面我从源代码级别上来解释一下这些问题产生的原因。
首先来解释第二个问题:通过查看AutoCompleteTextView源代码,我发现这样一个私有函数。
private View getHintView(Context context) {
if (mHintText != null && mHintText.length() > 0) {
final TextView hintView = (TextView) LayoutInflater.from(context).inflate(
mHintResource, null).findViewById(com.android.internal.R.id.text1);
hintView.setText(mHintText);
hintView.setId(HINT_VIEW_ID);
return hintView;
} else {
return null;
}
}
谷歌童鞋没有写代码解释,但是大致的意思我们可以知道,这段代码的功能是获得我们自定义下拉框提示内容的布局,封装成一个View。
在寻找这个控件的时候,寻找控件的id被写死为 com.android.internal.R.id.text1 红色代码所示。所以我们在布局中的id只能设置成安卓内部控件id了。
这个确实让我有点摸不到头脑,如果不是看源代码,根本不知道为什么要这样。
再来解释第一个问题:
看到了getHintView这个函数,那么第一个问题也就迎刃而解了。因为android系统按照com.android.internal.R.id.text1 找到的这个控件,那么在向其他View添加这个控件的时候,这个控件是不允许有父布局存在的,否则你应该取得该控件的root布局的id,然后将它添加到其他View中去。
好了,两个问题都解释完了。不知道你看明白没有。
最终效果如图:
原文链接:http://www.67tgb.com/?p=489
欢迎访问:望月听涛
2楼liushuijinger昨天 22:08为何不发到首页尼Re: 9分钟前回复liushuijinger我发到首页啦1楼lidaasky昨天 22:02兵哥好